Sortieren Sie Beiträge nach post_type in der category.php Vorlage

In meiner category.php Vorlage möchte ich Kategorie Beiträge nach ihren Post-Typen dynamisch sortieren. Mein Block muss diese Struktur haben

 Restaurant (custom post type) - posts Bars (custom post type) - posts Shops (custom post type) - posts 

Ich muss zuerst wissen, in welchen Post-Typen die Beiträge der aktuellen Kategorie sind (so etwas wie dieser Screenshot)

Bildschirmfoto

Dies ist eine Design-Vorlage, ich möchte keine benutzerdefinierten Abfragen für den Post, also vielleicht einen Filter oder etwas ähnliches verwenden

Solutions Collecting From Web of "Sortieren Sie Beiträge nach post_type in der category.php Vorlage"

Angenommen, Ihre Abfrage hat tatsächlich mehrere Post-Typen, sollten Sie sie vor dem $wp_query ausreißen (ich nehme an, dass Sie $wp_query als Ihr WP_Query-Objekt verwenden):

 < ?php $all_post_types = array_map(function($item) { return $item->post_type; }, $wp_query->posts); // Now we get a unique list of post types: $unique_post_types = array_unique($all_post_types); // Use that unique list to drive multiple loops: foreach($unique_post_types as $grouping) { // Build our "title" for each group, using esc_html to sanitize echo sprintf("%s", esc_html($grouping)); //Start from the beginning of the list: rewind_posts(); while(have_posts()) { the_post(); if($post->post_type != $grouping) { // not a match for our current grouping? continue; } echo "

– " . get_the_title() . "

"; } } ?>

Zuerst greife ich alle Post-Typen aus $wp_query , ziehe sie in eine eindeutige Liste und verwende sie dann, um die Schleife mehrmals auszuführen (einmal für jeden Post-Typ), wobei wir nur Posts für diesen Typ $wp_query . Dies ist ein rudimentäres Beispiel und gibt Ihnen nicht die “freundlichen” Namen Ihrer Post-Typen oder die exakte Ausgabe, die Sie wahrscheinlich wünschen, sondern sollte zumindest einen Skelett-Rahmen geben, um den Sie Ihre Ausgabe erstellen können.

BEACHTEN

Option eins Abschnitt eins ist mit der anderen Antwort im Hinterkopf getan. Abschnitt eins ist austauschbar und kann mit der anderen Antwort oder meinem Ansatz in Abschnitt 2 von Option 1 verwendet werden. Sie können entweder meinen Ansatz hier oder den Ansatz von @JustinBell verwenden. Der wichtige Abschnitt hier ist Abschnitt 1, der Ihre Schleife nach Ihrer vordefinierten Reihenfolge sortiert nach Post-Typ zuerst sortiert.

OPTION 1

ABSCHNITT 1

Dies ist der wichtige Abschnitt, da hierdurch die Posts nach dem von Ihnen vordefinierten Post-Typ sortiert werden

Sie können usort , um Ihre Posts mit dem the_posts sortieren. Der Code verwendet Folgendes

  • usortusort ein Array nach Werten mit einer benutzerdefinierten Vergleichsfunktion

  • the_posts Filter

  • is_main_query() – wertet aus, ob die aktuelle Abfrage (z. B. innerhalb der Schleife) die Hauptabfrage ist

  • is_category() – prüft, ob eine Kategorie-Archivseite angezeigt wird

Die Schleife wird zuerst nach Post-Typ, restaurant , dann nach Post-Typ bars , dann Post-Typ- shops sortiert. Der Code behält auch Posts in demselben Post-Typ, sortiert nach post_date

 add_filter( 'the_posts', function( $posts, $q ) { if( $q->is_main_query() && $q->is_category() ) { usort( $posts, function( $a, $b ){ $post_types = array ( 'restaurant' => 1, 'bars' => 2, 'shops' => 3 ); $posts = $post_types[$a->post_type] - $post_types[$b->post_type]; if ($posts === 0){ //same post_type, compare by post_date. return $a->post_date < $b->post_date; }else{ //different post_type, save to ignore the post_date. return $posts; } } ); } return $posts; }, 10, 2 ); 

SEKTION 2

Das ist deine Schleife. Wie bereits erwähnt, funktioniert auch die andere Antwort hier perfekt. Um einen anderen Ansatz zu präsentieren, habe ich Folgendes getan

Erstellen Sie zuerst ein neues Array namens $posts_reordered . Die Post-Typ-Namen werden als die Array-Schlüssel verwendet, und alle Posts mit dem gleichen Post-Typ werden unter dem jeweiligen Schlüssel enthalten sein. Dieses neue Array wird zum Erstellen der Schleife verwendet. So sieht die Schleife aus, dies wird in Ihre category.php gehen. Sie müssen nur Ihren eigenen HTML-Markup hinzufügen und bei Bedarf modifizieren.

 < ?php $posts_reordered = []; foreach ( $posts as $post ) { $posts_reordered[$post->post_type][] = $post; } unset($post); foreach ( $posts_reordered as $key=>$value ) { echo '
    '; echo $key; foreach ( $value as $post ) { setup_postdata($post); ?>
  • < ?php the_title(); ?>
  • < ?php } unset($post); echo '
'; } // PLACE YOUR PAGINATION FUNCTION HERE ?>

Dadurch wird die folgende Ausgabe ausgegeben ( event_type , post und event_type sind meine Post-Typen, mit denen ich event_type und in der geordneten Position bin, die ich mit dem Code in Abschnitt 1 eingestellt habe )

Bildbeschreibung hier eingeben

OPTION 2

< --- VERSCHROTT --->

Der ursprüngliche Code mit loop_start brachte nicht die Ergebnisse, nach denen ich loop_start hatte, werde ich vielleicht in Zukunft noch einmal betrachten, aber ich glaube, dass Option Eins die beste ist, da es wie erwartet funktioniert