質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • PHP

    24080questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    8947questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

WordPressでタームを選択しなくてもタクソノミーだけで検索結果を表示したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,326
退会済みユーザー

退会済みユーザー

現在、下記のブログ記事を参考に、特定のカスタム投稿に紐付けた、特定のタクソノミーに属するタームで検索出来るフォームを制作し、稼働しているのですが、
タームを選択しない状態で検索を行われた時に、タクソノミーに属する投稿を全て表示したいと思うのですが、
表示の制御もできなければ、参考になる情報も見つけられず八方塞がりです。

また、フォームに出力されるタームの数が、紐づけされた投稿があるターム名のみの表示となります。
これも、投稿の紐付け状況に関わらず全て表示させたいです。

重ね重ね、誠に恐れ入りますが、何卒ご教授願います。

参考サイト:KOTORI|絞り込み検索をプラグインを使わずに実装

WordPressの設定状況
カスタム投稿

-タクソノミー1
- ターム1
- ターム2
- ターム3・・・

- タクソノミー2
- ターム1
- ターム2
- ターム3・・・

- タクソノミー3


以下のソースでは、タクソノミーのスラッグだけ、常に送信するようにしています。
これは、同一ページに複数のフォームをタブ切り替えで設置しており、
タブごとに、検索するタクソノミーを変えているためです。

・タブ1のフォームでは、タクソノミー1に属するアイテムを検索させたいから。
・タブ2のフォームでは、タクソノミー2に属するアイテムを検索させたいから。



このような状況です。

フォームのソース
このようなフォームを6つ設置しています。

<form method="get" id="searchform" action="<?php echo home_url('/'); ?>">

    <label class="label">taxonomy1のタームから選ぶ</label>
    <select name="item">
        <option value="" selected>未設定</option>
        <?php
        $taxonomy_name = 'item_category1';
        $taxonomys = get_terms( $taxonomy_name );
        if ( !is_wp_error( $taxonomys ) && count( $taxonomys ) ):
            foreach ( $taxonomys as $taxonomy ):
                $tax_posts = get_posts( array( 'post_type' => get_post_type( 'custom_post' ), 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
        if ( $tax_posts ):
            ?>
        <option value="<?php echo $taxonomy->slug; ?>">
            <?php echo $taxonomy->name; ?>
        </option>
        <?php
        endif;
        endforeach;
        endif;
        ?>
        <input type="hidden" name="item_type" value="<?php echo $taxonomy_name; ?>">
    </select>

    <label class="label">taxonomy2のタームから選ぶ</label>
    <select name="shop">
        <option value="" selected>未設定</option>
        <?php
        $taxonomy_name = 'shop_category';
        $taxonomys = get_terms( $taxonomy_name );
        if ( !is_wp_error( $taxonomys ) && count( $taxonomys ) ):
            foreach ( $taxonomys as $taxonomy ):
                $tax_posts = get_posts( array( 'post_type' => get_post_type( 'custom_post' ), 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
        if ( $tax_posts ):
            ?>
        <option value="<?php echo $taxonomy->slug; ?>">
            <?php echo $taxonomy->name; ?>
        </option>
        <?php
        endif;
        endforeach;
        endif;
        ?>
    </select>

    <label class="label" for="s">キーワードからさがす</label>
    <input type="text" class="field" name="s" id="s" placeholder="検索"/>
    <input type="submit" class="submit-button" name="submit" id="searchsubmit" value="検 索"/>
</form>

検索結果 search.phpのソース

<?php get_header(); ?>

<?php
$s = $_GET['s'];
$item = $_GET['item'];
$item_type = $_GET['item_type'];
$shop = $_GET['shop'];

if($item){
$taxquerysp[] = array(
'taxonomy'=> $item_type,
'terms'=> $item,
'include_children'=>false,
'field'=>'slug',
'operator'=>'AND'
);
}
if($shop){
$taxquerysp[] = array(
'taxonomy'=>'shop_info',
'terms'=> $shop,
'include_children'=>false,
'field'=>'slug',
'operator'=>'AND'
);
}
$taxquerysp['relation'] = 'AND';

?>

<?php query_posts( array(
'post_type' => 'custom_post',
'tax_query' => $taxquerysp,
's' => $s,
)
);?>

<ul id="item_list">
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php get_template_part('loop-item_list'); ?>
<?php endwhile; else : ?>

<li>該当なし</li>

<?php endif;wp_reset_query(); ?>
</ul>

<?php get_footer(); ?>

追記
新たに問題が発生しまして。。。
検索結果の件数を表示したくて知らべたところ、

<?php echo $wp_query->found_posts; ?>


こちらのコードで出力すると言う記事が多くあるのですが、
これで出力される数値は、検索結果の件数と合致しません。

合わせて解決のご指導を頂けると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

まず確認ですが、検索画面でtaxonomy1で選択がない場合はtaxonomy1に属するターム全てを検索結果に出すという認識でしょうか?

上記の認識であっているならば、taxonomy1が選択されなかった場合は検索結果に遷移する際に$_GET['item']の値が空か定義されていないと思われます。

なのでsearch.php上で$_GET['item']が空の場合の処理を追加してあげれば取得できるかと思います。

 search.php 

if($item){
$taxquerysp[] = array(
'taxonomy'=> $item_type,
'terms'=> $item,
'include_children'=>false,
'field'=>'slug',
'operator'=>'AND'
);
}
// 以下追記のソースです。
// ターム情報がない場合は指定のタクソノミーに属するターム全てで検索
else {
 // ターム一覧を取得しスラッグ名を配列に格納
 $term_objs = get_terms($item_type);
 $terms = array();
 foreach($term_objs as $term){
  $terms[] = $term->slug;
 }
 // 取得したターム一覧をqueryの条件に
 $taxquerysp[] = array(
  'taxonomy'         => $item_type,
  'field'            => 'slug',
  'terms'            => $terms,
  'operator'         => 'IN',
  'include_children' => false,
 );
}

動作確認をしていないので細かい点でミスがあるかもしれません。
参考になればと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/27 15:19

    koou 様
    ご指導ありがとうございます!
    見事に検索の絞込が出来ました!

    嬉しくてたまりません!!!

    頂いたソースで検索結果の表示については、解決出来たのですが、
    検索結果の件数表示がまで完了できていません。

    恐縮ですが、引き続きご指導頂けると幸いです

    キャンセル

  • 2017/04/27 15:32

    koou 様
    度々恐れ入ります!
    再度質問させて頂いた、件数表示については、自己解決出来ました!

    ソースの書き順が問題でありました。

    ありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • PHP

    24080questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    8947questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。