web-dev-qa-db-ja.com

子カテゴリに親のテンプレート表示を認識させる方法

私はさまざまな目的のためにDefault Post Type postを使っています。それらを分類するために、私は異なるカテゴリを使っています。そして私はslugプリファレンスを使って、category-book.phpcategory-notice.phpなどのように異なるカテゴリーレイアウトをデザインしています、そしてすべてはまさに問題ありませんでした。

しかし、ほんの少し前に、親カテゴリ「book」のサブカテゴリは、スラッグが異なるため、親カテゴリのカテゴリテンプレート(index.php)を認識していないため、archive.php(またはcategory.php、またはcategory-book.php)にリダイレクトされます。

子カテゴリに親のテンプレートデザインを認識させるにはどうすればよいですか。
そのためにWP_Query()を使ってカスタムテンプレートを作る必要がありますか?

4
Mayeenul Islam

正しい方向に案内してくれた@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' );

記事へのリンク:

8
Mayeenul Islam

テンプレート階層のカテゴリアーカイブブランチは、照会された実際のカテゴリに対してのみ機能します。

get_category_template() を見ると、階層を調べません。

必要に応じて選択を調整するために、category_templateフィルタ(チェーンのさらに下の{$type}_templateから動的に命名される)を使用できます。

1
Rarst

@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' ); 
0
Caio Bleggi