WEB制作、マーケティングに関する情報をお届けします。ホームページ制作会社、テラのブログ

【PHP8.3エラー対応済み】ワードプレス、カテゴリーの取得と出力一覧

タグ:

WordPress(ワードプレス)でサイトを制作すると必ずと言っていいほど出てくるカテゴリ機能。
PHP7.4から8以降にバージョンアップすると昔は使えていたコードがエラーを吐くようになったりトラブルも多いですね。
今回はPHP8.3で検証済みのカテゴリーの取得に関するアレコレをまとめました。
カテゴリーを取得する方法は複数あります。

  • get_categories()
  • get_the_category()
  • wp_list_catergories()
  • wp_dropdown_categories()
  • wp_terms_checklist()

今回は一番多用されるget_categoriesとget_the_category()で取得・表示させる方法を紹介します。

「ループ外」でカテゴリを一覧を取得する

全てのカテゴリを一覧表示

<?php
// カテゴリを取得するためのWordPress関数
$categories = get_categories(array(
    'orderby' => 'name', // 名前順にソート
    'hide_empty' => 0, //記事がないカテゴリを出力するかどうか
    'order'   => 'ASC'   // 昇順
));

// 取得したカテゴリを一覧表示
foreach($categories as $category) {
    // カテゴリ名と投稿数を表示
    echo '<p>' . $category->name . ' (' . $category->count . ')</p>';
}
?>

最上位のカテゴリのみを表示

<?php
// 親カテゴリ(最上位カテゴリ)を取得するためのWordPress関数
$parent_categories = get_categories(array(
    'parent'  => 0,      // 親カテゴリのみ
    'orderby' => 'name', // 名前順にソート
    'hide_empty' => 0, //記事がないカテゴリを出力するかどうか
    'order'   => 'ASC'   // 昇順
));

// 取得した親カテゴリを一覧表示
foreach($parent_categories as $category) {
    // 親カテゴリ名と投稿数を表示
    echo '<p>' . $category->name . ' (' . $category->count . ')</p>';
}
?>

親子関係を保持したまま表示

以下はdisplay_category_tree()という関数を作成して表示したいところにdisplay_category_tree($categories);を記載して表示させます。リストタグで入れ子の状態で表示されます。

<?php
// 親カテゴリを取得するためのWordPress関数
$categories = get_categories(array(
    'orderby' => 'name', // 名前順にソート
    'order'   => 'ASC',  // 昇順
    'hide_empty' => 0, //記事がないカテゴリを出力するかどうか
    'parent'  => 0       // 親カテゴリのみ
));

// 親カテゴリとその子カテゴリを表示する関数
function display_category_tree($categories) {
    echo '<ul>'; // リストの開始タグ
    foreach ($categories as $category) {
        // カテゴリ名と投稿数を表示
        echo '<li>' . $category->name . ' (' . $category->count . ')';
        
        // 子カテゴリを取得
        $child_categories = get_categories(array(
            'parent' => $category->term_id,  // 親カテゴリIDを指定
            'orderby' => 'name',             // 名前順にソート
            'hide_empty' => 0, //記事がないカテゴリを出力するかどうか
            'order' => 'ASC'                 // 昇順
        ));
        
        // 子カテゴリが存在する場合、再帰的に表示
        if ($child_categories) {
            display_category_tree($child_categories);
        }
        echo '</li>'; // リストアイテムの終了タグ
    }
    echo '</ul>'; // リストの終了タグ
}

// 表示したい場所に以下を記載
display_category_tree($categories);
?>

HTMLタグでは以下のように出力されます。

<ul>
    <li>親カテゴリ1
        <ul>
            <li>子カテゴリ1</li>
            <li>子カテゴリ2</li>
        </ul>
    </li>
</ul>

「ループ内(記事内)」でカテゴリの一覧を取得する

以下は全てループ内に記載する場合です。

全てのカテゴリを一覧表示

<?php
    // 現在の投稿のカテゴリを取得するWordPress関数
    $categories = get_the_category();
    
    if ( !empty( $categories ) ) {
        echo '<ul>';
        foreach ( $categories as $category ) {
            // カテゴリ名と投稿数を表示する
            echo '<li>' . $category->name . ' (' . $category->count . ')</li>';
        }
        echo '</ul>';
    }
?>

親カテゴリだけを取得・表示する

<?php
    // 現在の投稿のカテゴリを取得するWordPress関数
    $categories = get_the_category();
     
    if ( !empty( $categories ) ) {
        echo '<ul>';
        foreach ( $categories as $category ) {
            // 親カテゴリかどうかをチェックする
            if ( $category->parent == 0 ) {
                // 親カテゴリ名と投稿数を表示する
                echo '<li>' . $category->name . ' (' . $category->count . ')</li>';
            }
        }
        echo '</ul>';
    }
?>

ひとつだけカテゴリを表示する

<?php
    // 現在の投稿のカテゴリを取得するWordPress関数
    $categories = get_the_category();
    
    if ( ! empty( $categories ) ) {
        // 最初のカテゴリを取得する 2つめなら[1], 3つめなら[2]
        $category = $categories[0];
        // カテゴリ名を表示する
        echo '<p>' . esc_html( $category->name ) . ' (' . esc_html( $category->count ) . ')</p>';
    }
?>

get_the_categoryとget_categoriesの違いについて

get_the_categoryは現在の投稿のカテゴリ情報を取得します。
逆にget_categoriesは投稿以外のカテゴリ全体を取得します。
ループ外で使用する際はget_categories、ループ内で投稿の一覧を取得する際はget_the_categoryを使用します。

表示できるパラメーターの一覧

カテゴリーの情報を取得・表示する際にスラッグだけを取得したい、文字列だけを取得したい時があると思います。
その場合は取得したデータからパラメーターを指定して表示することができます。
以下、一覧です。

$category_id = $category->term_id; //カテゴリID
$category_name = $category->name; //カテゴリ名
$category_slug = $category->slug; //スラッグ
$category_count = $category->count; //カテゴリが関連づけられている記事数
$category_description = $category->description; //カテゴリの説明
$category_parent = $category->parent; //親カテゴリのID(最上位のカテゴリは0)
term_id カテゴリID
name カテゴリ名
slug スラッグ
count カテゴリが関連づけられている記事数
description カテゴリの説明
parent  親カテゴリのID(最上位のカテゴリは0)

リンクを取得したい場合はどうすればいい?

以下で取得したカテゴリ情報を使用します。

$categories = get_categories(array(
    'orderby' => 'name', // 名前順にソート
    'hide_empty' => 0, //記事がないカテゴリを出力するかどうか
    'order'   => 'ASC'   // 昇順
))

上記の$categoriesからIDを取り出し、get_category_link()という関数を使うと取得できます。
以下、全てのカテゴリーをリンク付きで取得する方法です。

全てのカテゴリーをリンク付きで取得する

<?php
// カテゴリを取得するためのWordPress関数
$categories = get_categories(array(
    'orderby' => 'name', // 名前順にソート
    'hide_empty' => 0, //記事がないカテゴリを出力するかどうか
    'order'   => 'ASC'   // 昇順
));

// 取得したカテゴリを一覧表示
echo '<ul>'; // リストの開始タグ
foreach($categories as $category) {
    // カテゴリ名と投稿数を表示
    echo '<li><a href="'.get_category_link( $category->term_id ).'">' . $category->name . ' (' . $category->count . ')</a></li>';
}
echo '</ul>'; // リストの終了タグ
?>

まとめ

以上、カテゴリーの取得と表示に関するまとめでした。
カテゴリーに関しては以下を使用できればほとんどの場面で通用するでしょう。

  • get_categories()
  • get_the_category()

これで欲しいカテゴリーの情報はほぼ全てと言っていいほど網羅できますので、あとはデータを抽出するだけです。
もし、迷ったときはvar_dump()などを使いながら実際にどんなデータが取れているのかというのを確認するとトラブルが起きた時も早期の原因究明につながります。