WordPressの1ページの投稿記事が持っている親カテゴリー、子カテゴリー、孫カテゴリーや親ターム、子ターム、孫タームをそれぞればらばらに取得して配列にする方法の記事を書きたいと思います。
親カテゴリーや親タームが一つしかない場合と複数ある場合では応用の仕方もそれぞれ少し違ってくるので、ちょっとした応用も含め、ひとつのケースと複数のケースをそれぞれ分けて書いています。
親カテゴリーやタームがひとつの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php $pid; $cid; $gid; //タームの場合 // $cat = get_the_terms(get_the_ID(), 'term'); //カテゴリーの場合 $cat = get_the_terms(get_the_ID(), 'category'); foreach ($cat as $key) { if ($key->parent == 0) { // $termchildren = get_term_children($key->term_id, 'term'); $pid[] = $key->term_id; } } foreach ($cat as $key) { if (in_array($key->parent, $pid, true)) { $cid[] = $key->term_id; } if (!in_array($key->parent, $pid, true) && $key->parent != 0) { $gid[] = $key->term_id; } } ?> |
get_the_terms(get_the_ID(), ‘category’)で一つの投稿記事が持つすべてのカテゴリーやタームを取得します。
最初のforeachで親を持たないカテゴリーやターム($key->parent == 0) のIDを取得して親配列($pid)に格納します。親をもたないので一番上の親になります。
二つ目のforeachの最初のif文で一番上の親が自身の直接の親である場合子供配列($cid)に格納します。
次のif文で一番上の親が自身の直接の親ではないが親は持っている(一番うえの親ではない)ものを孫配列($gid)に格納します。
これで取り敢えず、カテゴリーやタームを親配列、子配列、孫配列に分けることができました。
カテゴリーやタームがひ孫、玄孫までもっている場合は孫のループで多分対応できると思います。
WordPressの投稿記事がもつカテゴリーやタームをせっかく分割できたのでここで少しだけ応用したいと思います。
カテゴリーやタームを親、子、孫の順で一つの配列にまとめる
1 2 |
$merge = array_merge($pid, $cid, $gid); print_r($merge); |
分割して取得してある親配列、子配列、孫配列をその順でマージするだけです。
孫配列からランダムにひとつだけ値を取り出す
1 2 3 |
shuffle($gid); $g = $gid[0]; print_r($g); |
孫配列をシャッフルして最初の値を取り出すだけです。
WordPressの投稿記事がもつ親、子、孫のカテゴリーやタームをそれぞれで配列に取得しておくと割と簡単な操作でいろんなことができるようになります。
次に一番上の親のカテゴリーやタームが複数ある場合について書いていこうと思います。
親カテゴリーやタームが複数の場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php $pid; $cid; $gid; $cat = get_the_terms(get_the_ID(), 'type'); foreach ($cat as $key) { if ($key->parent == 0) { // $termchildren = get_term_children($key->term_id, 'type'); $pid[] = $key->term_id; } } foreach ($cat as $key) { if (in_array($key->parent, $pid, true)) { $cid[$key->parent] = $key->term_id; $gid[$key->parent] = get_term_children($key->term_id, 'type'); // array_unshift($gid[$key->parent], $key->parent, $key->term_id); } } ?> |
get_the_terms(get_the_ID(), ‘category’)で一つの投稿記事が持つすべてのカテゴリーやタームを取得します。
最初のforeachで親を持たないカテゴリーやターム($key->parent == 0) のIDを取得して親配列($pid)に格納します。親をもたないので一番上の親になります。
ここまでは、親がひとつの場合となにも変わりありません。
次に2番目のforeachの中身を説明したいと思います。ここでは複数の親に対応させるため、一番うえの親のそれぞれのIDをkeyに持つ連想配列として子配列、孫配列ともに構成されています。
if文の条件は一番うえの親のIDを自身の直接の親に持つ場合です。なので、このif文の中で取得できるのは子のオブジェクトだけで、何もしなければ孫のオブジェクトは取得しません。
$key->term_id;で取得できているのは子のIDのみで、親のIDでも、孫のIDでもありません。
そのことを逆手にとって孫のIDを取得します。
get_term_children($key->term_id, ‘type’);のひとつ目のパレメーターに入るのは子のIDのみなので、返ってくる値は「子のIDを親にもつ、taxonomyがtypeの孫のIDの配列」です。
これで親の配列と子と孫の連想配列を作成することができました。子と孫の連想配列のkeyはどちらも値と関連性をもつ親のIDなので親のIDでループを回すことでいろいろ加工することができます。
カテゴリーやタームを親、子、孫の順で一つの配列にまとめる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php $pid; $cid; $gid; $cat = get_the_terms(get_the_ID(), 'type'); foreach ($cat as $key) { if ($key->parent == 0) { // $termchildren = get_term_children($key->term_id, 'type'); $pid[] = $key->term_id; } } foreach ($cat as $key) { if (in_array($key->parent, $pid, true)) { $cid[$key->parent] = $key->term_id; $gid[$key->parent] = get_term_children($key->term_id, 'type'); array_unshift($gid[$key->parent], $key->parent, $key->term_id); } } ?> |
同じプログラムの2番目のforeachの中でコメントアウトしていたarray_unshift($gid[$key->parent], $key->parent, $key->term_id);を使用することで、一つのkeyにたいして「親、子、孫」の順で並んだIDの配列を値にもつ連想配列を作成することができます。
WordPressの投稿記事がもつ親、子、孫のカテゴリーやタームをそれぞれで取得する 記事まとめ
今回はWordPressのカテゴリーやタクソノミーを親、子、孫にわけて取得する方法を記事にしましたがいかがだったでしょうか?。WordPressで何かをしたいと考えたとき、WordPressのフレームワークが持っている関数だけではやりきれないことも多くあります。結果、「WordPress面倒くさいよね」といったこともたまにですが耳にしたことがありました。僕自身はそこをクリアすることで学んだこともたくさんあるので学習的な側面も含めWordPressはとても良いフレームワークのひとつだと思っています。この記事が、読んでいただいた方のお役に少しでもたっていれば幸いです。それではまた。