カテゴリー名の文字列を親カテゴリーも含めて生成

WordPress
記事内に広告が含まれています。

カテゴリー名の文字列を親カテゴリーも含めて生成します。親を先に、子を先に、というのを切り替えたり、セパレーター文字列を指定したり、ついでにリンクのあり・なしの切り替えと出力する・しないを切り替えられるようにしました。

<?php
/**
 * カテゴリー名文字列を親カテゴリーも含めて生成
 *
 * @param WP_Term $obj カテゴリーオブジェクト
 * @param string $sep セパレータ
 * @param boolean $order カテゴリー名文字列生成の並び順(true:子→親、false:親→子)
 * @param boolean $link リンクを付けるかどうか
 * @param boolean $echo 出力するかどうか
 */
function the_category_hierarchical($obj, $sep = ' | ', $order = true, $link = true, $echo = true)
{
    $rval = "";
    // カテゴリーを再帰的に取得(子→親の順で取得される)
    $cats = get_category_recursive($obj);
    // 再帰的に取得したカテゴリーからカテゴリー名文字列を生成
    foreach ($cats as $cat) {
        // 文字列が空でなければセパレーターを追加
        if (!empty($rval)) {
            // 並び順によって前に追加するか後ろに追加するか
            if ($order) {
                $rval .= $sep;
            } else {
                $rval = $sep.$rval;
            }
        }
        if ($link) {
            if ($order) {
                $rval .= '<a href="'.get_category_link($cat->cat_ID).'">'.esc_html($cat->name).'</a>';
            } else {
                $rval = '<a href="'.get_category_link($cat->cat_ID).'">'.esc_html($cat->name).'</a>'.$rval;
            }
        } else {
            if ($order) {
                $rval .= esc_html($cat->name);
            } else {
                $rval = esc_html($cat->name).$rval;
            }
        }
    }
    if ($echo) {
        echo $rval;
    } else {
        return $rval;
    }
}

/**
 * カテゴリーを再帰的に取得
 *
 * @param WP_Term $obj カテゴリーオブジェクト
 * @param WP_Term[] $cats カテゴリーオブジェクトの配列
 */
function get_category_recursive($obj, $cats = array())
{
    $cats[] = $obj;
    if ($obj->category_parent > 0) {
        $obj = get_category($obj->category_parent);
        return get_category_recursive($obj, $cats);
    } else {
        return $cats;
    }
}

上記を functions.php に追加しておいて、カテゴリーアーカイブなどで

<?php
// 現在のカテゴリーを取得
$cat_cur = get_category_by_slug($_cat_slug = get_query_var('category_name'));
// カテゴリー名文字列を生成
$str_cat_name = the_category_hierarchical($cat_cur, ' / ', false, false, false); 
echo esc_html($str_cat_name);

みたいに使用します。上記の例の場合は「親カテゴリー名 / 子カテゴリー名」てな感じの出力が得られます。

タイトルとURLをコピーしました