it-swarm.com.de

Verwenden von is_main_query, um einen benutzerdefinierten Beitragstyp auf einer bestimmten Seite auszuwählen

Ich habe versucht, einige der von Andrew Nacin http://wordpress.tv/2012/06/15/andrew-nacin-wp_query/ diskutierten Ideen in meinen Workflow zu implementieren, und insbesondere versucht, mich von der Verwendung zu lösen query_posts oder eine neue WP_Query und ändern Sie stattdessen die Hauptabfrage. Bisher habe ich dies auf meiner Homepage ziemlich gut mit dem folgenden Code bearbeitet:

function some_name($query) {
    if ( $query->is_main_query() && $query->is_home() ) {
        $query->set( 'post_type', array( 'home_portfolio' ) );
    }
}
add_action( 'pre_get_posts', 'some_name');

Dies ändert einfach den post_type der Standardabfrage in home_portfolio. Ich musste die Standarddatei index.php verwenden und keine Seite als Startseite auswählen, damit dies funktioniert.

Ich möchte diese Methode auch auf bestimmten Seiten anwenden, bin mir aber nicht sicher, wie ich die Seiten aus functions.php ansteuern soll. Wenn ich $query->is_page(ID) verwende, gibt die Standardschleife auf der Seite bei jedem Versuch, den post_type zu ändern, den Wert 404 zurück.

Mit anderen Worten, es scheint mir, dass ich nur in der Lage sein sollte, $query->is_home() durch $query->is_page(ID) in functions.php zu ersetzen, und ich sollte in der Lage sein, auf diese spezifische Seiten-ID zu zielen, aber ich kann es nicht zum Laufen bringen.

Jede Hilfe wäre sehr dankbar. Ansonsten bin ich auf meiner Homepage sehr effizient, aber auf allen anderen Seiten werden immer noch mehrere Abfragen ausgeführt (im Vergleich zum Ändern der Hauptabfrage auf diesen Seiten).

3
patrickzdb

Die Bedingung is_home() gibt true zurück, wenn die aktuell angezeigte Seite der Index für Blogposts ist. Wenn Sie stattdessen gezielt auf die Titelseite der Website abzielen möchten, müssen Sie is_front_page() verwenden:

function wpse83754_filter_pre_get_posts( $query ) {
    if ( $query->is_main_query() && is_front_page() ) {
        $query->set( 'post_type', array( 'home_portfolio' ) );
    }
}
add_action( 'pre_get_posts', 'wpse83754_filter_pre_get_posts' );

Außerdem müssen Sie $query-> nicht an Aufrufe von is_home(), is_front_page() usw. anhängen. Sie müssen dies auch für is_main_query() tun, da Sie sicherstellen möchten, dass die zu filternde Abfrage speziell die Hauptabfrage ist, da eine bestimmte Seite über Folgendes verfügt mehrere Abfragen.

Wenn Sie also eine bestimmte Seite als Ziel festlegen möchten, rufen Sie einfach is_page( $id ) auf:

function wpse83754_filter_pre_get_posts( $query ) {
    if ( $query->is_main_query() && is_page( $id ) ) {
        $query->set( 'post_type', array( 'home_portfolio' ) );
    }
}
add_action( 'pre_get_posts', 'wpse83754_filter_pre_get_posts' );
3
Chip Bennett