grupo de wordpress por tipo de publicación en la página de búsqueda

2 minutos de lectura

avatar de usuario
jessé

Me gustaría mostrar los resultados de búsqueda agrupados por tipo de publicación. Tengo publicaciones regulares, páginas y un tipo de publicación personalizada de producto. ¿Cómo lograría esto editando el siguiente código? El siguiente código solo muestra todas las publicaciones y páginas en este momento.

<?php
 while (have_posts()) : the_post();  
 echo "<h1>";
 echo $post->post_type;
 echo $post->post_title;
 echo "</h1>";
 endwhile;
 ?>

avatar de usuario
Lucano Vera

Este código altera la consulta de búsqueda original para ordenar los resultados por tipo de publicación en el orden que seleccione. Hay otras soluciones, pero esta es la única que encontré que no rompe la paginación o requiere múltiples consultas.

add_filter('posts_orderby', 'my_custom_orderby', 10, 2);

function my_custom_orderby($orderby_statement, $object) {
  global $wpdb;

  if (!is_search())
    return $orderby_statement;

  // Disable this filter for future queries (only use this filter for the main query in a search page)
  remove_filter(current_filter(), __FUNCTION__);

  $orderby_statement = "FIELD(".$wpdb - > prefix.
  "posts.post_type, 'post-type-c', 'post-type-example-a', 'custom-post-type-b') ASC";

  return $orderby_statement;
}

avatar de usuario
marcado

En tu caso, yo haría dos cosas:

  1. filtrar la consulta inicial de la página de búsqueda a un tipo de publicación en particular
  2. usa uno WP_Query llamar para cada tipo de publicación restante

Para (1), esto iría en su functions.php:

<?php
function SearchFilter($query) {
    if ($query->is_search && !is_admin()) {
        if (isset($query->query["post_type"])) {
            $query->set('post_type', $query->query["post_type"]);
        } else {
            $query->set('post_type', 'product');
        }
    }
    return $query;
}
add_filter('pre_get_posts','SearchFilter');
?>

Para (2), adapte el código que proporcionó de su archivo de plantilla:

<?php
$s = isset($_GET["s"]) ? $_GET["s"] : "";
$posts = new WP_Query("s=$s&post_type=post");
if ( $posts->have_posts() ) :
    while ( $posts->have_posts() ) : $posts->the_post();
        echo "<h1>";
        echo $post->post_type;
        echo $post->post_title;
        echo "</h1>";
    endwhile;
    wp_reset_postdata();
endif;
?>

Puede reutilizar este código para cada otro tipo de publicación.

Lo mejor es evitar el uso query_posts… ver consultar publicaciones sin query_posts (incluso los desarrolladores de WordPress están de acuerdo).

  • Buen enfoque, pero vale la pena mencionar que su respuesta no respeta la paginación.

    – David

    31 de octubre de 2013 a las 13:39

Debe modificar la consulta de publicación para reordenar las cosas. Ejecutaría esto justo antes de ingresar al bucle. Puede leer más sobre query_posts en el códice de WordPress.

http://codex.wordpress.org/Function_Reference/query_posts

global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => array('type1', 'type2') ) );
query_posts( $args );
//the loop

¿Ha sido útil esta solución?