Utilizzo di pre_get_posts per riscrivere la query di ricerca e mostrare post da multiple tassonomie

20 mar 2014, 18:27:27
Visualizzazioni: 19K
Voti: 7

Sembra che dovrebbe essere semplice, ma sono bloccato!

Se un utente cerca 'alice', vorrei mostrargli tutti i post con i termini di tassonomia personalizzata 'bob' e 'carol', indipendentemente dal fatto che quei post contengano la stringa 'alice' o meno.

Riesco a impostare il tax_query della query in modo che mostri solo i post con 'bob' e 'carol' come termini, ma non riesco a resettare la query di ricerca effettiva in modo che mostri tutti i post, non solo quelli con 'alice'.

Questo è il filtro che sto usando per modificare il tax_query:

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;

ma usare questo per impostare la query di ricerca non funziona:

$queryvars = array(
        's' => ''
);
$query->set( 'query_vars', $queryvars );
1
Commenti

Puoi modificare la tua domanda per includere il codice che hai provato finora? Grazie! :)

Dan Dan
20 mar 2014 18:44:30
Tutte le risposte alla domanda 1
0
12

Non funziona perché non puoi usare set per cambiare tutte le variabili di query. Il modo più semplice per ottenere il risultato è impostare 's' a una stringa vuota:

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', '' );
  }

});

In questo modo, WordPress continuerà a considerare la richiesta come una ricerca, quindi verrà utilizzato il template search.php per mostrare i risultati e se chiami is_search() il risultato sarà TRUE.

Se vuoi che WordPress non consideri più la richiesta come una ricerca, devi anche annullare manualmente $query->query_vars['s'] e impostare $query->is_search su false:

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;
  }

});

Facendo ciò, WordPress non considererà più la richiesta come una ricerca e utilizzerà index.php come template.

Se vuoi utilizzare un altro template, ad esempio taxonomy.php, devi usare il filtro 'template_include':

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 );
  }

});
21 mar 2014 03:15:17