エス技研WordPress専科

WordPressの基本的な使い方から SEOの対応、プラグイン情報、カスタマイズ方法を解説します。


get_categories、get_termsでカテゴリとタクソノミーのターム一覧の編集方法

      2016/01/12

get_categories()関数と get_terms()関数

 

カテゴリやタクソノミーのターム一覧を取得する関数

 
WordPressのカテゴリやカスタムタクソノミーのターム一覧を取得する関数は複数存在しています。
 
例えば、「wp_list_categories()」関数。
これは、一覧として HTMLのタグも含めて編集してくれる関数ですので、サイドナビゲーションのウィジェットなどにターム一覧を編集する場合に最適です。
 
それを利用した表示については下記に記事を書いています。
 カスタムタクソノミーのターム一覧をウィジェットにショートコードで編集
 タクソノミーの一覧をショートコードで編集・ソート機能付き・wp_list_categories
 
 
逆に、タームの情報を一覧として表示するのではなく、配列やオブジェクトとして取得して加工して利用する場合には「get_categories()」関数、「get_terms()」関数が便利です。
 
「get_categories()」関数と「get_terms()」関数は取得できる値は同じですが、指定できる値の取得条件は「get_terms()」関数の方が多いため、「get_terms()」関数を使う方がよさそうです。
 
「get_categories()」関数は、カテゴリの値を取得するのに便利なように作られていますが、処理としても内部で「get_terms()」関数を呼び出していますので、「get_terms()」関数を使えるようになっておく方がよさそうです。
 
 
ということで、この記事では「get_terms()」関数を使ったサンプルを紹介します。
 
 

タクソノミーのタームを取得して加工する一例

 
例として、カスタムタクソノミーを条件に検索システムを作りたい、と思った場合の検索条件側を設定する方法です。
 
20160113_01_plugin
 
非常に限定的な例ですが(笑)、検索処理を作る場合はカスタムタクソノミーを検索条件にしたいという場合は多いんじゃないかと思います。
早い話が現在そういうシステムを作っていますので、それの作り方の紹介記事ですね。
 

// タクソノミーのタームを取得
$terms_order = get_terms ( "ss_category", array ( 'orderby' => 'term_order', 'order' => 'ASC' ) );

// 親タームと子供のタームに分解
foreach ( $terms_order as $term ) {
  if ( $term -> parent == "0" ) {
    $parents_object[]  = $term;
  } else {
    $children_object[] = $term;
  }
}

// 親カテゴリー(親ターム)
foreach ( $parents_object as $parent ) {
  if ( isset ( $_POST["chk_category"] ) ) {
    if ( in_array ( $parent -> slug, $_POST["chk_category"] ) ) {
      $checked_text = " checked";
    } else {
      $checked_text = "";
    }
  }

  echo "<br>\n" . '<input type="checkbox" name="chk_category[]" value="' . $parent -> slug . '"' . $checked_text . '>' . $parent -> name;

  // 子カテゴリー(子ターム)
  $child_flg = "";
  foreach ( $children_object as $child ) {
    if ( $parent -> term_id == $child -> parent ) {
      if ( $child_flg != 1 ) {
        echo ' - ';
      }

      if ( isset ( $_POST["chk_category"] ) ) {
        if ( in_array ( $child -> slug, $_POST["chk_category"] ) ) {
          $checked_text = " checked";
        } else {
          $checked_text = "";
        }
      }

      echo '<input type="checkbox" name="chk_category[]" value="' . $child -> slug . '"' . $checked_text . '>' . $child -> name . "  ";
      $child_flg = 1;

      // 孫カテゴリー(孫ターム)
      $child_flg2 = "";
      foreach ( $children_object as $child2 ) {
        if ( $child -> term_id == $child2 -> parent ) {
          if ( $child_flg2 != 1 ) {
            echo ' - ';
          }

          // 
          if ( isset ( $_POST["chk_category"] ) ) {
            if ( in_array ( $child2 -> slug, $_POST["chk_category"] ) ) {
              $checked_text = " checked";
            } else {
              $checked_text = "";
            }
          }

          echo '<input type="checkbox" name="chk_category[]" value="' . $child2 -> slug . '"' . $checked_text . '>' . $child2 -> name . "  ";
          $child_flg2 = 1;
        }
      }

    }
  }
}

 
 
これを編集するファイルは、「archive.php」などの一覧ページになります。
一覧ページは、カテゴリごと、タクソノミーごとのテンプレートファイルも作成することができますので「WordPressの一覧ページのテンプレートの種類とファイルの設定」を参考にしてください。
 
 
「get_terms()」関数の親子タームを取得する「parent」パラメータを使用して取得する方法も考えました。こちらは子タームまでの取得ですが。
こちらの方がスマートな書き方になると思って書き始めましたが、「get_terms()」関数を何度も実行するため、処理は遅くなると思います。
 

// 親ターム取得
$parents_object = get_terms ( "ss_category", array ( 'orderby' => 'term_order', 'order' => 'ASC', 'parent' => 0 ) );

foreach ( $parents_object as $parent ) {
  if ( isset ( $_POST["chk_category"] ) ) {
    if ( in_array ( $parent -> slug, $_POST["chk_category"] ) ) {
      $checked_text = " checked";
    } else {
      $checked_text = "";
    }
  }
  echo "<br>\n" . '<input type="checkbox" name="chk_category[]" value="' . $parent -> slug . '"' . $checked_text . '>' . $parent -> name;

  // 子ターム取得
  $children_object = get_terms ( "ss_category", array ( 'orderby' => 'term_order', 'order' => 'ASC', 'parent' => $parent -> term_id ) );
  if ( ! empty ( $children_object ) ) {
    echo "(";
    $child_flg = "";
    foreach ( $children_object as $child ) {
      if ( isset ( $_POST["chk_category"] ) ) {
        if ( in_array ( $child -> slug, $_POST["chk_category"] ) ) {
          $checked_text = " checked";
        } else {
          $checked_text = "";
        }
      }
      if ( $child_flg ) {
        echo " ";
      }
      echo '<input type="checkbox" name="chk_category[]" value="' . $child -> slug . '"' . $checked_text . '>' . $child -> name;
      $child_flg = "1";
    }
    echo ")";
  }
}

 
 

「get_categories()」関数と「get_terms()」関数の違い

 
「get_categories()」と「get_terms()」は、いずれも条件を設定し、その条件に合致するタクソノミーのタームを取得する関数です。
 
ですが、パラメータの指定の方法が少し違うことと、指定できるパラメータの数が違います。
 
 

「get_categories()」と「get_terms()」のパラメータの指定の方法

「get_categories()」と「get_terms()」の標準形は以下の通り。

// get_categories()関数
get_categories ( $args ); 

// get_terms()関数
get_terms ( $taxonomies, $args ); 

 
それぞれパラメータを指定する配列の例としては以下の通り。
「$taxonomies」は 1つのみの指定の場合は配列でなくても OKです。

// $args指定の一例
$args = array ( 'orderby'       => 'name', 
                'order'         => 'ASC', );

// $taxonomies指定の一例
$taxonomies = 'ss_category';

// $taxonomies指定の一例
$taxonomies = array( 'ss_category',
                     'ss_area', );

 
 

「get_categories()」と「get_terms()」の両方が指定できる項目

 
taxonomies
タームを取得するタクソノミーを指定します。
get_categories()関数の場合は「category」がデフォルトになります。
 
orderby
ソートするフィールドを指定します。デフォルトは「name」です。
 
order
ソートする順番を指定します。デフォルトは「ASC」です。
 
hide_empty
属する投稿がないタームを取得するか否かを指定します。
 
exclude
除外するターム IDを配列で指定します。
 
include
取得対象にするタームを IDの配列で指定します。指定がない場合はすべてのタームが対象になります。
 
number
取得するタームの最大数を指定します。指定がない場合は全件取得します。
 
parent
親タームの IDを指定し、直近の子(1レベル下の)タームを取得します。「0」を指定するとトップレベルのタームのみを取得します。
 
hierarchical
子タームを持つタームを取得するか、否かを指定します。デフォルトは「1(true)」で、子タームを持つものも取得します。
 
child_of
指定したタームの全ての子孫のタームを取得します。
「parent」は 1レベル下のタームしか取得しませんが、「child_of」はすべての子孫を取得します。
 
pad_counts
子孫のタームの投稿数のカウントを合計するか、否かを指定します。デフォルトは「0(false)」で合計しません。
 
 

「get_terms()」のみ指定できる項目

 
exclude_tree
親タームを指定してそれに属するターム全てを除外する場合に指定します。
 
fields
取得するフィールドを指定します。デフォルトは「all」で全項目を取得します。
 
slug
取得するタームの slugを指定します。
 
childless
階層を持たないタームのみを取得します。
 
get
「all」を指定すると「hide_empty」と「child_of」の指定が無効になります。
 
name__like
ターム名にマッチさせたい文字列を指定します。ターム名に対して「LIKE ‘%string%’」の部分一致検索を実行します。
 
description__like
タームの説明にマッチさせたい文字列を指定します。タームの説明に対して「LIKE ‘%string%’」の部分一致検索を実行します。
 
offset
取得できるタームの何番目から取得するかを指定します。「number」と一緒に使わないと無視されます。
 
search
ターム名、slugにマッチさせたい文字列を指定します。ターム名、slugに対して「LIKE ‘%string%’」の部分一致検索を実行します。
 
cache_domain
クリエをキャッシュする場合に指定します。
 
 

「get_categories()」関数と「get_terms()」関数で取得できる値

 
「get_categories()」関数と「get_terms()」関数では、以下のようなオブジェクトとして値が取得できます。
 

Array (
  [0] => stdClass Object (
        [term_id] => 16            // タームID
        [name] => レジャー施設     // タームの名称
        [slug] => ss_leisure       // タームのslug
        [term_group] => 0          // タームのグループ
        [term_order] => 1          // Category Order and Taxonomy Terms Orderで設定した順番
        [term_taxonomy_id] => 16   // タームID
        [taxonomy] => ss_category  // タームが属するタクソノミーの slug
        [description] =>           // タームの説明
        [parent] => 0              // タームの親のタームID。「0」は親ターム。
        [count] => 5               // タームに含まれる記事の件数
      )
)

 
 

「get_categories()」関数と「get_terms()」関数のリファレンス

 
「get_categories()」関数と「get_terms()」関数のオフィシャルサイトのリファレンスは以下の場所にそれぞれあります。
 
get_categories()関数は、
  https://wpdocs.osdn.jp/関数リファレンス/get_categories
get_terms()関数
  https://wpdocs.osdn.jp/関数リファレンス/get_terms
 
また、リファレンスには関数の設置場所も記載がありました。
 
get_categories()関数は、
  wp-includes/category.php にあります
get_terms()関数
  wp-includes/taxonomy.php にあります
 
 

カテゴリーやタクソノミーに関連する関数について

 
最後に今回は使いませんでしたが、カテゴリやタクソノミーに関連する関数について書いておきます。
 
the_category()
ループ内で使用して、投稿が属するカテゴリを HTMLに編集された形で取得します。
 
get_the_category()
PostIDを指定して、カテゴリの情報を配列で取得します。
 
wp_list_categories()
条件を指定して条件に合致したカテゴリ、タクソノミーの一覧を HTMLに編集された形で取得します。
 
get_category_link()
カテゴリIDからカテゴリ名とリンクを取得します。
 
get_cat_ID()
カテゴリ名からカテゴリIDとリンクを取得します。
 
get_category_by_slug()
slugからカテゴリ名とカテゴリのリンクを取得します。
 
get_the_term_list()
PostIDを指定して、タクソノミーの情報を HTMLに編集された形で取得します。
 
get_the_terms()
PostIDを指定して、タクソノミーの情報を配列で取得します。

 - WordPressのカスタマイズ

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload the CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

WordPressプログラム全体で定数や変数を利用する場合の設定方法

WordPressで関数を追加するときなど、全体で同じ変数を使いたいと思う場面の対処方法です。変数を記述する関数はfunctions.php、wp-config.phpのいずれか。

WordPressプラグイン開発・ショートコード内でincludeするときにはob_start、ob_get_contents

WordPressのプラグインやショートコードの関数作成でテンプレートをincludeする際に利用するob_start関数、ob_get_contents関数を紹介。

WordPressのメールフォームはwp_mail()関数でメール送信。スパム対策も

WordPressでメール送信フォームを作成するための関数「wp_mail()」の使い方の解説。CC、BCC、添付ファイルも HTMLメールも設定可能。

ショートコード+ウィジェットでサイドバーに人気記事を表示させる方法

WordPressのサイドナビゲーションに人気記事を編集する方法です。プラグインを使わずウィジェットにショートコードで任意のPostIDを指定することで編集する方法です。

WordPressでダブルクォートなどの文字が自動変換?原因と対処方法

ダブルクォート、シングルクォート、HTMLタグなどが自動変換関数によって入力と違う形で表示されます。原因を2つの関数ごとに説明し、対応方法を3パターン提示します。

タクソノミーの一覧をショートコードで編集・ソート機能付き・wp_list_categories

カスタムタクソノミーのターム一覧をショートコードで編集する方法の解説です。Category Order and Taxonomy Terms Orderを利用してソート機能を追加したバージョンです。

自サイト内のリンクをショートコードで指定する・アンカーリンク対応版

自サイト内の記事にショートコードで自動リンクを設定する関数のソースコードを提供。Post ID、slugで指定でき、アンカーリンクを設定する場合も対応。

WordPressの記事編集で文字が自動変換される要注意な文字列

記事を編集する際、入力した文字とは違う表示のされ方をする文字、アポストロフィ、ダブルクォート、円マーク、三点リーダ(…)など、その解説と対応方法です。

WordPressの一覧ページのテンプレートの種類とファイルの設定

ファイル名に従って一覧ページのテンプレートは選択される。ルールに従ってファイル名を付けることで任意のカテゴリ、タクソノミーごとのテンプレートを指定可能。

カスタムタクソノミーのターム一覧をウィジェットにショートコードで編集

カスタムタクソノミーに属するターム(カテゴリ)の一覧を wp_list_categories()関数+ショートコードでウィジェットに編集するサンプルプログラムです。