web-dev-qa-db-ja.com

検索クエリがうまいかないようですか?

検索クエリに問題があります。次のように追加のクエリを入力するときはいつでも。

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_vartrueに設定していますので、理論的にはうまくいくはずです。

私の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内だけではなく、通常の投稿を検索します。

検索クエリが機能しない理由は何ですか。任意の助けをいただければ幸いです。

1
Justine

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>
0
Milo

私はこれをテストしていないので、思ったほどうまく動かないかもしれませんが、試してみてください。

$post_type = $_GET['post_type'];

global $query_string
query_posts( $query_string . '&post_type=' . $post_type );

// loop here
0
Alex Lane