Wann wird $wp_query initialisiert und wie kann es überschrieben werden?

Lesezeit: 2 Minuten

Ich versuche, eine neue Abfragefunktion mit zu schreiben WP_Query Objekt.

Ich habe eine neue Vorlagendatei erstellt und Folgendes eingefügt:

        $query_args = array(
            'post_type' => 'page',
            'post_parent=41',
        );

        // The Featured Posts query.
        $results = new WP_Query($query_args);

Aber welche Argumente ich auch verwende, die Abfrage ändert sich nicht. Es sieht so aus, als ob die Abfrage bereits initialisiert ist und eine neue erstellt WP_Query hat keine Auswirkung auf die bestehende Abfrage.

Die einzige WordPress-Funktion, die vor meinem Code aufgerufen wird, ist get_header() die keinen Anruf enthält WP_Query oder query_posts.

Ich habe die folgende Zeile eingefügt, um herauszufinden, was die eigentliche SQL-Abfrage ist:

echo $GLOBALS['wp_query']->request;

Die eigentliche SQL-Abfrage lautet:

SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND (wp_posts.ID = '14') AND wp_posts.post_type="page" ORDER BY wp_posts.post_date DESC

Diese Abfrage ändert sich nicht, wenn ich meine ändere $query_args.

Ich frage mich, wann die globale Variable $wp_query initialisiert ist und was soll ich tun, um meine eigene Abfrage zu verwenden?

Sie erstellen eine Neu WP_Query Objekt und speichern Sie es unter $results. Dort befinden sich die Ergebnisse Ihrer Abfrage, nicht darin $GLOBALS['wp_query']. Natürlich wird nicht überschrieben $wp_query. Sie sind verschiedene Dinge. Versuchen var_dump($results) stattdessen.

Sie können überschreiben $wp_query indem Sie eine neue erstellen WP_Query Objekt so: $wp_query = new WP_Query($query_args);. Aber das ist nicht effizient. Sie führen zwei Abfragen aus, wenn Sie nur eine benötigen. Der bessere Weg, dies zu tun, ist, sich einzuklinken pre_get_posts. Etwas wie:

function alter_query_so_15250127($qry) {
   if ( $qry->is_main_query() && is_page('featured-posts-page') ) {
     $qry->set('post_type','page');
     $qry->set('post_parent',41);
   }
}
add_action('pre_get_posts','alter_query_so_15250127');

Das if Bedingung ist sehr wichtig. Sie müssen diese Zeile verwenden, um sicherzustellen, dass der Filter nur auf den Seiten ausgelöst wird, auf denen er ausgelöst werden soll. Ihre Frage ist nicht detailliert genug, um die genauen Bedingungen zu ermitteln.

  • Um diese Antwort zu vervollständigen. Ich musste auch einige Werte überschreiben und auf null setzen, um die Abfrage auszuführen: $qry-> set('p' , null); $qry-> set( 'page_id' , null);

    – Rufein

    3. Februar 2015 um 15:20 Uhr


Schauen Sie sich das folgende Diagramm an, wie es in veröffentlicht wurde http://codex.wordpress.org/Function_Reference/query_posts
Geben Sie hier die Bildbeschreibung ein

1384700cookie-checkWann wird $wp_query initialisiert und wie kann es überschrieben werden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy