Utilizarea pre_get_posts pentru a rescrie interogarea de căutare și afișarea postărilor din multiple taxonomii
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 );

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