【WordPress】最上位(第一階層)のカテゴリーのみを取得する方法|hide_emptyの注意点

WordPressで最上位のカテゴリー(親カテゴリーを持たない第一階層のカテゴリー)だけを取得する方法を解説します。ナビゲーションメニューやトップページで、大分類のカテゴリーだけを一覧表示したい場合に使えます。

この記事でわかること

  • get_categories()parent => 0 で最上位のみ取得
  • 子カテゴリーにしか投稿がない親カテゴリーが一覧から消えるhide_emptyの注意点
  • 並び替え・リンク表示まで含めた実用的なコード例
スポンサーリンク

基本的なカテゴリー取得方法

get_categories()parent => 0 を指定すると、親カテゴリーを持たない最上位のカテゴリーだけを取得できます。

最上位のカテゴリーを取得して表示
$args = array(
    'parent' => 0,
);

$categories = get_categories( $args );

foreach ( $categories as $category ) {
    echo '<p>' . esc_html( $category->name ) . '</p>';
}

子カテゴリーにしか投稿がない親カテゴリーが消える(hide_emptyの注意点)

get_categories()は既定で「空のカテゴリー」を除外する
get_categories()(内部で使われる get_terms())は、hide_empty の既定値が true です。これは「そのカテゴリーに直接紐づく投稿が1件も無い場合、一覧から除外される」ことを意味します。「最上位カテゴリー」は整理用の入れ物として使い、実際の投稿は全て子カテゴリーに割り当てている構成のサイトも多く、その場合親カテゴリー自体には投稿が0件のため、既定のままだと肝心の最上位カテゴリーがメニューに表示されません。これを避けるには hide_empty => false を明示してください。空カテゴリーの扱い全般についてはカテゴリーの数を取得する方法(空カテゴリーの扱い)で詳しく解説しています。
子カテゴリーのみに投稿があっても表示する
$args = array(
    'parent'     => 0,
    'hide_empty' => false, // 直接投稿が無い親カテゴリーも表示する
);

$categories = get_categories( $args );

foreach ( $categories as $category ) {
    echo '<p>' . esc_html( $category->name ) . '</p>';
}

カテゴリーを名前順でソートして取得する

カテゴリーを名前順で並べ替えて取得したい場合は、orderbyorder を指定します。

名前順(昇順)で並び替えて取得
$args = array(
    'parent'     => 0,
    'hide_empty' => false,
    'orderby'    => 'name',
    'order'      => 'ASC',
);

$categories = get_categories( $args );

foreach ( $categories as $category ) {
    echo '<p>' . esc_html( $category->name ) . '</p>';
}

カテゴリーのリンクを表示する

カテゴリー名とともにそのリンクを表示したい場合は、get_category_link() を使います。URLの出力には esc_url() を必ず使ってください。

最上位カテゴリーをリンク付きで表示
$args = array(
    'parent'     => 0,
    'hide_empty' => false,
);

$categories = get_categories( $args );

foreach ( $categories as $category ) {
    echo '<p><a href="' . esc_url( get_category_link( $category->term_id ) ) . '">'
        . esc_html( $category->name ) . '</a></p>';
}

完全なコード例

並び替え・空カテゴリー対応・リンク表示・エスケープをすべてまとめたコード例です。

最上位カテゴリーを名前順・リンク付きで表示(完全版)
$args = array(
    'parent'     => 0,
    'hide_empty' => false, // 子カテゴリーのみに投稿がある親カテゴリーも表示
    'orderby'    => 'name',
    'order'      => 'ASC',
);

$categories = get_categories( $args );

foreach ( $categories as $category ) {
    echo '<p><a href="' . esc_url( get_category_link( $category->term_id ) ) . '">'
        . esc_html( $category->name ) . '</a></p>';
}

関連するカテゴリー取得の実装

カテゴリーごとの投稿数や、空カテゴリーの具体的な扱い方についてはカテゴリーの数を取得する方法(wp_count_termsの現行の書き方と空カテゴリーの扱い)で詳しく解説しています。

よくある質問(FAQ)

Q最上位(親なし)のカテゴリーのみ取得するコードは?
Aget_categories(array('parent' => 0))でparent=0(親なし)の条件を指定します。またはget_terms(array('taxonomy' => 'category', 'parent' => 0))でも同様に取得できます。どちらもhide_emptyの既定値がtrueである点に注意してください。
Qカテゴリーの階層構造を再帰的に全て取得するには?
Aget_categories()で全カテゴリーを取得した後、親子関係を元に再帰関数でツリー構造を構築します。またはwp_list_categories()で自動的に階層構造のリストを表示することもできます。
Qカテゴリーの子カテゴリーだけを取得するには?
Aget_categories(array('parent' => $parent_id))で特定の親IDを指定します。get_term_children($parent_id, 'category')で子・孫全ての子孫カテゴリーIDを取得することもできます。

まとめ

  • 基本get_categories(array('parent' => 0))
  • 注意hide_emptyの既定はtrue。子カテゴリーのみに投稿がある親カテゴリーはhide_empty => falseを指定しないと表示されない
  • 出力時esc_html()/esc_url()で必ずエスケープする

整理用の親カテゴリーを一覧に含めたい場合は、hide_empty => falseを忘れずに指定してください。