Función de búsqueda de WordPress para buscar solo publicaciones

4 minutos de lectura

avatar de usuario
Davey

Quiero usar la función de búsqueda de wordpress pero quiero que solo busque en las publicaciones de mi blog y excluya mis páginas estáticas de la consulta. ¿Como hacer esto? No me opongo a usar un complemento.

  • Su solución se sobrescribirá cuando actualice WordPress.

    – kͩeͣmͮpͥ ͩ

    14 de noviembre de 2012 a las 12:25

la respuesta esta aqui

http://www.shilling.id.au/2011/06/23/wordpress-search-only-show-post-and-not-pages/

<?php
function SearchFilter($query) {
    if ($query->is_search) {
        $query->set('post_type', 'post');
    }
    return $query;
}
add_filter('pre_get_posts','SearchFilter');
?>

  • La respuesta aceptada (y la publicación del foro vinculada) describen resultados deficientes. Nunca es una buena idea editar archivos principales, y omitir los resultados en el bucle foreach podría generar problemas cuando se trata de la paginación. ¡Este gancho es una solución mucho mejor!

    – mjsarfatti

    7 de julio de 2013 a las 13:48

  • esto es en realidad no una buena respuesta, a menos que solo desee buscar publicaciones en CADA campo de búsqueda en su sitio. Por lo tanto, cualquier campo de búsqueda en el área de administración y en cualquier otro lugar probablemente se romperá, a menos que desee usarlos solo para buscar publicaciones. Esto puede no ser obvio inmediatamente después de la implementación de esta solución, pero en el futuro puede estar seguro de que causará problemas.

    – mikeybeck

    27 de agosto de 2015 a las 4:51


  • ¿Hay alguna manera de hacer que esta funcionalidad funcione en una barra de búsqueda que solo aparece en las páginas de blog? Parece que esto es para el administrador de WP, pero estoy tratando de hacer algo en el lado del usuario para que puedan buscar publicaciones de blog desde cualquier página /blog/.

    – Jaime

    23 de febrero de 2021 a las 21:33

Simplemente agregue <input type="hidden" name="post_type" value="post" /> al formulario de búsqueda de temas… saludos!

  • Desafortunadamente, esto no es posible (o fácil) de implementar en todos los casos. Por ejemplo, mi formulario de búsqueda está hecho por Elementor y no puedo editarlo.

    – Gerard Reches

    6 julio 2020 a las 19:00

Esta solución hace que la búsqueda recupere solo publicaciones si no ha especificado un tipo de publicación diferente. Este método no interferirá si especifica un tipo de publicación personalizada en un campo oculto en un campo de búsqueda diferente.

function searchFilter($query) {
    if ($query->is_search) {
        if ( !isset($query->query_vars['post_type']) ) {
            $query->set('post_type', 'post');
        }
    }
    return $query;
}
add_filter('pre_get_posts','searchFilter');

Esta página del foro de wp tiene un montón de ejemplos diferentes de cómo hacer esto dependiendo de dónde quieras editar tu sitio (creo que index.php o wp-includes/query.php son tus opciones):

http://wordpress.org/support/topic/possible-search-only-posts-exclude-pages

Las soluciones esbozadas son pobres. La edición del núcleo impide la capacidad de actualización de la instalación de WordPress: tendrá que repetir ese cambio cada vez que actualice, lo que debería estar haciendo. La otra solución coloca una carga innecesaria en la base de datos al filtrar los resultados después recuperándolos. La mejor solución:

En el archivo functions.php de su tema, agregue una nueva función para escribir un formulario de búsqueda:

function custom_search_form( $form, $value = "Search", $post_type="post" ) {
    $form_value = (isset($value)) ? $value : attribute_escape(apply_filters('the_search_query', get_search_query()));
    $form = '<form method="get" id="searchform" action="' . get_option('home') . "https://stackoverflow.com/" >
    <div>
        <input type="hidden" name="post_type" value="'.$post_type.'" />
        <input type="text" value="' . $form_value . '" name="s" id="s" />
        <input type="submit" id="searchsubmit" value="'.attribute_escape(__('Search')).'" />
    </div>
    </form>';
    return $form;
}

Ahora, en la plantilla donde desea el formulario (o dentro de cualquier widget que haya creado, esto podría registrarse fácilmente como un widget), esto:

<?= custom_search_form( null, 'Search posts', 'post'); ?>

Los argumentos podrían quedar fuera de la función y la llamada, pero los encuentro útiles. La clave de todo esto es la entrada oculta ‘post_type’, que pasa el valor a la consulta. El valor por defecto, postse asegurará de que solo se devuelvan las publicaciones.

  • En realidad, esto no funciona. Devuelve todas las páginas, así como las publicaciones en la búsqueda.

    – AndyWarren

    21 de abril de 2013 a las 14:10

  • En realidad, esto funciona. Esta es la mejor solución en mi opinión.

    – mikeybeck

    27 de agosto de 2015 a las 5:01

avatar de usuario
fomicz

<?php if ( have_posts() ) : while ( have_posts() ) : the_post();?>
<?php if (is_search() && ($post->post_type=='page')) continue; ?>

Prueba este y dime si funciona.

  • En realidad, esto no funciona. Devuelve todas las páginas, así como las publicaciones en la búsqueda.

    – AndyWarren

    21 de abril de 2013 a las 14:10

  • En realidad, esto funciona. Esta es la mejor solución en mi opinión.

    – mikeybeck

    27 de agosto de 2015 a las 5:01

avatar de usuario
profundo

Combinar la consulta con la consulta global.

   global $wp_query;    
   $args = array_merge( $wp_query->query, array( 'post_type' => 'post' ) );  
   query_posts( $args );

¿Ha sido útil esta solución?