web-dev-qa-db-fra.com

Comment faire en sorte que les catégories enfants reconnaissent les modèles affichés par les parents

J'utilise le type de message par défaut post à diverses fins. Pour les trier, j'utilise différentes catégories. Et je conçois différentes catégories en utilisant la préférence slug, telle que: category-book.php, category-notice.php etc., et tout allait bien.

Mais il y a un instant, nous avons constaté que toute sous-catégorie de la catégorie parent 'book' est redirigée vers index.php (ou archive.php ou category.php), car elle ne reconnaît pas le modèle de catégorie de son parent (category-book.php), car son slug est différent.

Comment faire en sorte que les catégories enfants reconnaissent la conception du modèle de leurs parents?
Dois-je créer un modèle personnalisé en utilisant une WP_Query() pour cela?

4
Mayeenul Islam

Merci à @Rarst de m'avoir guidé dans la bonne direction. Utilisant sa direction, j'ai cherché sur Google encore et encore et trouvé un article de blog de WerdsWords avec un excellent extrait de code filtré en category_template comme Rarst me l'avait suggéré. La bonne nouvelle est la suivante: cela a fonctionné pour ma cause:

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' );

Lien vers l'article:

8
Mayeenul Islam

La branche d’archive des catégories de la hiérarchie de modèles n’opère que sur la catégorie demandée.

Si vous regardez get_category_template() , la hiérarchie n’est pas affichée.

Vous pouvez utiliser le filtre category_template (nommé dynamiquement à partir de {$type}_template en bas de la chaîne) pour ajuster le choix si nécessaire.

1
Rarst

Complétant la suggestion @Rarst, j'avais besoin de la fonction pour utiliser le modèle parent de niveau supérieur.

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);

Alors j'ajoute ceci ici:

        // 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);
        }

Fin:

       // 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