¿Cómo filtro el orden de los resultados de búsqueda?
¿Hay alguna manera de que mis resultados de búsqueda muestren primero las Páginas y después los posts?
Mi sitio es un sitio de negocios con un blog, en lugar de ser principalmente un blog. Las páginas estáticas tienen todo el contenido sobre "esto es lo que hacemos" y lo ideal sería que aparecieran primero cuando alguien busca varios servicios. Las entradas del blog son más ligeras en tono, pero son más recientes por lo que aparecen primero.
El bucle de búsqueda es del tema Kubrick:
<?php if (have_posts()) : ?>
<div class="center">
<div class="padding-bottom">
<h1><?php _e('Nuestros Resultados de Búsqueda', 'kubrick'); ?></h1>
</div>
</div>
<?php while (have_posts()) : the_post(); ?>
<div <?php post_class(); ?>>
<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php printf(__('Enlace Permanente a %s', 'kubrick'), the_title_attribute('echo=0')); ?>"><?php the_title(); ?></a></h3><?php the_excerpt(); ?>
</div>
<?php endwhile; ?>
<?php else : ?>
<h2 class="center"><?php _e('Sin suerte. ¿Intentar de nuevo?', 'kubrick'); ?></h2>
<?php get_search_form(); ?>
<?php endif; ?>
¿Podría agregar algo allí para especificar que cualquier resultado de una "página" se listará antes que los resultados de un "post"? ¿O WordPress no distingue realmente entre páginas y posts en ese nivel? Ya que las páginas estáticas son "estáticas", ¿tal vez podría usar IDs?
¡Gracias!

Puedes usar el filtro posts_orderby
para modificar el orden de los posts devueltos. Esto se ejecutará para cada consulta (tanto en el frontend como en el backend), así que asegúrate de verificar que quieres alterar el orden usando is_admin
, is_search
, etc.
En el ejemplo siguiente, los resultados de búsqueda se ordenan por tipo de post en orden ascendente (por ejemplo, páginas primero y luego posts), y luego por fecha de publicación en orden descendente.
add_filter('posts_orderby','my_sort_custom',10,2);
function my_sort_custom( $orderby, $query ){
global $wpdb;
if(!is_admin() && is_search())
$orderby = $wpdb->prefix."posts.post_type ASC, {$wpdb->prefix}posts.post_date DESC";
return $orderby;
}
Aclaración: si tienes un tipo de post llamado 'advert' (anuncio), y este aparece en los resultados de búsqueda, aparecerá antes que las páginas.
Dejando de lado la aclaración anterior, esta es una forma relativamente económica de lograr lo que buscas.

Hola Stephen: esto suena exactamente como lo que necesito - ¡Gracias! Pero ¿dónde coloco este filtro? ¿En el bucle de búsqueda que publiqué? (Si es así, ¿después de qué?) ¿En el functions.php?
