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>';
}
カテゴリーを名前順でソートして取得する
カテゴリーを名前順で並べ替えて取得したい場合は、orderby・order を指定します。
名前順(昇順)で並び替えて取得
$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最上位(親なし)のカテゴリーのみ取得するコードは?
A
get_categories(array('parent' => 0))でparent=0(親なし)の条件を指定します。またはget_terms(array('taxonomy' => 'category', 'parent' => 0))でも同様に取得できます。どちらもhide_emptyの既定値がtrueである点に注意してください。Qカテゴリーの階層構造を再帰的に全て取得するには?
A
get_categories()で全カテゴリーを取得した後、親子関係を元に再帰関数でツリー構造を構築します。またはwp_list_categories()で自動的に階層構造のリストを表示することもできます。Qカテゴリーの子カテゴリーだけを取得するには?
A
get_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を忘れずに指定してください。
