プルダウンで2つのタクソノミーを絞り込み

情報を追記している場合はありますが、古い情報を訂正はしていませんので、公開年月日を参照してください。プラグイン・タグ、いずれもワードプレス・PHPのバージョン等によって動作しない場合もあります。

ワードプレスのカスタム投稿タイプ一覧でプルダウンで2つのタクソノミーを絞り込む。

タクソノミーAをオプショングループとして、タクソノミーBの投稿の有無を確認して、あればオプションを表示する
<?php $terms = get_terms('taxonomy-a'); if( $terms && !is_wp_error($terms) ){ ?>
<select id="taxonomy-a">
  <option value="">選択してください</option>
<?php foreach ( $terms as $term ) { ?>
  <option value="<?php echo $term->slug; ?>"><?php echo $term->name; ?></option>
<?php } ?>
</select><?php } ?>
<select id="taxonomy-b">
  <option value="">選択してください</option>
</select>
	<select id="taxonomy-b" onChange="location.href=value;"><option>選択してください</option>
<?php $terms = get_terms('taxonomy-a'); if( $terms && !is_wp_error($terms) ){ ?><?php foreach ( $terms as $term ) { ?>
  <optgroup label="<?php echo $term->name; ?>">
<?php $bterms = get_terms('taxonomy-b'); if( $bterms && !is_wp_error($terms) ){ ?><?php foreach ( $bterms as $bterm ) { ?>
<?php $args = array('post_type' => 'news', 'posts_per_page' => '-1',
  'tax_query' => array(
    'relation' => 'AND',
     array(
        'taxonomy' => 'taxonomy-a',
        'field' => 'slug',
        'terms' => $term->slug,
     ),
     array(
        'taxonomy' => 'taxonomy-b',
        'field' => 'slug',
        'terms' => $bterm->slug,
     )
    )
); $the_query = new WP_Query($args); if ($the_query->have_posts()) : ?>
    <option value="<?php echo esc_url( home_url( '/' ) ); ?>news?taxonomy-a=<?php echo $term->slug; ?>&taxonomy-b=<?php echo $bterm->slug; ?>"><?php echo $bterm->name; ?></option>
<?php endif; } } ?>
  </optgroup>
<?php } } ?>
</select>
2つのプルダウンを連動、カテゴリーを選択して店舗を選択するとジャンプ
<select id="cate">
  <option value="">カテゴリーを選択</option>
<?php $terms = get_terms('news_cat'); if( $terms && !is_wp_error($terms) ){ ?>
<?php foreach ( $terms as $term ) { ?>
  <option value="<?php echo $term->slug; ?>"><?php echo $term->name; ?></option>
<?php } } ?>
</select>
<select style="padding:20px;border:1px #ccc solid;min-width:200px;" id="shop_name" onChange="location.href=value;">
 <option value="">店舗を選択</option>
</select>

<script type="text/javascript">
var array = new Array();
<?php $terms = get_terms('news_cat'); if( $terms && !is_wp_error($terms) ){ ?>
array[''] = new Array({val:"0", label:"店舗を選択"});
	<?php $count=1; foreach ( $terms as $term ) { if ($count==1) { ?>
	array["<?php echo $term->slug; ?>"] = new Array(
  {val:"", label:"店舗を選択"},
<?php $shops = get_terms('shop_name'); if( $shops && !is_wp_error($terms) ){ ?><?php foreach ( $shops as $shop ) { ?>
<?php $args = array('post_type' => 'news', 'posts_per_page' => '-1',
  'tax_query' => array(
    'relation' => 'AND',
     array(
        'taxonomy' => 'news_cat',
        'field' => 'slug',
        'terms' => $term->slug,
     ),
     array(
        'taxonomy' => 'shop_name',
        'field' => 'slug',
        'terms' => $shop->slug,
     )
    )
); $the_query = new WP_Query($args); if ($the_query->have_posts()) : ?>
  {val:"<?php echo esc_url( home_url( '/' ) ); ?>news?news_cat=<?php echo $term->slug; ?>&shop_name=<?php echo $shop->slug; ?>", label:"<?php echo $shop->name; ?>"},
<?php endif; wp_reset_postdata(); ?><?php } } ?>
);<?php } else { ?>
array["<?php echo $term->slug; ?>"] = [
  {val:"", label:"店舗を選択"},
<?php $shops = get_terms('shop_name'); if( $shops && !is_wp_error($terms) ){ ?><?php foreach ( $shops as $shop ) { ?>
<?php $args = array('post_type' => 'news', 'posts_per_page' => '-1',
  'tax_query' => array(
    'relation' => 'AND',
     array(
        'taxonomy' => 'news_cat',
        'field' => 'slug',
        'terms' => $term->slug,
     ),
     array(
        'taxonomy' => 'shop_name',
        'field' => 'slug',
        'terms' => $shop->slug,
     )
    )
); $the_query = new WP_Query($args); if ($the_query->have_posts()) : ?>
  {val:"<?php echo esc_url( home_url( '/' ) ); ?>news?news_cat=<?php echo $term->slug; ?>&shop_name=<?php echo $shop->slug; ?>", label:"<?php echo $shop->name; ?>"},
<?php endif; wp_reset_postdata(); ?><?php } } ?>
];
<?php } $count++; } } ?>

document.getElementById('cate').onchange = function(){
  shop = document.getElementById("shop_name");
  shop.options.length = 0
  var changedPref = cate.value;
  for (let i = 0; i < array[changedPref].length; i++) {
    var op = document.createElement("option");
    value = array[changedPref][i]
    op.value = value.val;
    op.text = value.label;
    shop.appendChild(op);
  }
}
	</script>

連動するスクリプトはこちら参照
再度 {val:””, label:”店舗を選択”},を入れているのは、選択肢が1つでもジャンプさせるため。