WP_Query sortieren->postet Array von Objekten bedingt mit unterschiedlichen Headern

Lesezeit: 6 Minuten

Ich habe ein Array von Objekten zurückgegeben von WP_Query->posts

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'

Und es geht weiter …… Ich versuche, dies in das erste, zweite, dritte und vierte Viertel zu gruppieren, basierend auf a date Metafeld dh; Das erste Quartal sind die ersten drei Monate (Jan, Feb, März), das zweite Quartal sind die nächsten drei und so weiter und geben die Überschriften “Erstes Quartal”, “Zweites Quartal” usw.:-

Ich habe das erreicht durch

<h3> First Quarter </h3>
<?php
     foreach($posts as $q1) {
       $donor_date = get_post_meta($q1->ID,'donor-date',true);
       $donor_month = date('m',strtotime($donor_date));

       if(!in_array($donor_month,array('01','02','03'),true)) continue;
?>
 <tr><td> <?php echo date('d/m/Y',strtotime($donor_date)); ?> </td></tr>
<?php endforeach; ?>

 <h3> Second Quarter </h3>
<?php
     foreach($posts as $q2) {
       $donor_date = get_post_meta($q2->ID,'donor-date',true);
       $donor_month = date('m',strtotime($donor_date));

       if(!in_array($donor_month,array('04','05','06'),true)) continue;
?>
 <tr><td> <?php echo date('d/m/Y',strtotime($donor_date)); ?> </td></tr>
<?php endforeach; ?>

und so weiter …… das Problem bei diesem Ansatz besteht darin, dass die Überschriften (Erstes Quartal, Zweites Quartal …) vorhanden sind, auch wenn keine Daten vorhanden sind, die die gegebene Bedingung erfüllen. Gibt es eine Möglichkeit, auch die Header bedingt ein- und auszublenden und eine bessere Methode zum Sortieren (Refactor) …….

Vielen Dank im Voraus ……..

WP Query sortieren postet Array von Objekten bedingt mit unterschiedlichen Headern
Flauschiges Kätzchen

Sie müssen die Werte im Array überprüfen, bevor Sie eine Ausgabe starten.

Ich würde vorschlagen, dies zu tun, indem Sie die anzuzeigenden Daten in einem Array speichern, anstatt sie sofort zu drucken. Auch vorausgesetzt $posts ist bei allen gleich foreach, müssen Sie nur einmal durchlaufen.

Beispiel mit Schritt-für-Schritt-Anleitung in den Kommentaren

<?php
/* declare an array to save the data */
$quarters = array();

foreach($posts as $q) {

   $donor_date = get_post_meta($q->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){ ?>

         <h3><?php echo $quartername; ?></h3>
         <table>
         <?php  foreach ($quarter as $qdate ){ ?>
             <tr><td> <?php echo $qdate; ?> </td></tr>
         <?php  }  // end foreach($quarter...) ?>
         </table>
     <?php 
     } // end if 
} // end foreach($quarters...) 
?>

Ich bin mir nicht sicher, wo du bist <table> Element erstellt wird, weil im Moment die <h3>s werden hinzugefügt zwischen <tr>s was falsch ist – dies spiegelt jedoch den von Ihnen geposteten Code wider, Sie sollten also wissen, wie Sie das selbst umgehen können!

  • Werde deinen Code ausprobieren und entschuldige die kaputte Tabellenstruktur, da ich den Code gekürzt habe …… der Code sollte den Spendernamen, den Betrag und das Datum anzeigen, die alle Metafelder sind und besonderen Dank für den “Refactor” Teil …. vielen Dank … werde als Antwort wählen, sobald ich es versuche.

    – Anoop D

    23. September ’17 um 15:53 ​​Uhr

  • Ich dachte, es lag daran, dass wir nur einen Teil Ihres Codes sahen! Wenn Sie mehr Informationen haben, können Sie alle im Array $quarters speichern und später anzeigen – erstellen Sie einfach ein Array und fügen Sie es zu $quarters hinzu, anstatt nur das $formatteddate, z.B $quarters[QUARTER_NAME][] = $array_with_all_info;. Zu Ihrer Information Ich habe den Code in meiner Antwort nicht getestet, aber die grundlegende Logik sollte korrekt sein. Lassen Sie es mich wissen, wenn Sie Probleme damit haben.

    – FluffyKitten

    23. September ’17 um 15:57


  • Klar , werde das tun …… werde das morgen als Antwort auswählen , sobald ich es überprüfe ….. Nochmals vielen Dank

    – Anoop D

    23. September ’17 um 15:59

  • Akzeptierte Ihre Antwort, da sie perfekt funktioniert ….. es gibt einige Syntaxfehler wie das Fehlen einer schließenden Klammer für in_array und Mischen von Doppelpunkt geschweifte Klammern in foreach ….. Vielen Dank für die freundliche Hilfe

    – Anoop D

    24. September ’17 um 5:55


  • Schön, dass es bei dir funktioniert hat! Entschuldigung für die Tippfehler, ich habe sie direkt im Antworteditor eingegeben, ohne sie zu testen. Ich werde meine Antwort aktualisieren, um sie zu beheben, nur für den Fall, dass jemand anderes Ihre Frage hilfreich findet. Ich werde auch a hinzufügen <table> -Element nur, damit es gültiges HTML generiert (ich weiß, dass Sie es in Ihrem eigenen Code verarbeitet haben, aber für alle anderen)

    – FluffyKitten

    24. Sep. ’17 um 17:07


Setzen Sie die Kopfzeile in die for-Schleife und validieren Sie den Monat mit if- und else if-Anweisungen, um auszuwählen, welche Kopfzeilenanzeige eine foreach-Anweisung verwendet

<?php
 foreach($posts as $q) {
   $donor_date = get_post_meta($q1->ID,'donor-date',true);
   $donor_month = date('m',strtotime($donor_date));
   if(in_array($donor_month,array('01','02','03'),true)) 
echo "<h3>First Quarter</h3>";
if(!in_array($donor_month,array('04','05','06'),true)
echo "<h3>Second Quarter</h3>";
?>
 <tr><td> <?php echo date('d/m/Y',strtotime($donor_date)); ?> </td></tr>
<?php endforeach; ?>

  • Ich habe es noch nicht ausprobiert, aber ich denke, die Überschrift wird sich im Laufe des Monats so oft wiederholen ……

    – Anoop D

    23. September ’17 um 15:50

  • Ja, Sie müssen eine Bedingung erstellen, um die Kopfzeile nur einmal zu drucken. Dies können Sie mit einer bool-Variablen tun, ihren Wert ändern und mit in der foreach-Schleife validieren

    – Osama

    23. September ’17 um 15:55

  • Bitte gehen Sie die Antwort von @FluffyKitten durch

    – Anoop D

    23. September ’17 um 15:56 Uhr

.

200070cookie-checkWP_Query sortieren->postet Array von Objekten bedingt mit unterschiedlichen Headern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy