Ist es mit wp_query möglich, nach Taxonomie zu bestellen?


49

Meine Frage ist einfach: Ich verwende WP_Query, um mithilfe von tax_query einige benutzerdefinierte Posts abzurufen, die nach einer Taxonomie gefiltert wurden.

Jetzt ist mein Problem, dass ich nach der Taxonomie ordnen möchte, aber aufgrund der Dokumentation und der Suche im Web kann ich keine Lösung finden.

Mit orderby in WP_Query können Sie nach einer Reihe von Feldern sortieren, auch nach benutzerdefinierten Metafeldern, aber es scheint die Taxonomie nicht zu unterstützen.

Irgendwelche Hinweise auf die richtige Richtung?

Danke euch allen.

Antworten:


12

Nein, es ist nicht möglich, nach Taxonomie zu ordnen, da dies unter bestimmten Gesichtspunkten eigentlich keinen Sinn ergibt.

Taxonomien sind Möglichkeiten, Dinge zu gruppieren. Der Sinn einer Taxonomie für Stellen wäre es also, Begriffe in dieser Taxonomie zu haben, die zwischen Stellen geteilt werden. Wenn eine Taxonomie Begriffe hätte, die jeweils nur für einen Beitrag verwendet wurden, würde dies die Taxonomie sinnlos machen. Und wenn die Begriffe so geteilt würden, wie sie sollten, würde eine Bestellung danach nichts besonders Nützliches ergeben.

Was Sie in einer solchen Situation verwenden sollten, ist das Post-Meta. Sie können per Post-Meta bestellen, und es ist für jeden Post einzigartig.

Bearbeiten: Das heißt, Sie können nach Taxonomie ordnen, indem Sie eine benutzerdefinierte SQL-Abfrage mit einem Filter erstellen. Dies ist in einer nicht geänderten WP_Query nicht möglich: http://scribu.net/wordpress/sortable-taxonomy-columns.html

Wenn Sie jedoch auf diese Art zurückgreifen müssen, ist Ihre Datenentwurfsstruktur in erster Linie falsch. "Begriffe" in der Taxonomie sind keine tatsächlichen "Daten". Die Begriffe selbst haben keine inhärente Bedeutung, sie sind nur Bezeichnungen für die bestimmte Gruppierung, die sie beschreiben. Wenn Sie sie als aussagekräftige Daten behandeln, liegt Ihnen ein Konstruktionsfehler zugrunde.

Taxonomien gruppieren Dinge, indem sie ihnen Begriffe zuweisen. Diese Gruppierung ist der springende Punkt bei Taxonomien. Die Begriffe sind nur hübsche Gesichter in der Gruppierung. Wenn Sie aussagekräftige Metadaten haben, die Sie einem Beitrag zuordnen können, sollten Sie stattdessen das Beitrags-Meta verwenden. Und dass Sie kann durch, bestellen , weil Post Meta beiden Schlüssel und Werte zu speichern Informationen verwendet. Mit einer Taxonomie speichern Sie wirklich nur Schlüssel, deren Werte die nach diesem Begriff gruppierten Beiträge sind.

Auf lange Sicht sind die Dinge einfacher, wenn Sie den richtigen Ansatz dafür verwenden. Ich sage zwar nicht, dass Sie mit Taxonomie nichts Seltsames anfangen können, aber Sie erschweren sich die Dinge auf lange Sicht, indem Sie sie falsch verwenden.


Hallo Otto, danke für die Antwort. Ich verstehe deinen Standpunkt und vielleicht gehe ich damit den falschen Weg. In meinem Beispiel einer Website mit Fernsehsendungen habe ich Taxonomie für Serie 1, Serie 2, Serie 3 usw. Damit kann ich alle verschiedenen Fernsehsendungen nach Seriennummer gruppieren. Dann habe ich dasselbe für Episoden, Episode 01, Episode 02 usw. Was ich möchte, ist, wenn ich eine Liste aller Episoden zeige, die nach Episode und Serie sortiert werden sollen. Ich werde dann Meta- und benutzerdefinierte Felder analysieren. Vielen Dank, Otto.
Yeope

@yeope Ihre Taxonomie sollte Serie sein und Ihre Begriffe sollten Serie 1, Serie 2 usw. sein. Bei Episoden gehe ich davon aus, dass eine Serie mehrere Episoden enthält, sodass dieselbe Taxonomie verwendet werden könnte, "Serie", und wenn sie hierarchisch ist, dann Episode 1. Folge 2 usw. hätte den übergeordneten Begriff "Serie x". Dann könnten Sie eine ganze Reihe abfragen, damit die Folgen genau dort angezeigt werden, wo sie angezeigt werden sollen.
Chris_O

@ Chris_O Ich verstehe, Sie könnten dort auf dem Geld sein! Das einzige Problem, das ich sehen kann, ist die Tatsache, dass ich die Ausdrücke "Episode 1", "Episode 2" für jede Serie wiederholen muss. Es ist auch nicht möglich, alle Folgen 1 unabhängig von der Serie zu gruppieren, aber ich denke, es gibt wahrscheinlich einen Ausweg. Vielen Dank Chris_O
yeope

2
Die Verwendung einer Taxonomie für Episoden ist eigentlich nicht sinnvoll, da die Gruppierung wertlos ist. Denken Sie darüber nach, wenn Sie "Episode 1" als Begriff haben, dann gruppieren Sie Episode 1 mit jeder anderen Episode 1 aus jeder anderen TV-Show. Die Folgen- und Seriennummern sind als post_meta sinnvoller, da sie für die jeweilige Sendung spezifisch und als Gruppe nicht nützlich sind. Der Name der Fernsehsendung wäre als Begriff in einer Fernsehsendungstaxonomie nützlich, da Sie dann die Sendung als Ganzes gruppieren.
Otto

1
Otto folgte diese mit einer interessanten Blog - Post auf: Wenn zu (nicht) eine benutzerdefinierte Taxonomie verwenden .
Jan Fabry

47

Die akzeptierte Antwort auf diese Frage ist nicht akzeptabel. Es ist unlogisch anzunehmen, dass eine Bestellung nach Steuern "keinen Sinn ergibt". Die Antwort, die er gab, ergibt keinen Sinn.

Erwägen Sie, einen Menüpfostentyp zu haben. Dann haben Sie eine benutzerdefinierte Steuer von "FoodCategories". Die FoodCategories-Steuer beinhaltet die Begriffe "Frühstück", "Mittagessen" und "Abendessen". Wenn Sie eine Abfrage mit dem Parameter tax_query senden, wird jetzt eine Ergebnismenge mit allen Begriffen angezeigt, die jedoch nach dem Postdatum sortiert sind.

Um die richtige Reihenfolge dieser Einträge im Verhältnis zu ihren Begriffen zu ermitteln und sie dann am Frontend entsprechend anzuzeigen, indem Sie die Beiträge in ihre verschiedenen Kategorien unterteilen, müssen Sie die Ergebnismenge durchlaufen und dann jeden einzelnen Beitrag im abfragen Ergebnismenge, um die Begriffe zu finden und mit dem aktuellen Begriff zu vergleichen, in ein Array zu filtern und fortzufahren. Anschließend müssen Sie das neue Array erneut durchlaufen, um es anzuzeigen. Das ist nicht produktiv.

Es wäre schön, wenn WP eine "tax__in" orderby-Option hätte, wie es eine "post__in" -Option hat, aber da dies nicht der Fall ist, müssen Sie entweder den oben genannten lächerlichen Prozess ausführen; Passen Sie die Abfrage mithilfe der Filter "posts_orderby" und "posts_join" an, um die orderby-Methode anzupassen und den Begriff der Ergebnismenge hinzuzufügen. Oder Sie müssen eine neue Abfrage für jeden Begriff erstellen, nach dem Sie in den HTML-Abschnitten im Verhältnis zu diesen Begriffen filtern.

Am effizientesten wäre es, die Abfragezeichenfolge über Filter zu ändern. Am einfachsten wäre es, drei separate Abfragen durchzuführen. Die WP-API sollte die Bestellung nach Steuern oder restriktiven Abfrageparametern verarbeiten. Wenn Sie eine Abfrage basierend auf bestimmten Bedingungen einschränken, besteht eine hohe Wahrscheinlichkeit, dass viele nach denselben Bedingungen bestellen müssen.


2
Entschuldigung, aber du liegst falsch. Eine Taxonomie-Bestellung ist auch in Ihrem Fall nicht sinnvoll. Was möchtest du zeigen? Zuerst alle Frühstücke, dann alle Abendessen, dann alle Mittagessen? Sie sollten auswählen, was Sie möchten und in welcher Reihenfolge Sie es möchten, aber die Taxonomie ist nur eine Gruppierungsbezeichnung. Es sind keine aussagekräftigen "Daten", nach denen Sie bestellen sollten. Wenn dies der Fall ist, sollte es sich nicht um einen Begriff in einer Taxonomie handeln, sondern stattdessen um ein Post-Meta.
Otto

15
Komm schon, es wird natürlich einige Fälle geben, in denen Sie Posts nach Taxonomiebegriff ordnen möchten. Ein weiteres Beispiel ist ein Movie-Beitragstyp mit einer Rating-Taxonomie. In einer Liste von Filmen ist es sehr einfach, sich vorzustellen, dass Leute eine Liste von Filmen nach Bewertung sortieren möchten, sodass alle Filme mit G-Bewertung, dann mit PG-Bewertung usw. oben angezeigt werden. (In diesem und dem Beispiel für Mahlzeiten könnten sie nach term_id anstatt nach name geordnet werden.) In vielen Fällen werden Sie wahrscheinlich am besten von einer Taxonomie und nicht von Meta bedient, aber es ist wahrscheinlich auch hilfreich, wenn diese Taxonomie geordnet ist -imstande.
SeventhSteel

2
PG- und G-Bewertungen und solche sind eine gute Taxonomie-Wahl, mit der Ausnahme, dass sie Daten zu bestimmten Filmen sind. Sie sind also Meta. Es sind Daten, keine Kategorien. Nur eine begrenzte Anzahl von Entscheidungen zu treffen, ist keine Taxonomie. Wenn Sortieren nach erforderlich ist, machen Sie es entweder zu einem Meta oder erzwingen Sie das Sortieren nach Taxonomie über taxonomiespezifischen Code. Übrigens kommt NC17 nach PG. Sie benötigen also Code, um diese Bestellung auszuführen.
Otto

Ich weiß, dass ich mit diesem Kommentar zu spät zur Party komme, bin aber nur darauf gestoßen. In manchen Situationen kann eine Taxonomie-Reihenfolge sinnvoll sein. Wir haben Stellenanzeigen für ein Projekt als Post-Typ und dann für Bundesstaat und Stadt, in denen der Job Taxonomien sind. Wir möchten, dass sie leicht verständlich sind (alle Jobs in einem Bundesstaat oder alle Jobs in einer Stadt anzeigen), daher war Taxonomie die beste Lösung. Gleichzeitig gibt es eine allgemeine Jobsuche, bei der wir sie zuerst nach Titel, dann nach Bundesland und dann nach Stadt sortieren möchten.
Dennis Puzak

Ein weiterer Anwendungsfall: Ein Kunde hat eine Reihe von Artikeln, von denen jeder eine Kategorie hat. Der Kunde möchte, dass auf einer Seite alle Artikel aufgelistet werden, die alphabetisch, nach Datum oder nach Kategorie sortiert werden können. Kategorien können auch gefiltert werden, aber die alphabetische Auflistung aller Artikel nach Kategorien ist für einen Anwendungsfall nicht so verrückt, und Sie sehen, dass er häufig angezeigt wird.
Wilson Biggs

15

Ja, aber es ist ziemlich verwickelt ...

Füge zu functions.php in deinem Theme hinzu:

function orderby_tax_clauses( $clauses, $wp_query ) {
    global $wpdb;
    $taxonomies = get_taxonomies();
    foreach ($taxonomies as $taxonomy) {
        if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby'] ) {
            $clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
            $clauses['groupby'] = "object_id";
            $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
            $clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
        }
    }
    return $clauses;
}

    add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );

Dies ist frankensteined von einigen gefundenen Sachen und einige Sachen, die ich selbst gemacht habe. Das zu erklären ist ziemlich schwierig, aber das Fazit ist, dass dies läuft. Sie können? Orderby = (Taxonomie-Abfrage var) & order = ASC (oder DESC) setzen und sie wird gleich abheben!


Vielen Dank, Drew. Ich werde versuchen, SQL auszuführen. Ich muss ein wenig nachbearbeiten, aber es könnte funktionieren. Mein einziges Problem ist jetzt, dass ich möglicherweise in die falsche Richtung gehe, wie es Otto angedeutet hat. Danke Drew. EDIT- Keine Notwendigkeit zu bearbeiten Ich kann sehen, wo es die Optimierung benötigt :) Vielen Dank
yeope

Wenn du es in den letzten zwei Minuten geschnappt hast, funktioniert es nicht. Mach weiter und schnapp es dir jetzt, ich habe es behoben. Es wurde für zwei spezifische Taxonomien festgelegt. Ich habe den Code verbessert, damit er für alle registrierten Taxonomien funktioniert.
Drew Gourley

vielen Dank noch mal. Nur für den Fall, dass ich Ihre Lösung ausprobiert habe und es funktioniert. Auch wenn jemand anderes es verwenden möchte, müssen Sie ändern, add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );um add_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );Danke :)
yeope

Ja, das ist jetzt im Codeblock behoben. Ich habe dies aus einem Projekt übernommen, an dem ich arbeite, und habe vergessen, den Namen der Funktion zu ändern, obwohl ich ihn im Hook geändert habe.
Drew Gourley

1
Wissen Sie, ob es möglich ist, die Taxonomien nach ID anstelle des Namens zu bestellen? Ich versuche, dasselbe Ergebnis zu erzielen, indem ich die Taxonomiegruppen nach ID
Javier Villanueva,

9

Ich komme hier zu spät zum Spiel, aber es gibt eine einfachere Möglichkeit, dies mit WordPressy zu tun.

Erstellen Sie Ihre Steuerabfrage wie gewohnt.

$tax_query = array();
$tax_query['relation']="OR";
$tax_query[] = array(
    'taxonomy' => 'product_cat',
    'field'    => 'slug',
    'terms'    => $cat_terms,
);
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

Richten Sie Ihre Argumente für query_posts oder WP_Query ein

$args = array(
    'post_type'=>'post',
    'posts_per_page'=>12,
    'paged'=>$paged,
    'tax_query' => $tax_query,
);

Bevor Sie den Aufruf von query_posts / WP_Query ausführen, schließen Sie sich dem orderby-Filter an und überschreiben Sie ihn

add_filter('posts_orderby', 'edit_posts_orderby');
function edit_posts_orderby($orderby_statement) {
    $orderby_statement = " term_taxonomy_id ASC ";
    return $orderby_statement;
}
query_posts($args);
remove_filter('posts_orderby', 'edit_posts_orderby');

Vergessen Sie nicht, den Filter danach zu entfernen ...

Dies funktioniert b / c die tax_query erstellt die Joins usw. für Sie, Sie müssen nur durch eines der Felder aus dem Join bestellen.


2
Irgendeine Idee, wie man nach Namen anstelle von term_taxonomy_id bestellt? Ändern von term_taxonomy_id in orderby_statement wirft Fehler
tehlivi

Dies ist die richtige Antwort für alle, die interessiert sind!
Mayra M

2

Nun, ich möchte meine Erfahrung in der Sortierung von benutzerdefinierten Beitragstypen nach Kategorie / Taxonomie offenlegen.

DAS NETZ

  1. Eine Reisebüro-Website, die unter WordPress läuft
  2. Hauptinhalt des benutzerdefinierten Post-Typs "ruta"
  3. Taxonomie mit dieser Struktur Reiseart> Kontinent> Land

DER FALL

Auf Seiten mit Archivkategorielisten wollte der Kunde, dass die Beiträge nach sortiert werden

  1. Der Kontinent, geordnet nach der Anzahl der Routen.
  2. Das Land, alphabetisch sortiert.

DIE SCHRITTE

Zuerst fange ich die Anfrage von der unmodifizierten Archivseitenanfrage ab, die zufällig so aussah:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE 1=1 
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) )
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 20

Zweitens habe ich den SQL-Code in Sequel Pro für die Datenbank bearbeitet, um meinen Anforderungen zu entsprechen. Ich komme mit diesem heraus (ja, wahrscheinlich kann es verbessert werden: mein Wissen über MySQL ist nicht hervorragend):

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id =  tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    ) AS Total
FROM  wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )
WHERE 1=1  
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) ) 
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY
total DESC,
wp_terms.name  

Drittens habe ich die Abfrage in der Datei functions.php mit drei Filtern verknüpft: posts_fields, posts_join und posts_orderby

Der Code in functions.php:

function xc_query_fields( $fields ) {

   $fields = "wp_posts.ID, wp_posts.post_title, wp_terms.name, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id = tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    )
    AS Total";
     return $fields;
}


function xc_query_joins( $join ) {
$join .= "INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
   INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
   INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )";
 return $join;
}


function xc_query_orderby( $join ) {
    $join = "total DESC, wp_terms.name ";
    return $join;
 }

Schließlich habe ich die Filter aus dem pre_get_post-Hook unter bestimmten Bedingungen ausgelöst

function filtra_queries( $query )
{

  if (  is_archive()  && $query->is_main_query() && !is_admin()  ) {

$rutes = array('viajes-privados', 'asia', 'africa', 'oceania', 'america', 'oriente-proximo');

if  ( in_array( $query->get('category_name'), $rutes ) ) 
  {
  add_filter( 'posts_fields', 'xc_query_fields' );
  add_filter( 'posts_join', 'xc_query_joins' );
  add_filter( 'posts_orderby', 'xc_query_orderby' );
}// end if in_array

  }// end if is_archive

}
 add_filter('pre_get_posts', 'filtra_queries');

Hoffe das kann jemandem helfen


Gute Arbeit, lächerlich, dass diese Menge Code benötigt wird, um etwas nach einer Taxonomie zu sortieren. Riesen Problem mit WP.
Serraosays

2

Ich hatte ein sehr ähnliches Problem: Ich möchte ein benutzerdefiniertes Post-Type-Archiv (Zeitschriftenartikel) nach einer benutzerdefinierten Taxonomie (Ausgaben) bestellen. Ich führe niemals direkte SQL-Abfragen auf meiner Site durch - und normalerweise müssen Sie Ihren Ansatz überdenken, wenn Sie wie diese anderen Antworten sind.

PROBLEME:

1) Mit Wordpress können Sie Taxonomien nicht auf intelligente Weise bestellen.

2) Wordpress erlaubt es einfach nicht, orderbyTaxonomien für WP_Query nach dem Typ (wie von Otto dargelegt) zu verwenden.

LÖSUNGEN:

1) Das Sortieren von Taxonomien wird derzeit am besten mit dem Plug-in "Custom Taxonomy Order NE" durchgeführt . Es ermöglicht Ihnen, die Taxonomie über WYSIWYG zu bestellen, in wp-admindem nicht wie ich es tun würde, aber ich habe nichts Besseres gefunden.

Wenn Sie das Plugin einrichten, erhalten Sie etwas Ähnliches wie hier. Notieren Sie sich die Option Auto-sort Queries of this Taxonomy- setzen Sie diese auf Custom Order as Defined Above; Dadurch erhalten Sie die Bestellung, die Sie benötigen. Bildschirmfoto:

Benutzerdefinierte Taxonomiebestellung NE-Anzeige

2) Mit einer sortierten Taxonomie können Sie jetzt eine Reihe von WP_Query-Aufrufen erstellen, die sich über jeden Begriff erstrecken. Auf diese Weise wird ein Archiv erstellt, das nach Taxonomie geordnet ist. Verwenden Sie get_terms()diese Option , um ein Array aller Steuerbedingungen zu erstellen, und führen Sie foreachdann für jede Bedingung eine neue aus . Dadurch wird WP_Queryfür jeden Begriff ein Element erstellt, das alle Beiträge für einen bestimmten Begriff zurückgibt, wodurch effektiv ein Archiv erstellt wird, das nach Taxonomiebegriff geordnet ist. Code, um dies zu ermöglichen:

  // Get your terms and put them into an array
  $issue_terms = get_terms([
    'taxonomy' => 'issues',
    'hide_empty' => false,
  ]);

  // Run foreach over each term to setup query and display for posts
  foreach ($issue_terms as $issue_term) {
    $the_query = new WP_Query( array(
      'post_type' => 'post',
      'tax_query' => array(
        array(
          'taxonomy' => 'issues',
          'field' => 'slug',
          'terms' => array( $issue_term->slug ),
          'operator' => 'IN'
        )
      )
    ) );

    // Run loop over each query
    while($the_query->have_posts()) :
      $the_query->the_post();

      // YOUR TEMPLATE OUTPUT FOR EACH POST

    endwhile;
  }

Verwandte Lektüre auf dieser Website: Alle Posts in einem benutzerdefinierten Post-Typ anzeigen, gruppiert nach einer benutzerdefinierten Taxonomie


2

Ich bin nicht sicher, warum alle Lösungen hier ziemlich übertrieben sind. OK, es ist ein halbes Jahrzehnt her, aber ich führe gerade den folgenden Code aus und es funktioniert:

   <?php // Default
    $wheels_args = array(
        'post_type' => 'wheels',
        'posts_per_page' => '96',
        'orderby' => 'taxonomy, name', // Just enter 2 parameters here, seprated by comma
        'order'=>'ASC'
    );
    $loop = new WP_Query($wheels_args);
    ?>

Dies sortiert die Taxonomien Ihres CPT zuerst nach ihrer Taxonomie in alphabetischer Reihenfolge und innerhalb dieser Taxonomiegruppen auch nach alphabetischer Reihenfolge.


@yeope Warum ist das die akzeptierte Antwort? Gott sei Dank habe ich gescrollt
Juan Solano

1

Hier ist die Lösung, die ich für dieses spezielle Problem verwendet habe. Diese Lösung ist für extreme Fälle gedacht, in denen sowohl kein pre_get_postsFilter verwendet werden kann als auch die Abfrage eine Paginierung aufweist (z. B .: WooCommerce):

global $wpdb;

$taxonomies = array('my-tax-1', 'my-tax-2', 'my-tax-3');

$orderby = "'".implode("', '", array_keys($taxonomies))."'";
$id_sql = $GLOBALS['wp_query']->request;

$id_sql = preg_replace('/LIMIT\s+\d+\s?,?\s\d*/', '', $id_sql);
$id_sql = str_replace('SQL_CALC_FOUND_ROWS', '', $id_sql);

$term_sql = "SELECT
  tt.taxonomy AS `taxonomy`,
  t.name AS `term_name`,
  t.slug AS `term_slug`,
  count(*) AS `term_count`
FROM ({$id_sql}) p 
JOIN wp_term_relationships tr
  ON p.ID = tr.object_id
JOIN wp_term_taxonomy tt
  ON tr.term_taxonomy_id = tt.term_taxonomy_id
JOIN wp_terms t
  ON tt.term_id = t.term_id
WHERE tt.taxonomy IN ({$orderby})
GROUP BY t.slug
ORDER BY
  FIELD(tt.taxonomy, {$orderby})"; // Add further specific ordering here

$results = $wpdb->get_results($term_sql, ARRAY_A);

Ich habe dies verwendet, um ein Navigationsmenü zu erstellen, das nach Taxonomie, Begriff und Anzahl der Beiträge pro Begriff geordnet ist.

Wenn Sie einfach die Beiträge möchten, ändern Sie die Abfrage auf SELECT p.*undGROUP BY p.ID


0

Es ist wie eine Abfrage vor der Abfrage, aber es stört nicht, wenn nicht zu viele Beiträge abgefragt werden. Die Idee ist, die Hauptabfrage zu ändern, sodass wir nicht einmal zu Vorlagen wechseln und neue Abfragen generieren müssen Schleifen ...

function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms('my_custom_taxonomy');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                'posts_per_page' => 4, // as you wish...
                'post_type' => 'my_custom_post_type', // If needed... Default is posts
                'fields' => 'ids', // we only want the ids to use later in 'post__in'
                'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars['post_type'] = 'my_custom_post_type'; // Again, if needed... Default is posts
        $query->query_vars['posts_per_page'] = 16; // If needed...
        $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above
        $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop
        $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.