検索クエリに問題があります。次のように追加のクエリを入力するときはいつでも。
mywebsite.com/?s=wordpress&post_type=page
mywebsite.com/?s=wordpress&post_type=page,post
mywebsite.net/?s=wordpress&cat=1
mywebsite.net/?s=wordpress&post_type=post&tag=genesis-post
mywebsite.net/?s=wordpress&post_type=post&tag=thesis-post
特定のスコープ(投稿タイプ、カテゴリ、タグ)で検索を行うべきです。
私の場合は、追加パラメータとして何を指定しても機能しないようです。検索しているWordを含むすべての結果が表示されます。
私の投稿タイプでは、私はquery_var
をtrue
に設定していますので、理論的にはうまくいくはずです。
私のsearch.phpループはこんな感じです
<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
<div class="post">
<?php if ( 'post' == get_post_type() ) : ?>
<p class="category"><?php the_category(' '); ?></p>
<?php else : ?>
<p class="category">Resource</p>
<?php endif; ?>
<h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
<?php the_excerpt(); ?>
</div><!-- /post -->
<?php endwhile; ?>
私のsearchform.phpで隠し入力を使ってもうまくいきません、
<form method="get" id="searchform" action="<?php bloginfo('url'); ?>" class="search">
<input type="text" class="field" name="s" id="s" />
<input type="submit" class="submit" name="submit" value="Go" />
<input type="hidden" name="post_type" value="myposttype" />
</form>
それはまだmyposttype CPT内だけではなく、通常の投稿を検索します。
検索クエリが機能しない理由は何ですか。任意の助けをいただければ幸いです。
post_type
を渡しても検索はその型に制限されないことがわかりましたが、はその型を既に検索している配列に追加するだけです。
複雑な検索クエリを作成するためにできることはhook pre_get_posts
で、ちょっとしたクエリ操作をすることです。
簡単な例として、最初にWordPressの既知のクエリ変数の配列に渡す独自のクエリ変数を追加します。
function wpa53029_query_vars( $query_vars ){
$query_vars[] = 'my_type';
return $query_vars;
}
add_filter( 'query_vars', 'wpa53029_query_vars' );
次に、投稿タイプを渡すようにフォームを設定します。
mywebsite.com/?s=wordpress&my_type=page
mywebsite.com/?s=wordpress&my_type=page,mycustomtype
それから、データベースが照会される前にそのクエリ変数を傍受するためのコードを追加し、投稿タイプを設定します。
function wpa53029_pre_get_posts( $query ){
if( isset( $query->query_vars['my_type'] ) ){
$types = explode( ',', $query->query_vars['my_type'] );
$query->set( 'post_type', $types );
}
return $query;
}
add_action( 'pre_get_posts', 'wpa53029_pre_get_posts' );
デバッグのために、あなたのsearch.php
テンプレートの中のqueryオブジェクトの内容を印刷して、すべてがどのように設定されているか、そしてWordPressがデータベースに問い合わせるために生成する実際のSQL問い合わせを見てください。 WordPressはメインクエリーを保持するグローバル変数として$wp_query
を使用します。
<pre>
<?php print_r( $wp_query ); ?>
</pre>
私はこれをテストしていないので、思ったほどうまく動かないかもしれませんが、試してみてください。
$post_type = $_GET['post_type'];
global $query_string
query_posts( $query_string . '&post_type=' . $post_type );
// loop here