サポート » 使い方全般 » サイト内検索で、カスタムタクソノミーの記事のみ出力

  • 解決済 konayuki

    (@konayuki)


    サイト内検索で、
    任意のキーワードを入力したときに、
    カスタムタクソノミーの記事のみに絞って、
    検索結果を出力したいです。

    どうしたらいいでしょうか?
    教えてください。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • #未検証

    テーマフォルダの 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',
          ) );
        }
      }
    }

    参照:タクソノミー(カスタム分類)のパラメータ(codex.wordpress.org)

    トピック投稿者 konayuki

    (@konayuki)

    御連絡ありがとうございます。
    早速functios.phpに記述しましたが動きませんでした。

    現在検索フォームは以下のように記述していますが、
    上記のソースと関連性をどのようにしたらいいのでしょうか?
    それともfunctions.phpに記述する事で自動で関連されてるのでしょうか??

    <form action=”<?php echo home_url(); ?>” method=”get”>
    <input type=”text” name=”s” />
    <input type=”submit” value=”検索” />
    </form>

    トピック投稿者 konayuki

    (@konayuki)

    kzさん

    先ほど教えていただいたソースの部分で
    >if ( ‘任意のキーワード’ == $query->get( ‘s’ ) ) {

    任意のキーワードしたいので、この部分はコメントアウトにしたんですが、
    それでも結果は変わらないです。。

    モデレーター gatespace

    (@gatespace)

    if ( '任意のキーワード' == $query->get( 's' ) ) {

    この部分は

    検索のテキストボックスに入力された文字列が、「任意のキーワード」という文字列と等しい場合

    と言う意味です。

    konayukiさんのいう「任意のキーワード」が、例えば「車」だったら
    if ( '車' == $query->get( 's' ) ) {
    にしてみてください

    あと、よほど特殊なことがない限り、検索フォームの部分は
    <?php get_search_form(); ?>
    で呼び出した方がよいです。
    (もしくは動作確認だけなら検索ウィジェットを置いておく)

    トピック投稿者 konayuki

    (@konayuki)

    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
    がよくある感じです。

    モデレーター gatespace

    (@gatespace)

    その「具体的にこうしたい」ってのを書いてもらわないと。
    私も最初の投稿の内容をやろうと思えば、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',
            )
          ) );
        }
      }
    }

    モデレーター gatespace

    (@gatespace)

    (おうかぶったー)
    あ、kzさん。
    tax_query は array 2重にしないとダメでしたー。

    トピック投稿者 konayuki

    (@konayuki)

    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’、’あ’から’ん’などあります。

    トピック投稿者 konayuki

    (@konayuki)

    gatespaceさん
    御連絡ありがとうございます。

    ソースをコピペさせてもらったんですが、search.phpで表示がされなかったです。
    何か他の原因でしょうか。。

    ありがとうございました。

    モデレーター gatespace

    (@gatespace)

    ソースをコピペさせてもらったんですが、search.phpで表示がされなかったです。

    私のコードはあくまでサンプルなので、実際にkonayukiさんが使っているカスタム投稿タイプとかカスタムタクソノミーで置き換えないとダメなんじゃないでしょうか?

    あと、今書いてるコードを投稿してもらわないと、どこに原因があると聞かれても分かりません。

    トピック投稿者 konayuki

    (@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さんに教えていただいソースを貼り付けました。

    モデレーター gatespace

    (@gatespace)

    $query->set( KEY, VALUE' ); で指定しているキーと値は全て、WP_Queryのパラメーターですので、私のコードはコメントも入れてますし、Codex見ながら、ご自分の設定に合わせてカスタマイズしてみてはどうですか?

    トピック投稿者 konayuki

    (@konayuki)

    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に変更しました。

    ありがとうございましたー!

    トピック投稿者 konayuki

    (@konayuki)

    ユーザーリビティを考慮した結果
    2種類のフォームを作成するより、こちら一種類で纏める事にしました。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • トピック「サイト内検索で、カスタムタクソノミーの記事のみ出力」には新たに返信することはできません。