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

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

ただいまの
回答率

90.34%

  • WordPress

    7634questions

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

WordPress検索機能で複数のタームを設定したい。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 659

ryuji0205

score -5

オリジナルテーマを作成しWordPress内で設定したカスタム投稿のカスタムタクソノミー検索を行いたいのですが、いまいち結果が出ずご相談させてください。

住宅ポータルサイトを作成し一つのカスタム投稿内に複数のタクソノミーを設定してます。
●例:【住宅情報】と言うカスタム投稿内に
「新宿区」「足立区」「板橋区」などのタクソノミーAと
「家賃10万円以上」「家賃15万円以上」「家賃20万円以上」のタクソノミーBを設定。
住宅情報を更新する際は、それぞれ条件に当てはまるタクソノミーからタームを選択し、「地区」「家賃」と言ったリンクから対応したタクソノミーの一覧情報(記事)のみ表示させるようにしてます。

●質問
チェックボックスから複数の条件をヒットさせる方法を教えてください。
サイドバー内に検索部分を設置し「新宿区」「家賃20万円以上」をチェック「検索する」ボタンを押して、2つの条件にヒットしたもののみ検索結果一覧に表示させたいです。

●現状
地域としてタクソノミー設定した area_all を自動ですべて表示させるようにしてます。ここに他のタクソノミーを表示させ、チェックボックスを付けた検索を行いたいです。

【searchform.php】

<form method="get" id="search-form" action="<?php echo esc_url(home_url('/')); ?>">
<input type="hidden" name="post_type" value="area">
<input type="hidden" class="field" name="s">

<?php
$taxonomy_name = 'area_all';
$args = array( 'orderby' => 'description', 'hide_empty' => false );
$taxonomys = get_terms($taxonomy_name,$args);
if(!is_wp_error($taxonomys) && count($taxonomys)):
foreach($taxonomys as $taxonomy):
$tax_posts = get_posts(array('post_type' => 'area', 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
if($tax_posts):
?>
<label class="search-label-<?php echo $taxonomy->slug; ?>"><input type="checkbox" name="cat_area[]" value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></label>
<?php
endif;
endforeach;
endif;
?>

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

検索結果の
【search.php】

<?php
//絞り込みの値を取得
$s = $_GET['s'];
$post_type = $_GET['post_type'];
$cat_area = $_GET['cat_area'];
$post_tag = $_GET['post_tag'];
//絞り込みの値をクエリ用に代入
if( !empty($cat_area) ) {
$cat_area_selected = array('taxonomy'=>'area_all','terms'=>$cat_area,'field'=>'slug','operator'=>'IN');
}
if( !empty($post_tag) ) { //タグの場合
$post_tag_selected = array('taxonomy'=>'post_tag','terms'=>$post_tag,'field'=>'slug','operator'=>'IN');
}
//タクソノミー絞り込みの場合はクエリを指定
if( !empty($cat_area) || !empty($post_tag) ) {
query_posts( array(
'paged' => $paged,
'post_type' => $post_type,
's' => $s,
'tax_query' => array(
'relation' => 'AND',
$cat_area_selected,
$post_tag_selected
)
)
);
}
?>


<?php if( !empty($cat_area) || !empty($post_tag) ) { ?>
<div class="refine-by">&#8216;
<?php
if(is_array($cat_area)) {
foreach($cat_area as $val){
echo get_term_by('slug',$val,"area_all")->name." ";
}
}
if(is_array($post_tag)) { //タグの場合
foreach($post_tag as $val){
echo get_term_by('slug',$val,"post_tag")->name." ";
}
}
?>
&#8217 の検索結果</div>
<?php
} else {
echo '<div class="refine-by">&#8216;'.$s.'&#8217; の検索結果</div>';
}
?>


<ul>
<?php if( have_posts() ): while ( have_posts() ) : the_post(); ?>
<li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; else: endif; ?>
</ul>



<?php if (isset($_GET['s']) && empty($_GET['s'])) { ?>

            <p>検索条件が入力されていません。</p>
        <?php } else { ?>
            <?php if(have_posts()): ?>
                <?php while(have_posts()): the_post(); ?>
                    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
                <?php endwhile; ?>
            <?php else : ?>
                <p><?php echo $search_query; ?> に一致する情報は見つかりませんでした。</p>
            <?php endif; ?>
        <?php } ?>


---------------------------------

<?php if( !empty($cat_area) || !empty($post_tag) ) { ?>
<h2>絞り込み検索結果</h2>
<ul>
<?php if( have_posts() ): while ( have_posts() ) : the_post(); ?>
<li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; else: endif; ?>
</ul>
<?php } else{ ?>
<h2>キーワード検索結果</h2>
<ul>
<?php if( have_posts() ): while ( have_posts() ) : the_post(); ?>
<li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; else: endif; ?>
</ul>
<?php } ?>

■補足
上記のソースで検索フォームに「 area_all 」タクソノミーで設定したタームは表示されており、検索結果で絞り込みは出来ております。ただ「 area_all 」のタームしか表示されないので、別のタクソノミーを追加表示し、そのタームも検索できるようにしたいのが最終形態です。
よろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

結果が出ず、ということですが、query_postsでデータが取得できていますか?

$_GET['post_tag']がformにありませんが、query_postsで$post_tag_selectedを呼び出しています。
以下のような書き方はいかがでしょうか。

if(!empty($_GET["cat_area"])||!empty($_GET["post_tag"])){
 $taxquery = array('relation' => 'AND');
 if(!empty($_GET["cat_area"])){
  $cat_area = $_GET["cat_area"];
  $taxquery[] = array(
   'taxonomy'=>'area_all',
   'terms'=>$cat_area,
   'field'=>'slug',
   'operator'=>'IN'
  );
}
if(!empty($_GET["post_tag"])){
 $post_tag = $_GET["post_tag"];
  $taxquery[] = array(
   'taxonomy'=>'post_tag',
   'terms'=>$post_tag,
   'field'=>'slug',
   'operator'=>'IN'
  );
 }
}else{
 $taxquery = NULL;
}
query_posts(array(
'paged' => $paged,
'post_type' => $post_type,
's' => $s,
'tax_query' => $taxquery
)
);

<<追記>>
すみません、質問を読み違えていました。
$taxonomy_nameを配列にしてループを回せば良いと思います。
以下のソースではinputのnameが全てcat_area[]になりますのでその点は必要に応じて修正してください。

<?php
$taxonomy_name = array('area_all','taxonomy1','taxonomy2');
$args = array( 'orderby' => 'description', 'hide_empty' => false );
foreach($taxonomy_name as $value):
 $taxonomys = get_terms($value,$args);
 if(!is_wp_error($taxonomys) && count($taxonomys)):
 foreach($taxonomys as $taxonomy):
  $tax_posts = get_posts(array('post_type' => 'area', 'taxonomy' => $value, 'term' => $taxonomy->slug ) );
  if($tax_posts):
?>
<label class="search-label-<?php echo $taxonomy->slug; ?>"><input type="checkbox" name="cat_area[]" value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></label>
<?php
endif;
endforeach;
endif;
endforeach;
?>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/16 15:07

    <form method="get" id="search-form" action="<?php echo esc_url(home_url('/')); ?>">
    <input type="hidden" name="post_type" value="area">
    <input type="hidden" class="field" name="s">



    <?php




    if(!empty($_GET["cat_area"])||!empty($_GET["cat_area"])){
    $taxquery = array('relation' => 'AND');
    if(!empty($_GET["cat_area"])){
    $cat_area = $_GET["cat_area"];
    $taxquery[] = array(
    'taxonomy'=>'area_all',
    'terms'=>$cat_area,
    'field'=>'slug',
    'operator'=>'IN'
    );
    }
    if(!empty($_GET["cat_area"])){
    $cat_area = $_GET["cat_area"];
    $taxquery[] = array(
    'taxonomy'=>'yachin',
    'terms'=>$cat_area,
    'field'=>'slug',
    'operator'=>'IN'
    );
    }
    }else{
    $taxquery = NULL;
    }
    query_posts(array(
    'paged' => $paged,
    'post_type' => $post_type,
    's' => $s,
    'tax_query' => $taxquery
    )
    );

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



    すいません、上記のように設定しましたがチェックボックスが表示されませんでした...
    このあたり結構無知なので、おそらく自分の書き方が間違ってると思うのですがご教授頂けますでしょうか。
    よろしくお願い致します。。

    キャンセル

  • 2018/04/16 16:39

    指定した記述はチェックボックスを出力するものでなく、form送信後の絞り込みのためのものです。
    チェックボックス部分は初期の状態に戻して頂いて、search.phpのquery_postsを書き換えてください。
    わかりにくくてすみません。

    キャンセル

  • 2018/04/16 19:23

    すいません、私の説明が不足していたので補足部分を追記しました。

    検索結果ではなく検索窓に他のタームを表示し、そこに表示されてるタームを自由にチェックボックスで選択、選択したタームの記事を表示させたいです。
    上記のソースで検索→絞り込みは出来たのですが、他のタームも表示させたいのが希望です。

    キャンセル

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

  • WordPress

    7634questions

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