Sort WP_Query-> posts Array of Objects condicionalmente con diferentes encabezados

Tengo una serie de Objetos devueltos por WP_Query-> publicaciones

array 0 => object(WP_Post) public 'ID' public 'post_title' public 'post_content' 1 => object(WP_Post) public 'ID' public 'post_title' public 'post_content' 2 => object(WP_Post) public 'ID' public 'post_title' public 'post_content' 3 => object(WP_Post) public 'ID' public 'post_title' public 'post_content' 4 => object public 'Donor' public 'date' public 'post_content' 

Y continúa …… Estoy tratando de agrupar esto en el primer, segundo, tercer y cuarto trimestre según un metacampo de date ; el primer trimestre son los primeros tres meses (enero, febrero, marzo), el segundo trimestre serán los próximos tres y así sucesivamente y darán títulos, ‘Primer trimestre’, ‘Segundo trimestre’, etc.

Logré esto por

 

First Quarter

ID,'donor-date',true); $donor_month = date('m',strtotime($donor_date)); if(!in_array($donor_month,array('01','02','03'),true)) continue; ?>

Second Quarter

ID,'donor-date',true); $donor_month = date('m',strtotime($donor_date)); if(!in_array($donor_month,array('04','05','06'),true)) continue; ?>

y así sucesivamente … el problema con este enfoque es que los títulos (primer trimestre, segundo trimestre …) estarán allí incluso si no hay datos que cumplan con la condición dada. ¿Hay alguna manera de mostrar y ocultar condicionalmente los encabezados y un mejor método de clasificación (refactor) …….

Gracias por adelantado ……..

Deberá verificar los valores en la matriz antes de comenzar cualquier salida.

Sugiero que haga esto guardando los datos que se mostrarán en una matriz en lugar de imprimirlos inmediatamente. Además, suponiendo que $posts es igual en cada foreach , solo necesitará hacer un bucle una vez.

Ejemplo con instrucciones paso a paso en los comentarios

 ID,'donor-date',true); $donor_month = date('m',strtotime($donor_date)); /* format the date once - best practice is not to repeat code */ $formatteddate = date('d/m/Y',strtotime($donor_date)); /* organise the dates by quarter, using the heading as the key for easy display */ if(in_array($donor_month, array('01','02','03'))) $quarters["First Quarter"][] = $formatteddate; else if(in_array($donor_month, array('04','05','06'))) $quarters["Second Quarter"][] = $formatteddate; else if(in_array($donor_month, array('07','08','09'))) $quarters["Third Quarter"][] = $formatteddate; else if(in_array($donor_month, array('10','11','12'))) $quarters["Fourth Quarter"][] = $formatteddate; } /* now go through your array and display the results */ foreach ($quarters as $quartername => $quarter){ /* $quarters won't have any entry for quarters with no dates, so technically this 'if' isn't needed, however I've added it in case it will be needed it for any other changes you make */ if ($quarter){ ?> 

No estoy seguro de dónde se creó su elemento

, porque en el momento en que se agregan los

entre

s, que es incorrecto, sin embargo, esto refleja el código que publicó, por lo que debe saber cómo solucionarlo ¡tú mismo!

Coloque el encabezado dentro del ciclo for y valide el mes con if y else if para seleccionar qué encabezado mostrar use una instrucción foreach

 ID,'donor-date',true); $donor_month = date('m',strtotime($donor_date)); if(in_array($donor_month,array('01','02','03'),true)) echo "

First Quarter

"; if(!in_array($donor_month,array('04','05','06'),true) echo "

Second Quarter

"; ?>