webentwicklung-frage-antwort-db.com.de

Verwenden von pre_get_posts zum Umschreiben der Suchabfrage, um Posts aus mehreren Taxonomien anzuzeigen

Das scheint ganz einfach zu sein, aber ich bleibe dran!

Wenn ein Benutzer nach "Alice" sucht, möchte ich ihm alle Posts mit den benutzerdefinierten Taxonomiebedingungen "Bob" und "Carol" anzeigen, unabhängig davon, ob diese Posts die Zeichenfolge "Alice" enthalten oder nicht.

Ich kann die tax_query der Abfrage so einstellen, dass nur Posts mit den Begriffen 'bob' und 'carol' angezeigt werden. Die eigentliche Suchanfrage kann jedoch nicht zurückgesetzt werden, sodass alle Posts angezeigt werden, nicht nur Posts mit 'alice' ' in ihnen.

Dies ist der Filter, mit dem ich die tax_query ändere:

if ( !$query->is_search )
    return $query;

$taxquery = array(
    'relation' => 'OR',
    array(
        'taxonomy' => 'people',
        'field' => 'slug',
        'terms' => array( 'bob' ),
    ),
    array(
        'taxonomy' => 'people',
        'field' => 'slug',
        'terms' => array( 'carol' ),
    )
);

$query->set( 'tax_query', $taxquery );
return $query;

aber dies zum Einstellen der Suchabfrage zu verwenden, funktioniert nicht:

$queryvars = array(
        's' => ''
);
$query->set( 'query_vars', $queryvars );
4
Jairus Khan

Es funktioniert nicht, weil Sie set nicht verwenden können, um alle Abfragevariablen zu ändern. Am einfachsten ist es, 's' auf eine leere Zeichenfolge zu setzen:

add_action( 'pre_get_posts', function( $query ) {

  if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
    $taxquery = array( ... );
    $query->set( 'tax_query', $taxquery );
    $query->set('s', '' );
  }

});

Auf diese Weise betrachtet WordPress die Anfrage weiterhin als Suche, sodass die Vorlage search.php verwendet wird, um Ergebnisse anzuzeigen, und wenn Sie is_search() aufrufen, ist das Ergebnis TRUE.

Wenn Sie möchten, dass WordPress die Anfrage nicht mehr als Suche betrachtet, müssen Sie auch $query->query_vars['s'] manuell deaktivieren und $query->is_search auf false setzen:

add_action( 'pre_get_posts', function( $query ) {

  if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
    $taxquery = array( ... );
    $query->set( 'tax_query', $taxquery );
    $query->set('s', '' );
    unset( $query->query['s'] );
    $query->is_search = FALSE;
  }

});

Dabei betrachtet WordPress die Anfrage nicht mehr als Suche und verwendet index.php als Vorlage.

Wenn Sie eine andere Vorlage verwenden möchten, z. taxonomy.php Sie müssen den 'template_include'-Filter verwenden:

add_action( 'pre_get_posts', function( $query ) {

  if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
    $taxquery = array( ... );
    $query->set( 'tax_query', $taxquery );
    $query->set('s', '' );
    unset( $query->query['s'] );
    $query->is_search = FALSE;
    add_filter( 'template_include', function() {
      return locate_template( 'taxonomy.php' )
    }, 0 );
  }

});
7
gmazzap