web-dev-qa-db-ja.com

投稿の種類でソートされた検索結果

私はいくつかの投稿タイプ(正確には4つ)でサイトに取り組んでいます、そして検索結果ページを設定して投稿タイプで結果をフィルタ/ソートすることを試みています。

たとえば、検索結果に表示されている用語を検索すると、すべての投稿タイプから見つかったすべての投稿が表示されますが、上部には結果をソートしてそれぞれの投稿のみを表示するさまざまな投稿タイプの名前リンクがあります。タイプの投稿現在のところ、投稿タイプごとに検索結果ページに複数のループがありますが、テストすると、各ループに異なる投稿タイプのクエリがある場合でも、ループはすべて同じ結果を表示しています。

その投稿タイプの検索結果のみを表示するようにループを修正するにはどうすればよいですか。別の検索フォームを使用したり、クエリをリセットしたりして検索用語を失うことはしたくありません。これがページからのコードの一部です - http://Pastebin.com/L9zEw1cn

最初のループはすべての結果を表示するデフォルトのループで、2番目のループは残りの投稿タイプに使用しようとしているループです。

2つ目のループを修正して、その投稿タイプの検索結果のみが表示されるようにする方法はありますか。

任意の助けは大歓迎です。ありがとう。

応答

2
mygm

Filterposts_clausesを使用できます。次に例を示します。

add_filter( 'posts_clauses', 'post_query_order', 20, 1 );
function post_query_order( $pieces )
{
    global $wpdb;
    $pieces['orderby'] = $wpdb->prefix.'posts.post_type ASC';
    return $pieces;
}
1
Vladimir

2回目のループでは、投稿クエリの引数を設定していますが、使用していません。 2番目のループの前にquery_posts( $args )を配置する必要があります。 get_posts 関数または WP_Query クラスを使用することもできます。

編集:WordPressのコーデックスのquery_posts関数に関する ページから

query_posts()は、WordPressが投稿を表示するために使用するデフォルトのクエリを変更するための最も簡単ですが推奨されない、または最も効率的な方法です。特定のURLに通常表示される投稿とは異なる投稿を表示するには、query_posts()を使用します。

今、あなたのコードでは、同じ投稿を2回ループしています。 2番目のループは最初のループとまったく同じです。

ここで、2番目のループの前にquery_posts()を異なる引数で配置すると、次のようになります。

$ args = array( 'post_type' => 'videos'、 's' => $ s); 
 query_posts($ args); 
 if(have_posts()):
 while(have_posts()):
 the_post(); 
 
 //投稿を表示します
 
 endif; 
 wp_reset_postdata(); ?>

あなたは投稿の異なるセットをループします。

0