WEMOブログ向けWordPressテーマ「SWELL」をリリースしました!コピペで終わらない、本質的な理解を目指した知識整理のメモをお届け。2019.10.20今回は、カテゴリー・タグ・カスタムタクソノミーのターム情報を全て取得する方法をまとめていこうと思います。サイドバーやフッターに、「カテゴリー一覧」や「タグ一覧」を表示させたい時などに使える知識になります。知っておくべきなことは、カテゴリーやタグを全取得する方法はいくつかあるということ。タームの一覧を取得する方法は主に以下の2パターンです。カテゴリーでもタグでもカスタムタクソノミーでも、どのタクソノミーでも使用でき、取得したいタームの条件を詳細に指定してデータを得ることができます。カテゴリー限定で使えるwp_list_categories()という関数も非常に便利ですので、知っておくといいでしょう。それぞれの違いや特徴を整理していきます。呼び方が「??」となってしまう人は、以下の記事を読んでおくと良いかと思います!混乱しがちなカテゴリー、タグ、タクソノミー、タームの意味と違い目次ターム情報が詰まっている「WP_Termオブジェクト」についてまずはじめに、「タームの情報」がどのように取得できるかを前提知識として知っておくといいかなと思います。各タクソノミーのターム情報を取得する場合、「WP_Termオブジェクト」というオブジェクトデータでターム情報を取得することがほとんどです。このWP_Termオブジェクトというものにどんな情報が保存されているのか先に確認しておきましょう。//フィルタ}このように、「タームの名前」や「ID」、「所属しているタクソノミー」などの様々な情報が詰まったオブジェクトデータがWP_Termオブジェクトです。カテゴリーやタグの各タームごとに、これらの情報が保存されています。カテゴリーのタームデータには注意が必要です。カテゴリーに関するタームにのみ、追加で以下の情報も保存されています。term_idとcat_IDというパラメータに保存されている情報は全く同じです。)名前が違うだけで取得できる情報は同じという、なんとも謎な仕様になっているので注意しましょう。了ややこしくなってしまうので、カテゴリーにのみ存在するパラメータは覚えなくていいかなと思います。関数」を使ってターム一覧を取得するここからは実際に、カテゴリーやタグの全ターム情報を取得する方法について解説していきます。関数」と称しているのは、以下の3種類の関数のことです。get_categories()get_tags()get_terms()WordPressが用意してくれているこれらの関数は、いずれもターム情報を一括で取得するものです。取得したいタームの条件を指定して、その条件に一致したタームの情報(WP_Termオブジェクト)をごっそり取得できます。カテゴリーのターム情報を取得できるのがget_categories()タグのターム情報を取得できるのがget_tags()タクソノミーのターム情報を取得できるのがget_terms()です。実はカテゴリーでもタグでもget_terms()を使用できるので、困惑しそうであればget_terms()だけ覚えておきましょう。get_categories()とget_tags()は、内部でget_terms()を呼び出しています。関数」たちですが、使用法もほぼ同じです。);上記のようにすることで、左辺の変数に取得できたターム情報が代入されます。取得したいタームの条件を配列($args)で指定するという使い方が共通していますね。get_terms()のみ、その$argsの前にタクソノミー名として$taxonomiesを指定する必要があります。説明$args取得したいタームの条件を指定する配列です。3つの関数で共通して必要となります。$taxonomies【get_terms()でのみ、第1引数として必要】タクソノミー名を指定します。'category'を指定するとカテゴリー、'post_tag'を指定するとタグのターム情報を取得できます。指定できるもの3つの関数で共通となる$argsという引数にはどのような条件を指定できるのかを見てみましょう。何も指定しないパラメータには、それぞれの初期値が自動で指定される仕組みです。get_temrs()の$argsに指定できるものをまとめています。その他の2つの関数で指定できるパラメータについては、これらよりいくつか少ないとしている記事が多かったのですが、その内容にはばらつきがありました。基本的なパラメータに関しては共通で指定可能なことは間違いないので、とりあえず上記のパラメータを覚えておき、もしget_tags()などで動作しない条件があれば「このパラメータはget_terms()専用のものなんだな」と思ってください...。各パラメータについての説明それぞれのパラメータに関する説明を表にまとめてみました。除外するタームIDの配列、またはIDをコンマで区切りで指定。取得したいタームIDの配列。空文字列を指定するとすべてのタームを対象にします。取得するタームの最大個数。デフォルト(null)ではすべてのタームを返します。連想配列を返す(キーはタームID、値は親タームID)。連想配列を返す(キーはタームID、値はスラッグ)。連想配列を返す(キーはタームID、値はターム名)。指定した値がスラッグに一致するタームを返す。指定した値が親タームのIDである場合に、直近の子タームを返す。指定すると第一階層(トップレベル)のタームのみを返す。子タームを持つタームを含めるかどうか。指定したタームの子孫をすべて取得する。すべての子孫タームを取得する。子を持たないタームのみを返すかどうか。無効になる(すべてのタームを取得する)。指定した文字列がターム名にマッチするものを取得する。指定した文字列がタームの説明にマッチするものを取得する。子孫タームすべてのカウント(紐づけられている投稿数)を合計するかどうか。'number'が指定されている場合、見つかったタームの先頭から指定の個数を読み飛ばして取得する。指定した文字列がターム名またはスラッグにマッチするものを取得する。作成したクエリにユニークなキャッシュ用キーを付与できる。この関数のフィルターを使ってクエリを変更するとき、この値にユニークな値を指定しておけばキャッシュにある同様のクエリを上書きせず残しておける。使用例$argsに指定できるたくさんのパラメータを列挙しましたが、実際にはこれら全てを使うことはありません。その時に取得したいタームの条件に合わせて、必要なパラメータだけを指定して使います。いくつか例を挙げておきます。get_categories($args);これは、以下のようにget_terms()を使っても同じです。get_tags($args);これも、get_terms()で同じことを実現できます。$args);取得したターム情報の扱い方さて、ターム情報の取得方法が分かったところで、その取得できた情報をどう扱えばいいのかを説明していきます。取得できる情報は、最初に説明したように「WP_Termオブジェクト」で返ってきます。$argsの'fields'の指定によってオブジェクトデータではなく配列で取得できたりもしますが、ややこしいので今回はデフォルトで返ってくるWP_Termオブジェクトについて説明していきます。使用例として紹介した「例2」ではタグを5つ取得していますが、この時取得できる情報(変数$terms)には5つのWP_Termオブジェクトが配列として順番に保存されています。「例2」で取得した$termsをvar_dump()で確認してみると、以下のようになります。{...}}つまり、これら5つのタグに関する情報を順番に表示しようと思ったら、取得した$termsをループ処理していくことになります。.'</ul>';これによって、以下のように5つのタグに関する情報がリストとして表示されます。先ほどの「タグ一覧の出力例1」の記述だけだと、ただタグの名前やカウント数を表示しているだけです。これではあまり意味がないので、タグアーカイブページへのリンクもつけてみましょう。...と思っても、WP_Termオブジェクトが持つ情報の中にはアーカイブページへのURL情報がない!そこで、ターム情報からアーカイブページへのリンクを取得できるget_term_link()という関数を使用します。(WP_Termオブジェクト)をそのまま引数に指定することで、そのタームアーカイブページのURLが取得できます。.'</ul>';方法2:WP_Term_Queryを使ってターム一覧を取得する次に、WP_Term_Queryを使用する方法をまとめていきます。関数たちとほぼ同じです。初見では少し複雑に見えますが、get_〇〇s()関数のように似たようなものが複数あって迷ったりすることがないので、WP_Term_Queryさえ覚えておけばなんとかなる、というメリットがあります。あと、無駄な処理やフックを通したくない時に非常に便利です。関数の中では、WP_Term_Queryが使われています。)}$term_query->get_terms()のところでget_terms()が呼び出されているように見えますが、これはテンプレートタグのget_terms()関数とは別物です。WP_Term_Query()の時点で渡しておかないといけないので注意しましょう。get_〇〇sで使えるパラメータとほぼ同じですが、'taxonomy'というパラメータでタクソノミー名を指定する必要があることに注意しましょう。カテゴリを取得する時は'category'、タグを取得したいときは'post_tag'を指定しましょう。例:単純にカテゴリ一覧を取得し、カテゴリ名を出力する。$term->name."\n";endforeach;'taxonomy'の指定がない場合は、カテゴリ・タグ・カスタムタクソノミーの全てを一緒に取得できます。WP_Term_Queryの使用例いくつか具体的な使用例を挙げてみます。'<ul>'.$list_src.'</ul>';このように、使う関数が一緒なので$argsの中身を変えるだけで様々なターム情報を取得できます。wp_list_categories()についてメモしておこうと思います。ちなみに、Codexには以下のような注意書きがありました。後継で、この二つとほぼ同じように動作します。ないのが不思議だったのですが、あくまでwp_list_cats()などの後継として作られただけみたいですね。);引数には取得したいカテゴリに関する条件を配列で指定できます。ここでの$argsは、これまでのget_〇〇s関数のものとは指定できるパラメータが異なるので注意して下さい。空文字以外の文字列を設定すると、トップページへのリンクがリストの先頭に表示される。リンクテキストは指定した文字列。