WordPress の投稿記事のポストIDから関連するカテゴリー情報を取得する関数を作成したので紹介します
WordPress のデータ収集関連の関数は、名前が似ている関数等も多く違いを調べ、目的にあった関数を選択するのが大変です。
今日は、その中から3つの関数を組み合わせて使用してみました
- 指定したポストIDのカテゴリー情報取得(get_the_category)
- 指定したカテゴリーIDのカテゴリー情報取得(get_category)
- 指定したカテゴリーIDの子孫の全てのカテゴリー情報取得(get_terms)
関数のリンク先の説明を見ても、使い方が今ひとつわかりにくいとは思いますが、サンプルコードの一つとして見ていただけたらと思います
コード自体は大したサイズでないので、いきなり提示してから簡単に説明します
    //ポストIDに関連するカテゴリー情報取得
    // $postid     調査対象のポストID
    // $mode       0   現在のポストIDのカテゴリーのみを対象とする 
    //             1   現在のポストIDのカテゴリーを基準に子孫カテゴリーを含める
    //             -N  現在のカテゴリーから親方向への階層をマイナス値で指定(そこを基準に子孫カテゴリーを含める)
    // $ex_catid   除外するカテゴリーIDを配列で指定
    // 戻り値    カテゴリーID連想配列(categoryID, カテゴリー情報配列)
    //               カテゴリー情報配列は情報取得関数により異なるので共通部分のみをスライスして保持    
    //                 - term_id        ID
    //                 - name           名前
    //                 - slug           スラッグ
    //                 - term_group     グループID
    //                 - term_taxonomy_id    タクソノミーID
    //                 - taxonomy        'category'
    //                 - description    説明
    //                 - parent         親カテゴリーID。ない場合は0
    //                 - count          カウント
    public static function postid_related_categories($postid, $mode, $ex_catid=array())
    {
        $cidlist = array();
        //記事のカテゴリー情報に複数カテゴリーがセットされている場合あり
        foreach ( (array) get_the_category($postid) as $cat ) {
            if ( empty($cat->name )) 
                continue;
            //基準位置取得
            if($mode < 0){
                //祖先方向へ指定階層分戻る
                for($b=(int)$mode; $b < 0; $b++){
                    if ( $cat->parent == '0' )
                        break;
                    $cat = get_category( $cat->parent );
                }
            }
            //基準位置のカテゴリー情報を取得
            if ($cat->count > 0 && in_array($cat->term_id, $ex_catid)===false)
                $cidlist += array($cat->term_id => array_slice((array)$cat, 0, 9));
            
            //基準位置以下の子孫カテゴリー情報取得
            if($mode !== 0){
                $child = get_terms( 'category', array( 'child_of' => $cat->term_id ) );
                if(isset($child)){
                    foreach ( $child as $cat) {
                        if($cat->count > 0 && in_array($cat->term_id, $ex_catid)===false)
                            $cidlist += array($cat->term_id => (array)$cat);
                    }
                }
            }
        }
        return $cidlist;
    }
記事のホストIDを指定してカテゴリーID取得
この時に get_the_category という関数を使うのですが、この get_the_なんちゃら という the が付いているのがどうも投稿記事から情報を取得する関数で、他にも
author, date, time, title, tags 等いろいろあるようです
指定カテゴリーIDのカテゴリー情報取得
次に関連するカテゴリー情報にカテゴリー階層を親方向にさかのぼり含める場合の処理で、指定した階層分戻った位置のカテゴリー情報を取得します
  
使用する関数は、get_category という関数で一つ上の親のカテゴリーIDを取得できるので指定階層分繰り返し実行します
ちなみに get_なんちゃらの単数形では、直接ID等を指定して該当するデータ1つを取得する関数のようです。これが get_categories というような複数形になると指定した条件にマッチした全てのデータを取得する関数となるようです
指定カテゴリーIDの子孫の全てのカテゴリー情報取得
次に get_terms ですが、この関数は、カテゴリーだけでなくタグやメニュー、リンク等のタクソノミーに対応していて、様々な検索条件を設定してデータを取得することが出来るようになっています
今回は、child_of を使用して指定したカテゴリーIDの子孫すべてのカテゴリー情報を取得しています
以上の3つの関数を組み合わせて、記事に関連する全てのカテゴリー情報を取得できるように指定ます。また、特定のカテゴリーを除外することも出来るようにしました。
この関数を作るきっかけは、タグクラウドの表示がカテゴリーに関係なく全ての記事を対象に行われているのが以前から気になっていたので、記事に関連したカテゴリー情報を収集してそれを元にタグクラウドを表示したいと思ったからです
自分仕様のタグクラウドプログラムの完成はもう少し先になりますが、なにかの参考になればと思い紹介しました (^^)
 
                    