Una forma fácil de procesar los resultados de búsqueda antes de mostrarlos

4

Tengo varios formularios de búsqueda en mi sitio y quiero que muestren resultados diferentes. Mi sitio web tiene una jerarquía muy estricta y el formulario de búsqueda en un sitio principal solo debería mostrar los resultados de sus páginas secundarias.

Mi plan era incluir diferentes campos ocultos en las diferentes páginas principales que contienen el ID de esa página en particular. En el search.php , quería procesar los resultados y filtrar las páginas y las publicaciones que no tienen relación con la página principal.

¿Hay una manera fácil de lograr esto?

Gracias de antemano.

EDIT 1

Este es mi search.php
<?php 
if (have_posts()){
  while(have_posts()){
    the_post(); ?>
    <div>
      <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
      <p><?php echo get_the_author(); ?> - <?php echo get_the_date(); ?></p>
      <p><?php echo get_the_excerpt(); ?></p>
    </div>
    <?php
  }
} else{ ?>
  <h3>Sorry</h3>
  <p>We are sorry but we could not find any matching articles on our site. Please try again with an other search request.</p>
  <?php
    get_search_form ();
}
?>

Y el searchform.php :

<form role="search" method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>">
  <label>Search...</label>
  <input type="text" name="s" id="s" value="<?php echo get_search_query(); ?>" placeholder="Search..." />
  <input type="hidden" name="post_parent" value="<?php echo (int)get_the_ID(); ?>" />
  <button type="submit"><i class="fa fa-search" aria-hidden="true"></i></button>
</form>

EDIT 2

También agregué <?php wp_reset_query(); ?> antes del if(have_posts()){} . Esto resulta en ningún cambio. Las páginas todavía se muestran.

    
pregunta Sam 04.07.2016 - 14:56

2 respuestas

2

Puede usar el filtro pre_get_posts para filtrar lo que necesita. Hay un ejemplo sobre cómo hacer esto en Codex:

enlace

function search_filter($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $query->set('post_type', 'post');
    }
  }
}

add_action('pre_get_posts','search_filter');

Además, este artículo puede ayudarlo a editar el formulario de búsqueda ...

    
respondido por el user1049961 04.07.2016 - 17:18
0

Mientras que el filtro pre_get_posts le permitirá modificar la consulta principal antes de que suceda, permitiéndole agregar requisitos adicionales, ¡en este caso no es necesario! Puede hacerlo todo con la URL y el formulario de búsqueda

Primero, las variables de consulta pasadas a WP_Query pueden usarse en la URL. post_parent es la var de consulta que desea.

Así que si tenemos esto:

<form action="/" method="get">
    <input type="text" name="s" />
    <input type="hidden" name="post_parent" value="<?php echo (int)get_the_ID(); ?>"/>
    <input type="hidden" name="post_type" value="page"/>
</form>

Entonces, cualquier resultado de búsqueda se limitará a aquellos cuyo post_parent es la página de la que provino la búsqueda. Verás URL como /?s=test&post_parent=123 .

Este truco se puede usar para filtrar por categorías y autores, por ejemplo, buscando una categoría:

/category/example/?s=test

Solo se muestran publicaciones de un autor en particular en un archivo de fecha:

/2016/?author=123

    
respondido por el Tom J Nowell 05.07.2016 - 01:12

Lea otras preguntas en las etiquetas