私はさまざまな目的のためにDefault Post Type post
を使っています。それらを分類するために、私は異なるカテゴリを使っています。そして私はslugプリファレンスを使って、category-book.php
、category-notice.php
などのように異なるカテゴリーレイアウトをデザインしています、そしてすべてはまさに問題ありませんでした。
しかし、ほんの少し前に、親カテゴリ「book」のサブカテゴリは、スラッグが異なるため、親カテゴリのカテゴリテンプレート(index.php
)を認識していないため、archive.php
(またはcategory.php
、またはcategory-book.php
)にリダイレクトされます。
子カテゴリに親のテンプレートデザインを認識させるにはどうすればよいですか。
そのためにWP_Query()
を使ってカスタムテンプレートを作る必要がありますか?
正しい方向に案内してくれた@Rarstに感謝します。彼の指示を使って私は何度も何度もグーグルして、Rarstが私に示唆したようにcategory_template
にフィルターされた優れたコードスニペットを持つWerdsWordsのブログ記事を見つけました。
function new_subcategory_hierarchy() {
$category = get_queried_object();
$parent_id = $category->category_parent;
$templates = array();
if ( $parent_id == 0 ) {
// Use default values from get_category_template()
$templates[] = "category-{$category->slug}.php";
$templates[] = "category-{$category->term_id}.php";
$templates[] = 'category.php';
} else {
// Create replacement $templates array
$parent = get_category( $parent_id );
// Current first
$templates[] = "category-{$category->slug}.php";
$templates[] = "category-{$category->term_id}.php";
// Parent second
$templates[] = "category-{$parent->slug}.php";
$templates[] = "category-{$parent->term_id}.php";
$templates[] = 'category.php';
}
return locate_template( $templates );
}
add_filter( 'category_template', 'new_subcategory_hierarchy' );
記事へのリンク:
テンプレート階層のカテゴリアーカイブブランチは、照会された実際のカテゴリに対してのみ機能します。
get_category_template()
を見ると、階層を調べません。
必要に応じて選択を調整するために、category_template
フィルタ(チェーンのさらに下の{$type}_template
から動的に命名される)を使用できます。
@Rarstの提案を補足するために、最上位の親テンプレートを使用する関数が必要でした。
function new_subcategory_hierarchy() {
$category = get_queried_object();
$parent_id = $category->category_parent;
// Create replacement $templates array
$templates = array();
if ( $parent_id == 0 ) {
// Use default values from get_category_template()
$templates[] = "category-{$category->slug}.php";
$templates[] = "category-{$category->term_id}.php";
$templates[] = 'category.php';
} else {
// Start from the current term
$parent = get_category($parent_id);
だから私はこれをここに追加します。
// Climb up the hierarchy until we reach a term with parent = '0'
while($parent->parent != '0'){
$term_id = $parent->parent;
$parent = get_term_by( 'id', $term_id, $category->taxonomy);
}
エンディング:
// Current first
$templates[] = "category-{$category->slug}.php";
$templates[] = "category-{$category->term_id}.php";
// Parent second
$templates[] = "category-{$parent->slug}.php";
$templates[] = "category-{$parent->term_id}.php";
$templates[] = 'category.php';
}
return locate_template( $templates );
}
add_filter( 'category_template', 'new_subcategory_hierarchy' );