サイト内検索で、カスタムタクソノミーの記事のみ出力
-
#未検証
テーマフォルダの functions.php に以下のようなコードを貼付ければOK。
add_action( 'pre_get_posts', 'my_pre_get_posts' ); function my_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_search ) { if ( '任意のキーワード' == $query->get( 's' ) ) { $query->set( 'tax_query', array( 'taxonomy' => '任意のタクソノミースラッグ', 'terms' => array( '任意のターム1', '任意のターム2' ), 'field' => 'slug', ) ); } } }
御連絡ありがとうございます。
早速functios.phpに記述しましたが動きませんでした。現在検索フォームは以下のように記述していますが、
上記のソースと関連性をどのようにしたらいいのでしょうか?
それともfunctions.phpに記述する事で自動で関連されてるのでしょうか??<form action=”<?php echo home_url(); ?>” method=”get”>
<input type=”text” name=”s” />
<input type=”submit” value=”検索” />
</form>kzさん
先ほど教えていただいたソースの部分で
>if ( ‘任意のキーワード’ == $query->get( ‘s’ ) ) {
↑
任意のキーワードしたいので、この部分はコメントアウトにしたんですが、
それでも結果は変わらないです。。if ( '任意のキーワード' == $query->get( 's' ) ) {
この部分は
検索のテキストボックスに入力された文字列が、「任意のキーワード」という文字列と等しい場合
と言う意味です。
konayukiさんのいう「任意のキーワード」が、例えば「車」だったら
if ( '車' == $query->get( 's' ) ) {
にしてみてくださいあと、よほど特殊なことがない限り、検索フォームの部分は
<?php get_search_form(); ?>
で呼び出した方がよいです。
(もしくは動作確認だけなら検索ウィジェットを置いておく)gatespaceさん、
ありがとうございます。ソースの意味と役割は、承知してるですが、
もう少し詳しくお伝えした方がいいと思ったので、背景を書かせてください。——————
カスタムタクソノミーで用語集を実装しています。
作成したカスタム名称は、
タクソノミー glossary
ターム glossary_category
ターム glossary_tag
——————それで、用語集専用検索フォームを作成して
このカスタム投稿の記事のみを出力したいと考えてます。上記のkzさんの教えていただいたソース部分、
“任意のキーワード”部分は、検索するワード毎に異なるので、
この部分は必要ないのではと思い、コメントアウトした次第です。検索対象の記事を glossary が glossary_category, glossary_tag の値のもののみに制限する、ということなら以下でOK。
add_action( 'pre_get_posts', 'my_pre_get_posts' ); function my_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_search ) { $query->set( 'tax_query', array( 'taxonomy' => 'glossary', 'terms' => array( 'glossary_category', 'glossary_tag' ), 'field' => 'slug', ) ); } }
タクソノミー glossary
ターム glossary_category
ターム glossary_tagなんとか_category, なんとか_tag はタームではなくてタクソノミーに付けるスラッグにする方が何かと良い気がします。
コンテンツ設計的には、
カスタム投稿タイプ glossary
階層ありタクソノミー glossary_category
階層なしタクソノミー glossary_tag
がよくある感じです。その「具体的にこうしたい」ってのを書いてもらわないと。
私も最初の投稿の内容をやろうと思えば、kzさんと同じようなコードになりますよ。※未検証
フォーム部分<form role="search" method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>"> <input type="search" value="<?php echo esc_attr( get_search_query() ); ?>" name="s"> <input type="checkbox" name="yogo" value="1">用語集検索 <input type="submit" value="Search"> </form>
functions.php
add_action( 'pre_get_posts', 'my_pre_get_posts' ); function my_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ) // ダッシュボード及びメインクエリ以外なら処理終了 return; if ( $query->is_search ) { // メインクエリが検索結果の場合 if ( 1 == $_GET["yogo"] ) { // yogo にチェックが入っていたら $query->set( 'post_type', 'post' ); // 対象を カスタム投稿タイプ hogepost のみにする $query->set( 'tax_query', array( // かつ、特定のタームに属する投稿を対象にする array( 'taxonomy' => 'glossary', 'terms' => array( 'glossary_category', 'glossary_tag' ), 'field' => 'slug', ) ) ); } } }
kzさん、
御連絡ありがとうございます。カスタム投稿タイプ glossary
階層ありタクソノミー glossary_category
階層なしタクソノミー glossary_tag
↑
名称が間違っていました。
kzさんのいう設計でした。すいません。add_action( 'pre_get_posts', 'my_pre_get_posts' ); function my_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_search ) { $query->set( 'tax_query', array( 'taxonomy' => 'glossary_tag', 'field' => 'slug', ) ); } }
↑
このソースで試したんですが、検索結果に反映されませんでした。
‘terms’部分を削除したのは、
単にglossary_tagの記事であれば、よかったので、削除しています。
ターム名には’A’から’Z’、’あ’から’ん’などあります。gatespaceさん
御連絡ありがとうございます。ソースをコピペさせてもらったんですが、search.phpで表示がされなかったです。
何か他の原因でしょうか。。ありがとうございました。
ソースをコピペさせてもらったんですが、search.phpで表示がされなかったです。
私のコードはあくまでサンプルなので、実際にkonayukiさんが使っているカスタム投稿タイプとかカスタムタクソノミーで置き換えないとダメなんじゃないでしょうか?
あと、今書いてるコードを投稿してもらわないと、どこに原因があると聞かれても分かりません。
gatespaceさん
御連絡ありがとうございます。
functions.phpに書いてる部分一部抜粋します。function glossary(){ $labels = array( 'name' => _x('用語一覧', 'post type general name'), 'singular_name' => _x('用語', 'post type singular name'), 'add_new' => _x('用語追加', 'add_glossary'), 'add_new_item' => __('用語を追加'), 'edit_item' => __('用語を編集'), 'new_item' => __('新規用語'), 'view_item' => __('用語を表示'), 'search_items' => __('用語を検索'), 'not_found' => __('用語は見つかりませんでした'), 'not_found_in_trash' => __('ゴミ箱に用語はないです。'), 'parent_item_colon' => '' ); $args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'query_var' => true, 'rewrite' => array('slug' => 'glossary', 'with_front' => false), 'capability_type' => 'page', 'hierarchical' => true, 'menu_position' => 5, 'supports' => array('title','editor','thumbnail','custom-fields','excerpt','revisions','page-attributes','comments','author'), 'has_archive' => true ); register_post_type('glossary',$args); // カスタムタクソノミーを作成 //カテゴリータイプ $args = array( 'label' => '用語カテゴリー', 'public' => true, 'show_ui' => true, 'hierarchical' => true, 'rewrite' => array('slug' => 'glossary/c', 'with_front' => false) ); register_taxonomy('glossary_category','glossary',$args); //タグタイプ $args = array( 'label' => '用語タグ', 'public' => true, 'show_ui' => true, 'hierarchical' => false, 'rewrite' => array('slug' => 'glossary/t', 'with_front' => false) ); register_taxonomy('glossary_tag','glossary',$args); }
このコードにgatespaceさんに教えていただいソースを貼り付けました。
$query->set( KEY, VALUE' );
で指定しているキーと値は全て、WP_Queryのパラメーターですので、私のコードはコメントも入れてますし、Codex見ながら、ご自分の設定に合わせてカスタマイズしてみてはどうですか?gatespaceさん
ご連絡ありがとうございます。
すいません、コメントアウトを全く読んでいませんでした。
申し訳ないです。add_action( 'pre_get_posts', 'my_pre_get_posts' ); function my_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ) // ダッシュボード及びメインクエリ以外なら処理終了 return; if ( $query->is_search ) { // メインクエリが検索結果の場合 if ( 1 == $_GET["yogo"] ) { // yogo にチェックが入っていたら $query->set( 'post_type', 'glossary' ); // 対象を カスタム投稿タイプ hogepost のみにする } } }
これで目的の事ができました。
検索フォームのinputは
<form role="search" method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>"> <input type="search" value="<?php echo esc_attr( get_search_query() ); ?>" name="s"> <input type="hidden" name="yogo" value="1"> <input type="submit" value="Search"> </form>
専用フォームなのでhiddenに変更しました。
ありがとうございましたー!
- トピック「サイト内検索で、カスタムタクソノミーの記事のみ出力」には新たに返信することはできません。