サポート » 使い方全般 » 検索結果に含まれない単語を検索した場合、全件表示される

  • 解決済 harad0087

    (@harad0087)


    初めて利用させていただきます。

    http://welcustom.net/extend-custom-fields-in-search/
    こちらのブログに記載されている内容を元に、カスタムフィールドやカテゴリ、ポストから検索できるようにsearch.phpをカスタマイズしましたが、
    一致する検索結果は表示されるのですが、全く関係ない文字列を検索した場合、全件表示されてしまいます。

    当方、wordpressの知識が浅く、手詰まりになってしまいました。
    解決策をどなたかご教示いただけますでしょうか。

    WordPress 4.3.1
    オリジナルのテーマを使用しています。

    <?php //検索欄が未入力だった場合
     if (isset($_GET['s']) && empty($_GET['s'])) { ?>
        <p>No results.</p>
    <?php //検索欄が入力されていた場合以下
     } else { ?>
        <?php if(have_posts()): ?>
        <?php else : ?>
    <?php
    global $wpdb;
    $keyword = get_search_query();
    $keyword = '%' . like_escape( $keyword ) . '%';
    // カスタムフィールド全部から検索
    $post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
        SELECT DISTINCT post_id FROM {$wpdb->postmeta}
        WHERE meta_value LIKE '%s'
    ", $keyword ) );
    // タイトルと投稿内容から検索
    $post_ids_post = $wpdb->get_col( $wpdb->prepare( "
        SELECT DISTINCT ID FROM {$wpdb->posts}
        WHERE post_title LIKE '%s'
        OR post_content LIKE '%s'
    ", $keyword, $keyword ) );
    // カテゴリから検索
    $term_ids = $wpdb->get_col( $wpdb->prepare( "
    		SELECT DISTINCT term_id FROM {$wpdb->terms}
    		WHERE name LIKE '%s'
    	", $keyword) );
    //ヒットしたカテゴリーが所属する投稿
    		$term_id = implode(",", $term_ids);
    		$post_ids_term = $wpdb->get_col( $wpdb->prepare( "
    			SELECT DISTINCT  object_id FROM {$wpdb->term_relationships}
    			WHERE term_taxonomy_id LIKE (%s)
    		", $term_id) );
    $post_ids = array_merge( $post_ids_meta, $post_ids_post, $post_ids_term );
    // Query arguments
    $args = array(
        'post_type'   => 'post',
        'post_status' => 'publish',
        'post__in'    => $post_ids,
    );
    $query = new WP_Query( $args );
    if ( $query->have_posts() ): while ( $query->have_posts() ) : $query->the_post(); ?>
    
    <!-- ループの中身 -->
    
    <?php endwhile; else: ?>
    No results.
    <?php endif; ?>
    <?php wp_reset_query(); ?>
    
    <?php endif; ?>
2件の返信を表示中 - 1 - 2件目 (全2件中)
  • こんにちは

    $post_idsが空だった場合に、publish投稿全件で WP_Queryにargsが渡ってしまうからではないかと思います。

    $post_ids が empty()でなかったら、$query = new WP_Query( $args );するようにするといいかもしれないですね

    トピック投稿者 harad0087

    (@harad0087)

    >>nobita さん

    こんにちは。
    早速のご返信ありがとうございます。

    頂いたコメントを参考にコードを直したところ、上手く動作するようになりました!

    具体的には、argsに
    'post__not_in' => !$post_ids
    を追加することで、関係ない文字列では検索結果なしが表示できました。
    nobitaさんからご教示頂いた正解なのかはわかりませんが、動作することで次のステップに進めます。

    nobitaさん、本当にありがとうございました。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「検索結果に含まれない単語を検索した場合、全件表示される」には新たに返信することはできません。