2013/9/3追記:
改めて考え直してコードを書きなおしてみました。
カスタムタクソノミーは簡単に説明すると、自分勝手に定義できるカテゴリです。
商品カタログ的なサイトをつくるとき、この商品の材質は○○でサイズは××で用途は□□で・・・という分類を設定する際に向いています。
※カスタムタクソノミーの定義方法はWordPress私的マニュアルが分かりやすかったです。
そうなると今度はその分類ごとに検索したくなりますので、その検索を実装する方法です。
ADs
HTMLのほうはよくある検索フォームで問題ありません。
チェックボックスやセレクトなどで複数の値を受ける場合、name=”hogehoge[]”みたいに最後に[]をつけて配列で受けるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<form action="/" method="get"> <dl> <dt>材質</dt> <dd> <input type="checkbox" name="material[]" value="金属" />金属 <input type="checkbox" name="material[]" value="木" />木 <input type="checkbox" name="material[]" value="布" />布 </dd> </dl> <dl> <dt>産地</dt> <dd> <input type="checkbox" name="born[]" value="金属" />海外 <input type="checkbox" name="born[]" value="木" />国内 </dd> </dl> <input type="submit" value="検索する" /> </form> |
上記HTMLから渡されるクエリを以下のPHPで受け取ります。
もし複数のチェックを入れた場合、OR検索を実行します。
2012年12月11日修正:array_pushで配列を追加していく部分の「operator」という箇所ですが、以前「OR」と記載していましたがoperatorの指定に「OR」はありませんでした。OR検索を実装する場合は「IN」となります。お詫びして訂正いたします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php //GETとってクエリ化 if($_GET){ //まずは最低限の条件を設定しておく $qarr = array( 'numberposts' => 10, 'post_status' => 'publish', 'post_type' => 'post', 'tax_query' => array( 'relation' => 'AND', ) ); //GETを取得しループ foreach( $_GET as $key => $value ) { //tax_query配下に配列を追加していく array_push($qarr["tax_query"],array( 'taxonomy' => $key, 'field' => 'slug', 'terms' => $value, 'operator'=>'IN' //複数のチェックをどう処理するか )); } } else { $qarr = ''; //GETがなければget_postsの引数を空に } ?> <?php $myposts = get_posts($qarr); ?> //以降は普通にループ |
GETをすべて取得していますので、カスタムタクソノミーがいくらあっても検索を実行することが可能です。不動産サイトなんかにいいんじゃないでしょうか。
たとえば、「金属」と「海外」と「国内」にチェックを入れた場合、
材質が「金属」でかつ産地が「国内」か「海外」
の記事がヒットします。AND検索にするかOR検索にするかは上記PHP内で変更可能です。
ADs
恥を忍んで、質問致します^^;
すいませんが、こちらのフォームとphpを入れ込んだのですが、[]をつけるとエラーが出てしまします。
原因がどうしても分からず、誠に失礼とは思いながら、こちらに書き込みをさせていただきました。
大変恐縮ですが、ご教唆いただけますと、大変助かります。
こちらに書いた内容以外に、何かカスタマイズをなさっておられるのでしょうか・・・ コメントを汚してしまい、大変失礼いたします・・。
mountainさま
コメントありがとうございます。そんなに恐縮しないでください^^;
もしよろしければもう少し詳しくエラーとか不具合の状況とか、エラーメッセージが何と出ているかなどを教えていただけますと予測しやすいです。
tax_queryはWP3.1からの機能ですので、使っているWPのバージョンが古いと動きません。
あとは上記のコードですとタクソノミーが来ることしか考えていないので、たとえばフリーワードだったりmeta_queryで取るべき値などであったりが含まれるとエラーが発生します。
マウンテンです。
お返事をくださって、ありがとうございます。
こちらのコードのフォームはメインに入れ込み、
受ける側のphpをtaxonomy.phpに入れ込んでおります。
エラーは
Warning: strpos() expects parameter 1 to be string, array given in C:\xampp\htdocs\wear\wp-includes\query.php on line 1716
Warning: preg_split() expects parameter 2 to be string, array given in C:\xampp\htdocs\wear\wp-includes\query.php on line 1717
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\wear\wp-includes\query.php on line 1718
Warning: strpos() expects parameter 1 to be string, array given in C:\xampp\htdocs\wear\wp-includes\query.php on line 1716
Warning: preg_split() expects parameter 2 to be string, array given in C:\xampp\htdocs\wear\wp-includes\query.php on line 1717
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\wear\wp-includes\query.php on line 1718
というのが出ていまして、
タクソノミーには、material bornで登録しております。
TERMに金属 木 布 を入れ込み 検索をしているのですが、上のエラーが出ます。
taxonomy.phpの 受けコードを削除しても、同じエラーが出るので、受けるコードがきちんと機能していないように思います。
ずっとはまっており、有料でも、アドバイスを受けたい状況です。
もし解決しましたら、大変ありがたいです。
お忙しい中、おしえておしえて、という状態で、誠に申し訳ありません。
失礼しました。
最新版のWordPressを使っております。プラグインがない環境でも、テストをしました。
mountainさま
コメントありがとうございます。
記述したコードを実装して試したところ、array_pushでtax_queryに追加していく部分の「operator」というキーの値を「OR」としている部分は間違いでした。OR検索を実装する場合は「IN」となります。大変申し訳ございませんでした。
もしORと記述しているのであれば、その部分を修正すれば動くかもしれません。
参考になればと思い、限りなくシンプルに上記コードを実装したサイトを以下のURLで作成しましたので参考にしてみてください。
https://wood-roots.com/test/
テンプレートファイルは以下よりダウンロードできます(すべてindex.php1枚で構成しています)
https://wood-roots.com/sample/test.lzh
ありがとうございます。
すぐに実行できずにすいません、
ご返信、実験までして頂き、感謝します。
現在頂いたFileをそのままで、入れ込みをしましたが、やはり、同じエラーが出てしまいます・・。
タクソノミー名の表示は管理人様と同じようにでてるのですが、検索ボタンを押すと、エラーが出てしまいます・・・。
query.phpに原因があるのでしょうか?
今度はWordPressを入れなおして、もう一度サーバー上で実験をしてみます
管理人様には大変感謝です。ほんとうにありがとう。
まっさらのサイトにファンクションでタクソノミーとタームを入れ込み、インデックス.phpをそのまま入れ込んでみました。
検索ができ、機能するのですが、上記のエラーがどうしても出てしまいます。
phpのバージョンは5.3.10で、プラグインはまったく入れておりません。
現在アップロードしているサーバーは
xxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxx
※管理者注:ダッシュボードへのID、Passの記述があったので編集いたしました。
です。
エラーがなぜ出るのか、もう少し、試してみます。
moutainさま
テスト用サイトとはいえ管理画面のID,Passを公開しておくのは危険だと思いましたので投稿内容を一部編集させていただきました
管理画面を見せていただいたところ原因が分かりました。functions.php内の
register_taxonomy(
‘material’,
‘post’,
array(
‘hierarchical’ => false,
‘label’ => ‘素材’,
‘query_var’ => true,
‘rewrite’ => true
)
);
という記述ですが、この中の「query_var」をtrueにすると
http://hogehoge.com/?tag=aaa+bbb+ccc
というような記述でAND検索、OR検索を行うことが出来ます。
参考:http://ja.forums.wordpress.org/topic/616
ただ、この場合はtag(今回の場合のbornやmaterial)に渡す値は配列ではなく単一の文字(+や,で区切ってはいるもののborn[]のように配列では渡さない)である前提であるため、今回のようなエラーが出てしまってました。
お伝えいただいたテストサイトのfunctions.phpのquery_varをfalseに書き換えてみましたので、検索を試してみてください。エラーは出なくなっています。
感動しました。エラーが出なくなってる。
ありがとうございます。何かしらの形でお礼したいです。
重ね重ね無礼な質問にもかかわらず、やさしくしてくださって誠に感謝いたします。
また、有益な情報を発信してくださっていることに感謝いたします。
お礼ができる状況になりましたら、ご連絡いたします。
ありがとうございました。