- 締切済み
wordpressのAND検索実装エラー
投稿記事のタグをAND検索できる機能を実装したく 以下のソース(search.php)をご教授いただきました。 AND検索の機能は無事実装できたと思います。 しかし登録されていないタグを入力し検索した際、すべての 投稿記事が表示されてしまいます。 そこで色々と調査しましたが自分の力では どうすることもできず、この場をお借りし 質問させていただいています。 自分なりにコメントを加えてみました。 認識の間違い、上記問題の解決方法など アドバイスいただけましたら幸いです。 ■コメントなしソース ----------------------------------------------- <?php $searchword = explode(" ", wp_specialchars($s)); foreach ($searchword as $tag_name) { $tag_id[] = get_term_by('name', $tag_name, 'post_tag')->term_id;} $args = array ( 'post_type' => 'post', 'tax_query' => array( array( 'taxonomy' => 'post_tag', 'terms' => $tag_id, 'operator' => 'AND', 'field' => 'id', ) ) ); query_posts($args); ?> <?php if (have_posts()) : ?> //以下ループ開始です。 ----------------------------------------------- ■コメント付きソース※ソースの内容は一緒です。 ----------------------------------------------- <?php $searchword = explode(" ", wp_specialchars($s)); //検索窓から受け取った$sに格納されている文言を半角スペースで区切って$searchword(配列?)に入れなおす foreach ($searchword as $tag_name) { //$searchword(配列?)に格納された単語を$tag_nameに代入しつつ単語の数だけ繰り返す $tag_id[] = get_term_by('name', $tag_name, 'post_tag')->term_id;} //get_term_by関数で投稿記事に投稿されているタグを元にタームに関するデータを取得。配列$tag_id[]に格納。 //get_term_by関数の引数'name'と->term_idの意味がよくわかりませんでした。 //またget_term_by関数で指定した記事がない場合全ての記事情報が戻ってくるのでしょうか? $args = array ( //上記で受け取った物をこの配列で振り分ける?そして$args(配列?)に格納 'post_type' => 'post', //投稿記事のデータのみを扱う宣言? 'tax_query' => array( //tax_queryで記事、ページの情報を条件指定して取得する。条件は配列にて指定。 array( 'taxonomy' => 'post_tag', //条件1、投稿記事であるか 'terms' => $tag_id, //条件2、$tag_idに格納された単語のタグが登録されているか 'operator' => 'AND', //条件3、上記条件2で単語が複数あった場合、全ての単語を含んでいるか 'field' => 'id', //条件4、ここもよくわかりませんでした、タグにidが振られていてそれを元にデータを取得? ) ) ); query_posts($args); ?> //$argsに格納された情報を元に記事情報を取得。 //この段階で検索窓に入力された単語を元に絞られた記事のみ格納されている? <?php if (have_posts()) : ?> //以下ループ開始です。 -----------------------------------------------
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- komododragon
- ベストアンサー率77% (47/61)
$n = count($tag_id); for($i=0;$i<$n;$i++) echo "$tag_id[$i]<br />"; もう少し(かなりかな) PHP の修行が必要です。 だんだん、めんどうになってきたので、以後解答はしません。
- komododragon
- ベストアンサー率77% (47/61)
私は、マルチサイトの子ブログで動いています。 おかしな動作をするとき、tag_id(配列) に何が入っているのか確かめていますか? その辺からさぐっていかないと、解決には結びつかないと思います。
- komododragon
- ベストアンサー率77% (47/61)
foreach ループの中(タグじゃないときのチェックを追加) $term_obj = get_term_by('name', $tag_name, 'post_tag'); if (!(empty($term_obj))) $tag_id[] = $term_obj->term_id; else $tag_id[] = -1; 私が軽~くテストした範囲では、このチェックをさぼっても動いていましたので、 これを入れたからと言って動く保証はありません。 これで、ダメならわかりません。
お礼
komododragonさん度々のご回答ありがとうございます! すみません。提示いただきましたソースでも 動作は変わりませんでした。 マルチサイト機能を利用しているのですが 一度通常環境に移してみます。 プラグインなども関係してるのでしょうか? とにかく時間のあるときに一度試してみます。 おかげさまでAND検索機能は実装できていると思われます。 度々のご回答本当にありがとうございました。
お礼
komododragonさんご回答ありがとうございます。 マルチサイトでの実装ができてるとの事で (この情報は貴重でした、ありがとうございます) マルチサイト環境でテストしてみましたが 力及ばず解決には至っておりません。 以下のようにソースを書き加え色々とテストしてみました。 <?php $searchword = explode(" ", wp_specialchars($s)); foreach ($searchword as $tag_name => $val1 ) { $tag_id[] = get_term_by('name', $tag_name, 'post_tag')->term_id; echo $tag_id. ":" .$val1."<br />\n"; foreach( $val1 as $key2 => $val2 ){ echo $key2. ":" .$val2."<br />\n"; } } $args = array ( 'post_type' => 'post', 'tax_query' => array( array( 'taxonomy' => 'post_tag', 'terms' => $tag_id, 'operator' => 'AND', 'field' => 'id', ) ) ); if($args == 'Array') { echo 'キーワードの物は見つかりませんでした。'; } else { query_posts($args);} echo $args; ?> 上記テストをしてみたところtag_idには 【Array】という値が返ってきています。 これは多次元配列(配列の入れ子)になっているということでしょうか? この中身を見る方法がわからず現在も調査中です。 query_postsは引数の値がなかった場合(-1の場合) 管理画面→表示設定→1ページに表示する最大投稿数 を元に最新記事を取得してしまいますが こちらを0件表示にする方法が見つからずこちらも調査中です。 もし他の関数や方法などご存知でしたら 恐縮ですがご教授いただけますと幸いです。 度々でまことにお手数をおかけいたします。 宜しくお願いいたします。