Usando pre_get_posts para reescribir la consulta de búsqueda para mostrar publicaciones de múltiples taxonomías

2

Esto parece que debería ser sencillo, ¡pero estoy atascado en ello!

Si un usuario busca 'alice', me gustaría mostrarles todas las publicaciones con los términos de taxonomía personalizados de 'bob' y 'carol', independientemente de si esas publicaciones contienen la cadena 'alice' en ellas o no.

Puedo configurar la consulta de consulta de la consulta para que solo muestre las 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 publicaciones con 'alice' en ellos.

Este es el filtro que estoy usando para cambiar la consulta de impuestos:

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 configurar la consulta de búsqueda no funciona:

$queryvars = array(
        's' => ''
);
$query->set( 'query_vars', $queryvars );
    
pregunta Jairus Khan 20.03.2014 - 17:27

1 respuesta

5

No funciona porque no puedes usar set para cambiar todas las variables de consulta. La forma más sencilla de hacer el truco es establecer 's' en 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 de búsqueda, por lo que la plantilla search.php se usará para mostrar los resultados y, si llama a is_search() , el resultado será TRUE .

Si desea que WordPress ya no considere la solicitud de una búsqueda, también debe desactivar manualmente $query->query_vars['s'] y configurar $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 hacerlo, WordPress ya no considerará la solicitud de búsqueda y usará index.php como plantilla.

Si desea utilizar otra plantilla, por ejemplo, taxonomy.php necesita usar 'template_include' filter:

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

});
    
respondido por el gmazzap 21.03.2014 - 02:15

Lea otras preguntas en las etiquetas