Usando pre_get_posts para reescribir la consulta de búsqueda y mostrar publicaciones de múltiples taxonomías
¡Esto parece que debería ser sencillo, pero estoy atascado!
Si un usuario busca 'alice', me gustaría mostrarle todas las publicaciones con los términos de taxonomía personalizada 'bob' y 'carol', independientemente de si esas publicaciones contienen la cadena 'alice' o no.
Puedo configurar el tax_query de la consulta para que solo muestre publicaciones con 'bob' y 'carol' como términos, pero no puedo restablecer la consulta de búsqueda real para que muestre todas las publicaciones, no solo las que contienen 'alice'.
Este es el filtro que estoy usando para cambiar el 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;
pero usar esto para establecer la consulta de búsqueda no funciona:
$queryvars = array(
's' => ''
);
$query->set( 'query_vars', $queryvars );

No funciona porque no puedes usar set
para cambiar todas las variables de consulta. La forma más sencilla de hacerlo es establecer 's'
como una cadena vacía:
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', '' );
}
});
De esta manera, WordPress seguirá considerando la solicitud como una búsqueda, por lo que se usará la plantilla search.php
para mostrar los resultados y si llamas a is_search()
el resultado será TRUE
.
Si deseas que WordPress ya no considere la solicitud como una búsqueda, también debes eliminar manualmente $query->query_vars['s']
y establecer $query->is_search
en falso:
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;
}
});
Al hacer esto, WordPress ya no considerará la solicitud como una búsqueda y usará index.php
como plantilla.
Si deseas usar otra plantilla, por ejemplo taxonomy.php
, necesitas usar el 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 );
}
});
