Ordnen Sie nach drei benutzerdefinierten Feldern (Ymd) und trennen Sie sie dann in Jahresabschnitte

Für ein Projekt von mir habe ich drei benutzerdefinierte Felder (Jahr, Monat, Tag) erstellt, die an Beiträge angehängt sind, um das ursprüngliche Datum des Inhalts eines Beitrags zu bestimmen (nicht das Post-Veröffentlichungsdatum, das für die Bestellung in einer anderen Vorlage verwendet wird). . Für eine Archiv- / Kategorieansicht habe ich erfolgreich angeordnet, dass sie nach Jahr sortiert sind (benutzerdefiniertes Feld: Datum_Jahr), dann Monat (Datum_Monat), dann Tag (Datum_Tag) über die folgenden Abfrageargumente:

'orderby' => 'meta_value_num', 'order' => 'DESC', 'meta_query' => array( array( 'key' => 'date_year', 'value' => '', 'compare' => 'LIKE' ), array( 'key' => 'date_month', 'value' => '', 'compare' => 'LIKE' ), array( 'key' => 'date_day', 'value' => '', 'compare' => 'LIKE' ) ) 

Das Projekt würde jedoch erfordern, die Beiträge jedes Jahres in ein separates div zu unterteilen, jedes mit einer eindeutigen ID, z

 
...

Gibt es einen einfachen Weg dazu? Wie müsste ich abfragen, um dies zu erreichen? Oder würden Sie im Allgemeinen (obwohl das Projekt drei separate Felder benötigt) ein Feld vorschlagen und dann explodieren, um das Jahr für die Trennung in divs abzurufen?

Update 1

Ein einzelnes Datumsfeld (Format Ymd: zB “2015-02-18”) wäre sogar noch besser, wie sich herausstellt. Eine grundlegende Abfrage wäre

 $args = array( 'cat' => 14, 'post_type' => 'post', 'posts_per_page' => -1, 'orderby' => 'meta_value_num', 'order' => 'DESC', 'meta_key' => 'p2f_date' ); 

um eine normale Reihenfolge über das Datumsfeld wie beabsichtigt zu erhalten, aber natürlich gibt es bisher keine Gruppierung nach Jahr.

Solutions Collecting From Web of "Ordnen Sie nach drei benutzerdefinierten Feldern (Ymd) und trennen Sie sie dann in Jahresabschnitte"

Ein einzelnes Feld wäre genug, aber wenn du deinen Weg mit 3 schaffst, ist das auch gut.

Ich würde eine Schleife durch die Ergebnisse machen und am Ende mit einer Struktur wie der folgenden enden:

 $years = array( '2015' => array( , , etc... ), '2016' => array( etc... ) ); 

Dann könnten Sie diese Arrays erneut durchlaufen, um Ihren HTML-Code zu erstellen.

Viele verschiedene Techniken können in diesem Fall verwendet werden. Benutze einfach deinen Favoriten, denke ich. Ich denke nur, dass ein databaseanruf besser ist als 3.

Nicht sicher, ob ich deine Frage beantworte, aber ich hoffe, dass es hilft.

BEARBEITEN:

Da Sie nach Datum bestellen, müssen Sie Ihr Ergebnis nicht neu ordnen, damit es so einfach wie folgt sein kann:

 /* Your custom query */ $args = array( 'cat' => 14, 'post_type' => 'post', 'posts_per_page' => -1, 'orderby' => 'meta_value_num', 'order' => 'DESC', 'meta_key' => 'p2f_date' ); $archive = new WP_Query( $args ); $current_year = null; /* if our query has posts */ if( $archive->have_posts() ){ /* loop through them */ while( $archive->have_posts() ){ $archive->the_post(); $p2f_date = get_post_meta( get_the_id(), 'p2f_date' ); /* Here I skip if the meta is not defined but you might want to handle that differently */ if(empty($p2f_date)){ continue; } /* Get the year - Depending how you handle the post meta you might not need the index [0] */ $year = date('Y', strtotime( $p2f_date[0] )); if( $current_year === null ){ /* First item */ ?> 
    < ?php }else if( $current_year !== $year ){ /* New section */ ?>
< ?php } /* Reset your page data in case you need it after the custom query */ wp_reset_postdata();

Hoffe das macht Sinn und beantwortet deine Frage. Hier habe ich eine benutzerdefinierte WP_Query aber Sie könnten nur die Hauptabfrage ändern, wenn dies in Ihrem Fall relevant ist.