Como separar os resultados da pesquisa de postagem personalizada

3

Eu tenho um site com alguns tipos de postagem personalizados. Quando um cliente pesquisa, mostra uma combinação de todas as postagens diferentes. Gostaria de segmentar os dois na mesma página, resultando em algo parecido com o exemplo abaixo. Qualquer ajuda seria apreciada.

  

Mostrando resultados para: pesquisa muito legal em Gerenciamento de Vídeo
  de uma localização central. Raio oferece   capacidade de mapa interativo, e   suporte a múltiplos monitores. Desenhado para   um monitor de vários ambientes ...    enlace

     

Entradas da base de conhecimento:
Como reparar seu dispositivo
  de uma localização central. Raio oferece   capacidade de mapa interativo, e   suporte a múltiplos monitores. Desenhado para   um monitor de vários ambientes ...    enlace

Exemplo do meu loop de loop-search.php

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h4 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h4>
<?php if ( is_archive() || is_search() ) : // Only display excerpts for archives and search. ?>
    <div class="entry-summary">
        <?php the_post_thumbnail; ?>
        <?php if (function_exists('relevanssi_the_excerpt')) { relevanssi_the_excerpt(); }; ?>
        <a href="<?php the_permalink(); ?>"><?php the_permalink(); ?></a>
    </div><!-- .entry-summary -->
<?php else : ?>
    <div class="entry-content">
        <?php the_post_thumbnail; ?>
        <?php the_content( __( 'Continue reading', 'twentyten' ) ); ?>
        <?php wp_link_pages( array( 'before' => '<div class="page-link">' . __( 'Pages:', 'twentyten' ), 'after' => '</div>' ) ); ?>
        <a href="<?php the_permalink(); ?>"><?php the_permalink(); ?></a>
    </div><!-- .entry-content -->
<?php endif; ?>

minhas alterações no search.php

<?php if ( have_posts() ) : $posts_per_page = 20; ?>
    <span style="font-size:18px;" class="page-title"><?php printf( __( 'Showing results for: %s', 'twentyten' ), '<span>' . get_search_query() . '</span>' ); ?></span>
    <?php
    /* Run the loop for the search to output the results.
     * If you want to overload this in a child theme then include a file
     * called loop-search.php and that will be used instead.
     */
     get_template_part( 'loop', 'search' );
    ?>
<?php else : ?>
    <div id="post-0" class="post no-results not-found">
        <h2 class="entry-title"><?php _e( 'Nothing Found', 'twentyten' ); ?></h2>
        <div class="entry-content">
    <?php if (function_exists('relevanssi_didyoumean')) {
        relevanssi_didyoumean(get_search_query(), "<p>Sorry, but nothing matched your search criteria. Please try again with some different keywords. Or you can also try ", "</p>", 5);
    }?>
            <?php related_searches(); ?>
        </div><!-- .entry-content -->
    </div><!-- #post-0 -->
<?php endif; ?>
    
por Zach Shallbetter 16.04.2011 / 00:13

3 respostas

8

Você pode agrupar postagens por tipo usando o gancho de filtro posts_groupby :

add_filter('posts_groupby', 'group_by_post_type' );
function group_by_post_type( $groupby )
{
  global $wpdb;
  if( !is_search() ) {
    return $groupby;
  }
  $mygroupby = "{$wpdb->posts}.post_type";
  if( !strlen(trim($groupby))) {
    // groupby was empty, use ours
    return $mygroupby;
  }
  // wasn't empty, append ours
  return $groupby . ", " . $mygroupby;
}

Então, no seu loop de fazer algo assim:

$last_type="";
$typecount = 0;
while (have_posts()){
    the_post();
    if ($last_type != $post->post_type){
        $typecount = $typecount + 1;
        if ($typecount > 1){
            echo '</div>'; //close type container
        }
        // save the post type.
        $last_type = $post->post_type;
        //open type container
        switch ($post->post_type) {
            case 'post':
                echo "<div class=\"post container\"><h2>posts search result</h2>";
                break;
            case 'page':
                echo "<div class=\"page container\"><h2>pages search result</h2>";
                break;
            case 'custom_type_name':
                echo "<div class=\"custom container\"><h2>custom post type search result</h2>";
                break;
            //add as many as you need.
        }
    }

    //...
    // do your loop 
    //...
}
    
por Bainternet 16.04.2011 / 02:55
6

Só queria acrescentar que, embora a solução votada pelo @bainternet seja ótima, ela pode quebrar a função de pesquisa da Biblioteca de Mídia. Esse problema, e uma solução simples, aparecem aqui .

A solução simples é adicionar essa condição ao redor do código acima:

if (!is_admin()) {
  [your code here]
}
    
por Aaron 24.09.2012 / 19:00
2

Eu tenho esse trabalho depois de ajustar a solução acima um pouco. Primeiro, o filtro precisa ser alterado para recuperar mais do que 1 resultado:

add_filter('posts_orderby', 'group_by_post_type', 10, 2);
function group_by_post_type($orderby, $query) {
global $wpdb;
if ($query->is_search) {
    return $wpdb->posts . '.post_type DESC';
}
// provide a default fallback return if the above condition is not true
return $orderby;
}

Em seguida, o loop precisava ser ajustado um pouco. Eu queria estilizar meus resultados de maneira diferente com informações diferentes, então adicionei uma condição adicional.

<?php if(have_posts()) : ?>

<?php   
$last_type="";
$typecount = 0;
while (have_posts()) :
the_post();
if ($last_type != $post->post_type){
    $typecount = $typecount + 1;
    if ($typecount > 1){
        echo '</div><!-- close container -->'; //close type container
    }
    // save the post type.
    $last_type = $post->post_type;
    //open type container
    switch ($post->post_type) {
        case 'post':
            echo "<div class=\"postsearch container\"><h2>Blog Results</h2>";
            break;
        case 'product':
            echo "<div class=\"productsearch container\"><h2>Product Search   Results</h2>";
            break;

    }
} 
?>

    <?php if('post' == get_post_type()) : ?>
     <li class="post"><?php the_title(); ?></li>
<?php endif; ?>

  <?php if('product' == get_post_type()) : ?>
 <li class="product"><?php the_title(); ?></li>
  <?php endif; ?>


<?php endwhile; ?>

<?php else : ?>
<div class="open-a-div">
<p>No results found.</p>    

<?php endif; ?>       

</div><!-- throw a closing div in --> 

Basicamente, as únicas alterações são o filtro e o div de fechamento que foram omitidos no final. Isso e o "Nenhum resultado encontrado". Isso está funcionando no meu site.

    
por acrane 01.05.2014 / 21:28