Wie bekomme ich eine WP_Query-Liste?

Ich habe eine new WP_Query , mit der ich eine benutzerdefinierte Schleife generieren und eine Reihe von Posts anzeigen kann. Eines der Dinge, die die Abfrage erledigt, ist die Paginierung.

Bevor ich jedoch die abgefragten Posts anzeigen kann, möchte ich eine Liste aller Tags für die gefundenen Posts erhalten. Ich weiß, dass ich das tun kann, indem ich jeden der Beiträge durchblättere und dann Duplikate entferne, aber ich habe auf eine elegantere Vorgehensweise gehofft.

Solutions Collecting From Web of "Wie bekomme ich eine WP_Query-Liste?"

Ich glaube nicht, dass das möglich ist. Die SQL-Abfrage, die von WP_Query gibt nur die Post-Objekte (und vielleicht einige Metadaten) zurück, während sich die Tags in einer anderen Tabelle befinden. Wenn Sie die zurückgegebenen Posts in Templates the_tags(); setzen Sie normalerweise the_tags(); oder etwas Ähnliches in Ihren Vorlagen, das wiederum eine neue databaseabfrage für jeden Beitrag ausführt.

Sie können jedoch eine separate Abfrage ausführen, um die Tags vor dem Ausführen der primären Posts-Abfrage zu laden. Soweit ich weiß, gibt es keine WordPress-API-function, mit der Sie die Tags von mehr als einem Beitrag gleichzeitig laden können, aber Sie könnten dies erreichen, indem Sie $wpdb direkt aufrufen.

So etwas könnte dir beim Einstieg helfen:

 global $wpdb; $sql = $wpdb->prepare( "SELECT DISTINCT $wbdb->terms.* FROM $wbdb->term_relationships JOIN $wbdb->posts ON $wbdb->posts.ID = $wbdb->term_relationships.object_id JOIN $wbdb->term_taxonomy ON $wbdb->term_taxonomy.term_taxonomy_id = $wbdb->term_taxonomy.term_taxonomy_id JOIN $wbdb->terms ON $wbdb->term_taxonomy.term_id = $wbdb->terms.term_id WHERE $wbdb->term_taxonomy.taxonomy = 'post_tag' AND $wbdb->posts.ID IN (1,2,3,4,5,6,7,8,9,10)" ); $tags = $wpdb->query($sql); 

Wie Sie sehen können, wird davon ausgegangen, dass Sie Ihre Post-IDs im Voraus kennen, was Sie höchstwahrscheinlich nicht tun. In diesem Fall müssten Sie die Listen in den Klammern durch eine Unterabfrage ersetzen, die in ihrer einfachsten Form SELECT ID FROM $wpdb->posts , aber die Posts nach Kategorie, Datum, usw. Ein Problem, auf das ich stieß, war, dass meine Version von MySQL LIMIT in Unterabfragen nicht unterstützte. Wenn dies auch nicht der Fall ist, kann es schwierig sein, dies in einer Abfrage zu erreichen. Wenn Sie nicht viele Posts haben, können Sie zuerst Ihre WP_Query und die Post-IDs sammeln. In jedem Fall ist dies schneller als das Ausführen separater Abfragen für jeden Post, da Sie nur eine Tag-bezogene Abfrage ausführen, anstatt eine für jeden Post auszuführen.

Der Nachwelt halber habe ich die Schleife zweimal durchlaufen: einmal, um die Tags zu erhalten, und um die Seite dann tatsächlich anzuzeigen.

Hier ist mein Code:

 if ( have_posts() ) : // get tags for found posts $recent_tags = array(); while ( $loop->have_posts() ) : $loop->the_post(); foreach(get_the_tags() as $t) $recent_tags[$t->slug] = $t->name; // this adds to the array in the form ['slug']=>'name' endwhile; // de-dupe $recent_tags = array_unique($recent_tags); // sort natcasesort($recent_tags); // do something with the array while ( $loop->have_posts() ) : $loop->the_post(); // normal wp loop