親カテゴリーでの条件分岐と親カテゴリーのテンプレートを子カテゴリーに使用する
最終更新日: Update!!
クライアントワークでこのようなケースがあったので備忘録としての記事です。WordPressでは親カテゴリー、子カテゴリーとカテゴリーに階層構造を持たせることができます。しかし子カテゴリーが多くなってくると機能的に複雑になってきたり管理が大変になったりします。そこで子カテゴリーではなく属する親カテゴリーでの条件分岐やページテンプレートで扱いたいという時に使える小技になります。
このようなテクニックは主に階層カテゴリーでページ構成されているWordPressサイトには使えるかと思います。不用意に子カテゴリー分だけページテンプレートを作成しなくても済みますし管理も楽になるのではないでしょうか。 (参考) WPCodex:関数リファレンス/in category 子カテゴリのアーカイブページを親カテゴリ用のテンプレートファイルで表示しよう
1. 子カテゴリーが属する親カテゴリー別での条件分岐
post_is_in_descendant_category関数というものを使用します。まずはfunctions.phpに下記を記述して関数の定義を行います。 【functions.php】if ( ! function_exists( 'post_is_in_descendant_category' ) ) { function post_is_in_descendant_category( $cats, $_post = null ) { foreach ( (array) $cats as $cat ) { $descendants = get_term_children( (int) $cat, 'category' ); if ( $descendants && in_category( $descendants, $_post ) ) return true; } return false; } }あとはif文での分岐条件にpost_is_in_descendant_category関数を用います。引数には親カテゴリーのスラッグやIDを指定します。WPのin_category関数と併用することが多いかと思います。これで子カテゴリーを親カテゴリー単位で条件分岐ができるようになります。
if ( in_category( 'cat-1' ) || post_is_in_descendant_category( 'cat-1' ) ) { // 「cat-1」もしくは「cat-1」に属する子カテゴリーのものであった場合の出力内容 } else if ( in_category( 'cat-2' ) || post_is_in_descendant_category( 'cat-2' ) ) { // 「cat-2」もしくは「cat-2」に属する子カテゴリーのものであった場合の出力内容 } else if ( in_category( 'cat-3' ) || post_is_in_descendant_category( 'cat-3' ) ) { // 「cat-3」もしくは「cat-3」に属する子カテゴリーのものであった場合の出力内容 }
2. 親カテゴリーのアーカイブテンプレートを子カテゴリーにも使用する
functions.phpに下記コードを記述します。子カテゴリーのアーカイブテンプレートと親カテゴリーのアーカイブテンプレートを統合するような内容の記述になっています。こうすることで子カテゴリーのアーカイブは、属する親カテゴリーのアーカイブテンプレート(category-{slug}.php)で表示されるようになります。 【functions.php】add_filter( 'category_template', 'parent_category_template' ); function parent_category_template( $template ) { $category = get_queried_object(); if ( $category->parent != 0 && ( $template == "" || strpos( $template, "category.php" ) !== false ) ) { $templates = array(); while ( $category->parent ) { $category = get_category( $category->parent ); if ( !isset( $category->slug ) ) break; $templates[] = "category-{$category->slug}.php"; $templates[] = "category-{$category->term_id}.php"; } $templates[] = "category.php"; $template = locate_template( $templates ); } return $template; }
このようなテクニックは主に階層カテゴリーでページ構成されているWordPressサイトには使えるかと思います。不用意に子カテゴリー分だけページテンプレートを作成しなくても済みますし管理も楽になるのではないでしょうか。 (参考) WPCodex:関数リファレンス/in category 子カテゴリのアーカイブページを親カテゴリ用のテンプレートファイルで表示しよう
sponserd
keyword search
recent posts
- Shopifyでオリジナルテーマ制作やテーマカスタマイズで使えるTips #2
Shopifyでオリジナルテーマ制作やテーマカスタマイズで使えるTips #2
- Shopifyでオリジナルテーマ制作やテーマカスタマイズで使えるTips #1
Shopifyでオリジナルテーマ制作やテーマカスタマイズで使えるTips #1
- ViteでReactとReact Routerを使ってみる
ViteでReactとReact Routerを使ってみる
- ViteでPugのコンパイル環境を導入する
ViteでPugのコンパイル環境を導入する
- ViteでMarkuplintとPrettierを使える環境を構築する
ViteでMarkuplintとPrettierを使える環境を構築する
- ViteでStylelintとESlintを使える環境を構築する
ViteでStylelintとESlintを使える環境を構築する
- マウスオーバーしたセルを含む行列がハイライトするテーブルを作成する:has()擬似クラスの活用例
マウスオーバーしたセルを含む行列がハイライトするテーブルを作成する:has()擬似クラスの活用例
- ViteでVue.jsとVuex(Pinia)とVue Routerを使ってみる
ViteでVue.jsとVuex(Pinia)とVue Routerを使ってみる
categories