Eine verspätete Antwort als die am häufigsten gewählte Antwort wird Ihre Anfrage unterbrechen und ist in einigen wichtigen Punkten einfach nicht wahr.
Die Haupt- WP_Query und ihre Filter
Erstens verwendet WordPress intern query_posts()
(ein dünner Wrapper WP_Query
, der nicht in Themes oder Plugins verwendet werden sollte), um Folgendes zu tun:WP_Query
: Dies WP_Query
ist die Hauptschleife / Abfrage. Diese Abfrage durchläuft eine Vielzahl von Filtern und Aktionen, bis die eigentliche SQL-Abfragezeichenfolge erstellt wurde. Eine davon ist pre_get_posts
. Andere sind posts_clauses
, posts_where
usw. , die auch Ihnen erlauben , die Query - String - Bauprozess abzufangen.
Ein genauer Blick auf das, was im Inneren des Kerns passiert
WordPress führt die wp()
Funktion (inwp-includes/functions.php
) aus, die aufruft $wp->main()
( $wp
ist ein Objekt der Klasse WP, das in definiert ist wp-includes/class-wp.php
). Dies weist WordPress an:
- Analysieren Sie die URL in einer Abfragespezifikation mit
WP->parse_request()
- dazu weiter unten.
- Setzen Sie alle is_-Variablen, die von Conditional Tags verwendet werden, mit
$wp_query->parse_query()
( $wp_query
ist ein Objekt vonclass WP_Query
, das in definiert ist wp-includes/query.php
). Beachten Sie, dass in diesem Fall trotz des Namens dieser Funktion WP_Query->parse_query
kein Parsing für uns durchgeführt wird, da dies zuvor von ausgeführt wurde WP->parse_request()
.
- Konvertieren Sie die Abfragespezifikation in eine MySQL-Datenbankabfrage und führen Sie die Datenbankabfrage aus, um die Liste der Beiträge in der Funktion WP_Query-> get_posts () abzurufen. Speichern Sie die Beiträge im Objekt $ wp_query, um sie in der WordPress-Schleife zu verwenden.
Quelle Codex
Fazit
Wenn Sie die Hauptabfrage wirklich ändern möchten, können Sie eine Vielzahl von Filtern verwenden. Verwenden Sie einfach $query->set( 'some_key', 'some_value' );
, um Daten dort zu ändern , oder $query->get( 'some_key' );
, um Daten abzurufen , um bedingte Prüfungen durchzuführen. Dies erspart Ihnen das Ausführen einer zweiten Abfrage, da Sie nur die SQL-Abfrage ändern .
Wenn Sie eine zusätzliche Abfrage durchführen müssen, gehen Sie mit einem WP_Query
Objekt. Dadurch wird der Datenbank eine weitere Abfrage hinzugefügt.
Beispiel
Da Antworten mit einem Beispiel immer besser funktionieren, haben Sie hier ein wirklich nettes (Requisiten an Brad Touesnard), das das Kernobjekt einfach erweitert und daher ziemlich wiederverwendbar ist (machen Sie ein Plugin daraus):
class My_Book_Query extends WP_Query
{
function __construct( $args = array() )
{
// Forced/default args
$args = array_merge( $args, array(
'posts_per_page' => -1
) );
add_filter( 'posts_fields', array( $this, 'posts_fields' ) );
parent::__construct( $args );
}
public function posts_fields( $sql )
{
return "{$sql}, {$GLOBALS['wpdb']->terms}.name AS 'book_category'";
}
}
Sie können dann Ihre zweite / zusätzliche Abfrage ausführen, wie Sie im folgenden Beispiel sehen können. Vergessen Sie nicht, Ihre Anfrage danach zurückzusetzen.
$book_query = new My_Book_Query();
if ( $book_query->have_posts() )
{
while ( $book_query->have_posts() )
{
$book_query->the_post();
# ...do stuff...
} // endwhile;
wp_reset_postdata();
} // endif;