Utilizarea pre_get_posts pentru a rescrie interogarea de căutare și afișarea postărilor din multiple taxonomii

20 mar. 2014, 18:27:27
Vizualizări: 19K
Voturi: 7

Pare că ar trebui să fie simplu, dar sunt blocat!

Dacă un utilizator caută 'alice', aș dori să-i afișez toate postările care au termenii de taxonomie personalizată 'bob' și 'carol', indiferent dacă aceste postări conțin șirul 'alice' sau nu.

Am reușit să setez tax_query-ul interogării astfel încât să afișeze doar postările cu termenii 'bob' și 'carol', dar nu pot reseta interogarea de căutare efectivă pentru a afișa toate postările, nu doar pe cele care conțin 'alice'.

Acesta este filtrul pe care îl folosesc pentru a modifica 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;

dar folosirea acestuia pentru a seta interogarea de căutare nu funcționează:

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

Poți să modifici întrebarea ta pentru a include ce cod ai încercat până acum? Mulțumesc! :)

Dan Dan
20 mar. 2014 18:44:30
Toate răspunsurile la întrebare 1
0
12

Nu funcționează pentru că nu poți folosi set pentru a schimba toți parametrii de interogare. Cea mai simplă metodă este să setezi 's' la un șir gol:

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

});

În acest fel, WordPress va considera în continuare cererea ca fiind o căutare, așa că șablonul search.php va fi folosit pentru afișarea rezultatelor, iar dacă apelezi is_search() rezultatul va fi TRUE.

Dacă dorești ca WordPress să nu mai considere cererea ca fiind o căutare, trebuie să elimini manual $query->query_vars['s'] și să setezi $query->is_search la 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;
  }

});

Făcând acest lucru, WordPress nu va mai considera cererea ca fiind o căutare și va folosi index.php ca șablon.

Dacă dorești să folosești un alt șablon, de exemplu taxonomy.php, trebuie să utilizezi filtrul '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