web-dev-qa-db-de.com

Überschreiben der Schleife mit Filter oder Haken

Ich versuche, das $wp_query-Objekt für eine bestimmte Kategorie zu ersetzen, ohne eine neue Vorlage erstellen und dort ein neues WP_Query-Objekt erstellen zu müssen.

Mein Ziel ist es, die für The Loop verfügbaren Daten von der Standardeinstellung für diese Anforderung in eine benutzerdefinierte Abfrage zu ändern.

add_filter( 'pre_get_posts', 'custom_wpquery' );

function custom_wpquery( $query ){
global $wp_query;
   if (is_category(121)) {
             if ($wp_query === $query) {
                   $query = new WP_Query('page_id=146');
                   $query->set('page_id', 146);
             }
   }
  return $query;
};

Das scheint The Loop überhaupt nicht zu beeinflussen. Was mache ich falsch?

4
Andrei

Dies scheint zu funktionieren, aber ich wäre daran interessiert, von anderen zu hören, ob dies der "richtige" Weg ist, um diese Art der Außerkraftsetzung bereitzustellen. Ich gehe davon aus, dass Sie eine Kategoriearchivseite besuchen, z. B. http://www.example.com/category/computers/ .

// landing page = 188
// category = "computers" (#8)

function custom_wpquery( $query ){
    // the main query
    global $wp_the_query;

    if ( 'computers' === $query->get( 'category_name' ) ) {
        if ( $wp_the_query === $query) {
            // reset and override the active query
            $query->init();
            $query->query( 'page_id=188' );
        }
    }
};
add_filter( 'pre_get_posts', 'custom_wpquery' );

Dies sollte wahrscheinlich auch $query->is_archive testen.

1