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

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

ただいまの
回答率

89.06%

ターム絞り込み チェックした記事が表示されない。

解決済

回答 1

投稿 編集

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

退会済みユーザー

テーマは「Lightning」を使用しております。

https://kotori-blog.com/wordpress/refinement_search/#refinement6_1
こちらの記事を参考に、ターム絞り込み検索を実装しました。

検索結果ページ(search.php)を作成し、こちらの記事を参考に
search.phpを作成したのですが、チェックした記事が表示されず、
全く関係ないものが何件か表示されます。

チェックボックスをチェックせずに、フリーワードだけを入力した場合は、
問題なく文句が含まれている記事が出てきます。

また、記事のサムネイル付き抜粋ではなく、記事の中身そのものが
一覧に表示されてしまいます。

この場合どのようなコードを書くのが正しいのでしょうか。

下記のコードはsearchform.phpsearch.phpになります。

searchform.php

<form method="get" id="search-form" action="<?php bloginfo('url'); ?>">
  <label for="s" class="assistive-text">検索</label>
  <input type="text" name="s" id="s" placeholder="検索" />
  <div>ブランドから選ぶ</div>
  <?php
    $taxonomy_name = 'products_cat_brand';
    $taxonomys = get_terms($taxonomy_name, array('hide_empty' => false));
    if(!is_wp_error($taxonomys) && count($taxonomys)):
    foreach($taxonomys as $taxonomy):
      $tax_posts = get_posts(array('post_type' => get_post_type('products'), 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
  ?>
  <label><input type="checkbox" name="post_tag[]" value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></label><br>
  <?php
    endforeach;
    endif;
  ?>
  <input type="submit" value="検索" />
</form>

search.php

<?php
$s = $_GET['s'];
$post_tag = $_GET['post_tag'];

//tax_query用
if($post_tag){
    $taxquerysp[] = array(
            'taxonomy'=>'products_cat_brand',
            'terms'=> $post_tag,
            'include_children'=>false,
            'field'=>'slug',
            'operator'=>'AND'
            );
}
?>

<div>検索条件</div>
<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>
<?php
if (is_array($post_tag)) { ?>タグ(カスタムタクソノミー):<?php
foreach($post_tag as $val){
if ($val === end($post_tag)) {
echo get_term_by('slug',$val,"products_cat_brand")->name;
    }else{
echo get_term_by('slug',$val,"products_cat_brand")->name.", ";
}
}
}
 ?>

<div>検索結果</div>

<?php
query_posts( array(
    'tax_query' => $taxquerysp,
    's' => $s,
    )
);
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>

<?php endwhile; else : ?>

<div>該当なし</div>

<?php endif;
wp_reset_query(); ?>

※追記

<?php $post_tags = get_query_var( 'post_tag' );  var_dump( $post_tags ); ?>
こちらのコードを、search.phpに入力し値を確認してみたところ、
string(0) ""と書いておりました。

※追記2

WordPressフォーラムにて、「もう少し具体的にやりたいことを教えてほしい。」と仰っていただいたため追記いたします
https://ja.wordpress.org/support/topic/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E6%8A%95%E7%A8%BF%E3%82%BF%E3%82%A4%E3%83%97%E3%81%AE%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

商品を管理する、カスタム投稿タイプを作成しました。
商品数が膨大なため、チェックボックスを使った複数のタクソノミー内の
ターム絞り込み検索を実装したいです。(test1タクソノミー内のtest2ターム, test3タクソノミー内のtest4ターム、という風に複数のタクソノミー内のタームにチェックをしたい。)

チェックをしたタームが付いている全ての記事を検索結果(search.php)で表示したいです。(‘operator’=>’AND’で言うところの、ORと思っていただければと思います。)

本文にも記載してます通り、参考URLを見ながら作成してみたのですが、チェックしたタームの記事ではなく、固定ページのページ一覧が表示されてしまいます。

また、検索結果ページの記事一覧のスタイルを、記事のタイトル +サムネイル+ 本文の抜粋 を表示したいのですが、今現時点では記事の内容全てが検索結果に出るようになってしまっています。

追記3

※追記です。
「また、検索結果ページの記事一覧のスタイルを、記事のタイトル +サムネイル+ 本文の抜粋 を表示したいのですが」と言ったんですが、
テーマのデフォルト一覧表示形式で問題ないです。(Lightningテーマを使用しております。)

※追記4

WordPressフォーラム先で、下記の参考サイトを紹介して頂き、
https://illustswitch.com/wordpress-search-filter/

ご紹介いただいた、サイトを参考に作成してみたのですが

search.phpを作成せず、searchform.phpだけを作成した場合、不具合なくカテゴリー検索が出来たのですが、
search.phpを作成すると、「検索結果が見つかりませんでした。」となり、やはり検索結果がありません。

以前のコードでは、固定ページは表示されていたのですが、現状では固定ページさえも表示されなくなってしまいました。

検索結果ページでは、以下のコードの部分(ページでは「カテゴリー:(選択したカテゴリー)」)
が、きちんと選択したカテゴリーが表示されています。

search.php

39 <h1>検索結果</h1>
40 <?php
41 if(is_array($get_cats)) {
42     echo '<p>カテゴリー:';
43    foreach ($get_cats as $val) {
44        $p_term = get_term_by('slug', $val, 'products_cat_brand');
45        echo $p_term->name;
46        if ($val !== end($get_cats)) {
47            echo ', ';
48        }
49    }
50    echo '</p>';
51 } ?>

ご紹介していただいたサイトを元に、作成してみたコードを下に記載しておきますので、
ご教示のほど、よろしくお願いいたします。

searchform.php

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

<h2>カテゴリー</h2>
<?php
$taxonomies_args = array(
    'orderby' => 'name',
    'order' => 'ASC',
);
$taxonomies = get_terms( 'products_cat_brand', $taxonomies_args );
foreach($taxonomies as $taxonomies) :
?>
<label><input type="checkbox" name="get_cats[]" value="<?php echo $taxonomies->slug; ?>"><?php echo $taxonomies->name; ?></label>
<?php endforeach; ?>

<h2><?php _x( 'Search for:', 'label' ); ?>キーワード</h2>
<input type="text" value="<?php echo get_search_query(); ?>" name="s" id="s" placeholder="キーワードを入力してください" />

<input type="submit" value="検索" />
</form>

search.php

<?php
$s = $_GET['s'];
$get_cats = $_GET['get_cats'];
$get_tags = $_GET['get_tags'];

if($get_cats) {
    $tax_ary[] = array(
        'taxonomy' => 'products_cat_brand',
        'field' => 'slug',
        'terms' => $get_cats,
        'operator' => 'IN', //ANDかIN
    );
}
if($get_tags) {
    $tax_ary[] = array(
        'taxonomy' => 'products_cat_brand',
        'field' => 'slug',
        'terms' => $get_tags,
        'operator' => 'IN', //ANDかIN
    );
}
?>
<?php if (!($s || $get_cats || $get_tags)): ?>
    <p>検索条件を指定してください</p>
    <?php get_search_form(); ?>
<?php else: ?>

<h1>検索結果</h1>
<?php
if(is_array($get_cats)) {
    echo '<p>カテゴリー:';
    foreach ($get_cats as $val) {
        $p_term = get_term_by('slug', $val, 'products_cat_brand');
        echo $p_term->name;
        if ($val !== end($get_cats)) {
            echo ', ';
        }
    }
    echo '</p>';
} ?>
<?php
if(is_array($get_tags)) {
    echo '<p>タグ:';
    foreach ($get_tags as $val) {
        $s_term = get_term_by('slug', $val, 'products_cat_brand');
        echo $s_term->name;
        if ($val !== end($get_tags)) {
            echo ', ';
        }
    }
    echo '</p>';
} ?>
<?php
if($s) { echo '<p>キーワード:'.$s.'</p>'; } ?>

<?php
    $my_query = new WP_Query( array(
        'paged' => get_query_var('paged'),
        'post_type' => 'post',
        'tax_query' => $tax_ary,
        'relation' => 'AND', //ANDかOR
        's' => $s,
)); ?>
<?php if($my_query->have_posts() ) : ?>
<ul>
<?php while( $my_query->have_posts()) : $my_query->the_post(); ?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
</li>
<?php endwhile; ?>
</ul>
<?php else: ?>
<p>結果が見つかりませんでした。</p>
<?php endif; ?>
<?php get_search_form(); ?>
<?php endif; ?>

※追記5

WordPressフォーラムにて、プラグインのご紹介をしていただきました。
「Search & Filter」https://ja.wordpress.org/plugins/search-filter/
ドキュメント:http://docs.designsandcode.com/search-filter/
かなり私がやりたいことに近いです。
ですが、少しプラグイン無しにこだわっているところがあるので
解決しなければ、こちらのプラグインを使おうかと思います。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

「Search & Filter」というプラグインを使用し、簡単に思い通りの実装ができました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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