• 解決済 kiw

    (@kiw)


    投稿記事の中に、その記事にまつわる他の記事のタイトルや抜粋をキーワードで検索して一覧表示したいのですがそのようなことは可能でしょうか?調べてみたのですが、参考になる情報が見つかりませんでした。良い考えがありましたら、お知恵を拝借できれば助かります。

    具体的には、ある投稿記事(以下、投稿A)の中で、(投稿A)のタイトルをキーワードにして特定のカテゴリー中を検索した検索結果を(投稿A)のシングルページ内で表示したいのです。(わかりにくくてすみません。。。)

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • モデレーター jim912

    (@jim912)

    kiwさん、こんにちは。

    get_postsのsパラメータでキーワードを指定してあげると、検索結果と同じ結果を得ることができます。

    $related_posts = get_posts( 's=' . $post->post_title );

    あるいは配列での指定で、

    $related_posts = get_posts( array( 's' => $post->post_title );

    得られた結果が存在する場合は、foreachなどで回して表示させればよろしいかと思います。

    上記例では、取得数制限をかけていませんが、運用上はshowpostsパラメータも指定して取得する上限を決めておいた方が良いでしょう。

    トピック投稿者 kiw

    (@kiw)

    ご親切にありがとうございます!
    そんな指定ができるなんてまったく知りませんでした。。。

    教えていただいた方法でやってみましたが、ひとつだけわからないところがあります。
    検索の部分でカテゴリーを指定したいのですが、やり方がわかりません。
    get_posts( ‘numberposts=10&category=70&s=’ . $post->post_title );
    などとやってみましたが、うまくいきません。

    ネットでいろいろ探してみましたが、
    get_posts( ‘s=’ *****)
    というやり方自体ほとんど情報がありませんでした・・・
    隠し機能のようなものなんでしょうか?

    モデレーター IKEDA Yuriko

    (@lilyfan)

    $related_posts = get_posts( 's=' . $post->post_title );

    こっちの場合は引数 ($post->post_title) を urlencode しないと正しい結果が出ないと思います (例えば、投稿タイトルが「xxx&cat=3」というものだったらバグる)。

    後者の array を使った方は urlencode 不要です。

    トピック投稿者 kiw

    (@kiw)

    lilyfan様 アドバイスどうもありがとうございます。

    $related_posts = get_posts( ‘s=’ . $post->post_title );
    このやり方だとうまくいくのですが、これにプラスカテゴリーを指定すると何も返ってこないのです。

    同じく、
    $related_posts = get_posts( array( 's' => $post->post_title );
    ↑この方法で、
    $related_posts = get_posts( array( 'cat' => 70 , 's' => $post->post_title );
    とやっても何も返って来ませんでした。

    そして、アドバイスいただいたように、

    $post_title = urlencode($post->post_title);
    $related_posts = get_posts( 'numberposts=10&category=70&s='.$post_title );

    このようにしてみましたが、やはり何も返ってきませんでした。。。

    モデレーター jim912

    (@jim912)

    kiwさん、こんにちは。

    get_posts( array( 's' => $post->post_title, 'category' => 3, 'showposts' => 10 ) );

    上記のコードにてリクエストされるデータベースクエリーをキャプチャしてみたところ、下記のようになります。

    SELECT SQL_CALC_FOUND_ROWS  (*tbl_prifix*)posts.* FROM (*tbl_prifix*)posts  INNER JOIN (*tbl_prifix*)term_relationships ON ((*tbl_prifix*)posts.ID = (*tbl_prifix*)term_relationships.object_id) INNER JOIN (*tbl_prifix*)term_taxonomy ON ((*tbl_prifix*)term_relationships.term_taxonomy_id = (*tbl_prifix*)term_taxonomy.term_taxonomy_id)  WHERE 1=1  AND ((((*tbl_prifix*)posts.post_title LIKE '%(*keyword*)%') OR ((**tbl_prifix**)posts.post_content LIKE '%(*keyword*)%')))  AND ((*tbl_prifix*)posts.post_password = '')  AND (*tbl_prifix*)term_taxonomy.taxonomy = 'category'  AND (*tbl_prifix*)term_taxonomy.term_id IN ('3', '*', '*', '*', '*')  AND (*tbl_prifix*)posts.post_type = 'post' AND ((*tbl_prifix*)posts.post_status = 'publish') GROUP BY (*tbl_prifix*)posts.ID ORDER BY (*tbl_prifix*)posts.post_date DESC LIMIT 0, 10

    ※ (*tbl_prifix*):テーブル接頭辞、(*keyword*):記事タイトル

    ざっと意訳しますと、下記条件に該当する投稿を抽出しています。

    • 該当するものの記事の公開日順の最新のものより(最大)10件
    • 公開済みの記事
    • タイプが投稿
    • カテゴリーIDが3およびその子カテゴリーである
    • パスワード保護されていない
    • 本文、タイトルのいずれかにキーワード(表示記事のタイトル)が含まれている

    なので、カテゴリーを指定した絞り込みが可能なはずですので、再度確認してみてください。
    ちなみに子カテゴリーを含めず3カテゴリーのみの記事としたい場合は、categoryではなくcategory__andを使います。

    トピック投稿者 kiw

    (@kiw)

    jim912様
    いつも的確なアドバイスありがとうございます。

    いくらやってみてもうまくいかず、
    ご指摘の、

    本文、タイトルのいずれかにキーワード(表示記事のタイトル)が含まれている

    を見て、はっと思い出したのですが、今回検索したいのはタグでした。
    いくらがんばっても出てこないわけです。。。
    普通の検索には、Search Everythingという、タイトルと本文以外も検索対象に含めるプラグインを使っているのですが、あくまで普通の検索時のみ有効のようですね。

    今回のような場合、上記プラグインのようにタグを検索対象に含める方法はあるのでしょうか?
    不可能でしたら潔くあきらめたいと思います

    モデレーター jim912

    (@jim912)

    kiwさん、こんにちは。

    get_postsの場合、suppress_filtersというパラメータがtrueになるため、フックでのクエリーフィルタリングがOFFになっています。パラメータに’suppress_filters’ => falseとを追加すれば、フィルタリングされるようになりますが、今度は、Search Everythingがどのような条件判断でクエリーを書き替えているかという問題があります。

    Search Everythingは、$wp_queryというオブジェクトを参照して、クエリーの書き替えを行っていますが、get_postsは$wp_queryを利用せず、別個のオブジェクトを利用するため、Search Everythingは正しく動作しません。

    get_postsの代わりに、query_postsを使うのであれば$wp_queryが書き変えられるため、Search Everythingの設定を生かす事が出来ます。
    ただし、これは諸刃の剣で query_posts を行った後の条件分岐タグ( is_single()等 )の結果が変わってきてしまいます。(なので、私は極力query_postsは使いませんし、薦めません。)
    検索結果表示以降に条件分岐タグを利用していないのであれば問題ありませんが、利用している場合は、上記の問題が発生すると思われますのでご留意ください。

    トピック投稿者 kiw

    (@kiw)

    jim912様
    ほんとにありがとうございます!

    query_postsでも同様の指定ができるんですね。。
    ということで今回はquery_postsを使って解決しました。
    ご指摘の問題点についても、今回はクリアできているみたいです

    私は逆に今まですべてquery_postsを使っていました。
    というか、お恥ずかしいことにget_posts自体つい先日まで知りませんでした。。。

    いままで何度かjim912様に助けていただいておりますが、ほんとに毎回親切に教えていただき、そのたびに目からウロコが落ちまくっています^^;
    ほんとに感謝しても感謝しきれないほどです。ありがとうございました!

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「検索結果を記事中に表示したい」には新たに返信することはできません。