Löschen Sie die Hauptabfrage und ersetzen Sie sie

Es gibt viele gute Ressourcen , um die Hauptabfrage zu ändern oder sekundäre Schleifen hinzuzufügen …

Aber ich möchte die Hauptanfrage eigentlich komplett durch eine andere Abfrage ersetzen.

Ich entführe eine meiner Seiten, um im Wesentlichen als Kategorieseite zu dienen. (Hinweis: Ich wechsle von “page” zu “post” in meinem Bemühen, dies zu tun.) Aber wenn ich die Hauptabfrage ändere, indem ich das tue:

function front_page_announcements( $query ) { if ( $query->query_vars['page_id'] == 84 && $query->is_main_query() && !$query->is_admin ) { $query->set("category_name", "special-announcement"); $query->set("page_id", NULL); } } add_action( 'pre_get_posts', 'front_page_announcements' ); 

Ich bekomme am Ende jede Seite (nicht Post) in der database. Was ich eigentlich will, ist jeder Beitrag (nicht Seite) mit einer Kategorie-ID von 3 oder special-announcement in meinem Fall.

Ich möchte keine unnötigen Aufrufe an die database machen, also scheint es, als ob der pre_get_posts Aktions-Hook das ist, was ich will, aber ich kann es nicht herausfinden. Auch nur $query = new WP_Query('cat=3') scheint nicht zu funktionieren.

Solutions Collecting From Web of "Löschen Sie die Hauptabfrage und ersetzen Sie sie"

Wenn 'pre_get_posts' ausgetriggers wird, gibt es eine Menge Dinge, die WordPress bereits getan hat, wie das Einrichten aller Abfragevariablen (auch die Abfrage, die Sie nicht senden) und das Einrichten aller bedingten Eigenschaften (alle is_* Eigenschaften). Also, wenn Sie die Abfrage vollständig ersetzen möchten, sollten Sie alle diese Dinge zurücksetzen und Ihre eigenen setzen.

In der Tat, auch wenn Ihr Code funktioniert, wird WordPress page.php als Vorlage verwenden.

Es gibt jedoch einen einfacheren Ansatz: Handeln Sie, bevor WordPress alle Dinge erledigt.

Ein guter Platz ist der 'request' Filter-Hook, zu der Zeit hat WordPress die Abfrage vars von url erstellt und wird diese vars an WP_Query , und Sie können Abfrageargumente abfangen und ändern, bevor sie gesendet werden.

Diese Aktion wird von der WP class ausgetriggers und übergibt die zu definierenden Abfragevariablen ( siehe Code ).

 add_filter( 'request', function( array $query_vars ) { // triggered also in admin pages if ( is_admin() ) return $query_vars; // you should check also for page slug, because when pretty permalink are active // WordPress use 'pagename' query vars, not 'page_id' $id = isset($query_vars['page_id']) && (int) $query_vars['page_id'] === 84; // remember to replace "slug" with real page slug $name = isset($query_vars['pagename']) && $query_vars['pagename'] === 'slug'; if ( ( $id || $name) && ! isset($query_vars['error']) ) { $query_vars = array('category_name' => 'special-announcement'); } return $query_vars; }); 

Ersetzen Sie 'slug' durch den echten Slug Ihrer Seite, dann lassen Sie WordPress seine Arbeit machen.

Beachten Sie, dass ich nicht nach der Hauptabfrage suche, weil 'request' nur für die Hauptabfrage ausgetriggers wird.

Wenn Sie eine bestimmte Vorlage verwenden möchten, sollten Sie einen Filter für template_include andernfalls wird 'category.php' (oder die richtige Vorlage entsprechend der Vorlagenhierarchie ) verwendet.