web-dev-qa-db-ja.com

カスタム投稿検索結果の分離

カスタム投稿タイプがいくつかあるサイトがあります。顧客が検索すると、すべての異なる投稿の組み合わせが表示されます。この2つを同じページ上でセグメント化して、以下の例のようになるようにします。任意の助けがいただければ幸いです。

の検索結果を表示しています:really cool search
ビデオ管理
中央から Radiusはインタラクティブな地図機能と複数のモニターサポートを提供します。マルチモニタ環境用に設計されています... http://openeye.net/products/software/video-management


ナレッジベースのエントリ:
デバイスを修復しています
中央から Radiusはインタラクティブな地図機能と複数のモニターサポートを提供します。マルチモニタ環境向けに設計されています... http://openeye.net/?faq=video-management-repair

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

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

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

それからあなたのループの中でこのようなことをする:

$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

それを付け加えたいのは、@ bainternetの賛成投票の解決策は素晴らしいが、Media Libraryの検索機能を壊す可能性があるということだ。この問題と簡単な解決策は両方とも here と表示されます。

簡単な解決策は、上記のコードにこの条件を追加することです。

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

上記の解決策を少し微調整した後、私はこれがうまくいった。最初に、1つ以上の結果を取得するためにフィルタを変更する必要があります。

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

それからループは少し微調整される必要がありました。私は自分の結果をさまざまな情報で異なったスタイルにしたいと思ったので、さらに条件を追加しました。

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

基本的に唯一の変更点はフィルタと最後に省略された最後のdivです。それと「結果は見つかりませんでした」。これは私のサイトで働いています。

2
acrane