web-dev-qa-db-fra.com

Séparation des résultats de recherche de publication personnalisée

J'ai un site qui a quelques types de messages personnalisés. Lorsqu'un client effectue une recherche, il affiche une combinaison de tous les articles. Je voudrais segmenter les deux sur la même page pour obtenir quelque chose qui ressemble à l'exemple ci-dessous. Toute aide serait appréciée.

Affichage des résultats pour: recherche vraiment cool
Gestion vidéo
depuis un emplacement central. Radius offre une fonctionnalité de carte interactive et une prise en charge de plusieurs moniteurs. Conçu pour un environnement à plusieurs mon ... http://openeye.net/products/software/video-management


Entrées de la base de connaissances:
Réparation de votre appareil
depuis un emplacement central. Radius offre une fonctionnalité de carte interactive et une prise en charge de plusieurs moniteurs. Conçu pour un environnement à plusieurs moniteurs ... http://openeye.net/?faq=video-management-repair

Exemple de ma boucle 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; ?>

mes modifications à 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; ?>
3
Zach Shallbetter

Vous pouvez regrouper les publications par type en utilisant le filtre 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;
}

Ensuite, dans votre boucle de faire quelque chose comme ça:

$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 
    //...
}
8
Bainternet

Je voulais juste ajouter que si la solution votée de @ bainternet est géniale, elle peut casser la fonction de recherche de la médiathèque. Ce problème, et une solution simple, apparaissent tous les deux ici .

La solution simple consiste à ajouter cette condition autour du code ci-dessus:

if (!is_admin()) {
  [your code here]
}
6
Aaron

Cela fonctionne après avoir peaufiné un peu la solution ci-dessus. Tout d'abord, le filtre doit être modifié pour récupérer plus d'un résultat:

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;
}

Ensuite, la boucle devait être légèrement modifiée. Je souhaitais attribuer un style différent à mes résultats avec des informations différentes.

<?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 --> 

Fondamentalement, les seuls changements sont le filtre et la division qui a été omis à la fin. Cela et le "Aucun résultat trouvé." Cela fonctionne sur mon site.

2
acrane