expexp.jp

WordPress

【WordPress】管理画面でカスタム投稿一覧をタームで絞り込みをしたい

WordPressの管理画面で、通常の投稿一覧で行える「カテゴリーの絞り込み検索」。これをカスタム投稿でも行えるようにするサンプルを紹介します。

カテゴリー(ターム)による投稿の絞り込みは、ユーザー要望の多いカスタムの一つですね。

サンプルでは商品情報にみたてたカスタム投稿’product’、その商品カテゴリーのタクソノミーを’product_cat’としています。サンプルを利用する場合は任意のものに変えて使ってください。

関数作成

functions.phpにタームによる絞り込みを行えるようにする関数を記述します。

functions.php

今回は親子関係がある2階層目までを表示する仕組みにしています。

使う関数はget_terms()くらいです。

// 管理画面:投稿一覧でタームでの絞り込みを可能にする
add_action( 'restrict_manage_posts', 'add_post_product_cat_restrict_filter' );
function add_post_product_cat_restrict_filter() {

  /* カスタム投稿タイプを取得 */
  global $post_type;

  /* タームで絞り込みを行いたいカスタム投稿タイプの場合 */
  if ( 'product' == $post_type ) {

    /* 検索's'の変数がセットされている場合 */
    if ( isset( $_GET['s'] ) ) {

      /* 選択されたターム情報を取得し、変数へ代入 */
      $select_product_cat = $_GET['product_cat'];
    }

    /* タームのセレクトボックスを生成 */ ?>
    <select name="product_cat">
      <option value="">カテゴリー指定なし</option>
      <?php

      /* 最上位のターム一覧を取得。空のタームも含む。 */
      $terms = get_terms( 'product_cat',
        array( 'hide_empty' => false, 'parent' => 0 )
      );

      /* 取得したタームをオプションに変換 */
      foreach ( $terms as $term ) {

        /* 選択されたタームと同じタームの場合 */
        ( $term->slug == $select_product_cat ) ? $selected = 'selected' : $selected = '';
        
        ?>
        <option value="<?php echo $term->slug; ?>" <?php echo $selected; ?>><?php echo $term->name; ?></option>
        
        <?php /* 今回は2階層目まで表示したいので子を持っているターム一覧も取得 */
        $child_terms = get_terms( 'product_cat',
          array( 'hide_empty' => false, 'parent' => $term->term_id )
        );

        /* 子タームを取得できた場合 */
        if( !empty( $child_terms ) ) {

          /* 子タームをオプションに変換 */
          foreach( $child_terms as $child_term ) {

            /* 選択されたタームと同じタームの場合 */
            ( $child_term->slug == $select_product_cat ) ? $selected = 'selected' : $selected = '';

            ?>
            <option value="<?php echo $child_term->slug; ?>" <?php echo $selected; ?>>ー <?php echo $child_term->name; ?></option>
            <?php
          }
        }
      } ?>
    </select>
    <?php
  }
}