web-dev-qa-db-fra.com

Un modèle de page unique pour les articles d'une catégorie et de toutes ses catégories enfants

J'ai un blog dans WordPress. J'ai plusieurs catégories. Je souhaite utiliser une présentation spécifique pour toutes les publications d'une catégorie et toutes ses sous-catégories.

Exemple: Mes catégories organisées comme ci-dessous.

  1. Guide (catégorie parente)

    1.1 Electical

    1.1.1 TV

    1.1.2 Radio

    1.2 Plomberie

    1.3 Réparation à domicile

    1.3.1 Cuisine

    1.3.2 Salle de bain

4
Bikram Pahi

Vous pouvez le faire avec le filtre single_template. Tout d'abord, vous devrez vérifier si un article appartient à une catégorie de niveau supérieur. Alors voici la fonction.

// custom single template for specific category
function wpse_custom_category_single_template( $single_template ) {

    global $post;

    // get all categories of current post
    $categories = get_the_category( $post->ID );
    $top_categories = array();

    // get top level categories
    foreach( $categories as $cat ) {
        if ( $cat->parent != 0 ) {
            $top_categories[] = $cat->parent;
        } else {
            $top_categories[] = $cat->term_id;
        }
    }

    // check if specific category exists in array
    if ( in_array( '8', $top_categories ) ) {
        if ( file_exists( get_template_directory() . '/single-custom.php' ) ) return get_template_directory() . '/single-custom.php';
    }

    return $single_template;

}

add_filter( 'single_template', 'wpse_custom_category_single_template' );

Dans une situation similaire, les gens vérifient généralement la catégorie parent avec $categories[0]->category_parent;, ce qui est correct, mais ne fonctionne que si vous avez affecté une catégorie à chaque publication. Si vous avez 2 catégories ou plus, cette solution fonctionnera toujours.

3
Robert hue

MODIFIER

NOTE _ ​​Si vous n'avez besoin que des termes enfants de premier niveau, la réponse de @Roberthue devrait fonctionner correctement. Si vous avez besoin de termes enfants de tous les niveaux, ma solution devrait fonctionner)

J'ai mis à jour mon code pour être plus efficace.

  • N'exécutez get_ancestors() que si nous ne pouvons pas trouver le terme parent ou ses enfants directs

  • Arrêtez immédiatement l'exécution de la boucle foreach lorsque nous trouvons notre terme parent à partir de la fonction get_ancestor

  • Cassé mes chèques en morceaux plus petits et arrêter immédiatement l'exécution lorsque mes chèques retournent vrais

RÉPONSE ORIGINALE

Par défaut, il n'y a pas d'option pour définir un modèle spécifique pour les publications d'une catégorie spécifique. Cela dit, cela ne signifie pas que cela ne peut pas être fait. Pour ce faire, vous devez utiliser le filtre single_template pour définir votre page de modèle unique personnalisée sur des publications avec un ensemble spécifique de catégories.

Vous pouvez essayer quelque chose comme ce qui suit: (CAVEAT: _ ​​Le code n'est pas testé et nécessite au moins PHP 5.3)

add_filter( 'single_template', function ( $template ) 
{
    // Get the current queried post id
    $current_post = get_queried_object_id();

    // Get the post terms. Change category to the correct taxonomy name if your post terms is from a custom taxonomy
    $terms = wp_get_post_terms( $current_post, 'category' );

    // Check if we have terms and we don't have an error. If we do, return default single template
    if ( !$terms || is_wp_error( $terms ) )
        return $template;

    // Check if our custom template exists before going through all the trouble to find out terms
    $new_template = locate_template( 'single-custom.php' );
    if ( !$new_template ) 
        return $template;

    // Get al the term ids in an array and check if we can find our parent term
    $term_ids = wp_list_pluck( $terms, 'term_id' );
    if ( in_array( 10, $term_ids ) )
        return $template = $new_template;

    // Get all the parent ids in an array and look for our parent term if we could not find it using term ids
    $parent_ids = wp_list_pluck( $terms, 'parent' );
    if ( in_array( 10, $parent_ids ) )
        return $template = $new_template;

    // If we cannot find the parent or direct children, lets look for lower level children
    $bool = false;
    foreach ( $term_ids as $term ) {
        // Use get_ancestors and check if we can find our parent term id
        if ( in_array( 10, get_ancestors( $term, 'category' ) ) ) {
            $bool = true;
            // If we found our parent, stop execution of our foreach loop
            break;
        }
    }

    // If $bool is true, return our custom single template
    if ( $bool )
        return $template = $new_template;

    // If all our conditions failed, return the default single template
    return $template;
});

EDIT 2

Le code ci-dessus est maintenant testé et fonctionne. Correction de quelques petits bugs :-)

4
Pieter Goosen