web-dev-qa-db-fra.com

Modèle unique personnalisé pour une catégorie spécifique

Quel est le meilleur moyen (performances et structure de code) de créer un modèle personnalisé pour un article WordPress, appartenant à une catégorie spécifique? Je me suis rendu compte que vous ne pouvez pas simplement créer single-catname.php.

Jusqu'à présent, j'ai essayé de deux manières de changer le modèle. Mais lequel (ou un autre) est le meilleur?

MODIFIER:

Avez-vous une idée de comment inclure toutes les catégories de sous/parent, etc.? Je me suis rendu compte maintenant qu'il ne montrait que la catégorie principale ...

1. Ajouté à functions.php

function get_custom_cat_template($single_template) {
   global $post;
   if ( in_category( 'movies' )) {
      $single_template = dirname( __FILE__ ) . '/single-movies.php';
   }
   return $single_template;
} 
add_filter( "single_template", "get_custom_cat_template" ) ;

2. Mettez le code suivant dans single.php (au lieu de tout autre code) et créez un single-template.php (avec le code du single.php) & un custom single-movies.php

<?php        
if(has_term('movies', 'category', $post)) {      
   get_template_part('single-movies', 'movies');
} else {
   // use default template file single-template.php
   get_template_part('single-template');
}
?>
6
NewUser

De mon commentaire au PO

Mon avis, utilisez ce avec quoi vous êtes à l'aise. S'il y a une différence de performance, ce sera minute/sans importance. Ma préférence, utilisez le filtre

Pour en venir à votre vraie préoccupation/question, à mon avis, la meilleure approche consistera à utiliser l'ID de la catégorie parent et à partir de là. Travailler à partir d’ici nécessite moins de ressources. L'ingénierie inverse peut devenir un gaspillage inutile de ressources.

Utilisez get_categories pour obtenir les catégories enfants de la catégorie donnée. Vous pouvez utiliser l'un des deux paramètres, soit parent ou child_of.

parent (entier)

Affiche uniquement les catégories qui sont des descendants directs (c'est-à-dire les enfants uniquement) de la catégorie identifiée par son ID. Cela ne fonctionne PAS comme le paramètre 'child_of'. Il n'y a pas de valeur par défaut pour ce paramètre. [En 2.8.4]

child_of (entier)

Affiche toutes les catégories qui sont des descendants (c.-à-d. Enfants et petits-enfants) de la catégorie identifiée par son ID. Il n'y a pas de valeur par défaut pour ce paramètre. Si le paramètre est utilisé, le paramètre hide_empty est défini sur false.

Une fois que vous les avez, utilisez wp_list_pluck pour obtenir les champs catID, name ou slug du tableau de catégories renvoyé. Ce tableau sera utilisé pour vérifier si une publication appartient à l'une de ces catégories. Vous pouvez utiliser has_category ou in_category

Voici comment vous pouvez étendre votre code pour vous assurer que les publications appartenant à la catégorie parent ou à ses descendants utilisent le modèle donné.

add_filter( 'single_template', function ( $single_template ) {

    $parent     = '21'; //Change to your category ID
    $categories = get_categories( 'child_of=' . $parent );
    $cat_names  = wp_list_pluck( $categories, 'name' );

    if ( has_category( 'movies' ) || has_category( $cat_names ) ) {
        $single_template = dirname( __FILE__ ) . '/single-movies.php';
    }
    return $single_template;

}, PHP_INT_MAX, 2 );
6
Pieter Goosen

étape 1: Créez ou copiez content-single.php et créez un nouveau fichier. Par exemple: content-yourCategory.php étape 2: Ouvrez single.php et remplacez cette get_template_part('content','single'); par le code suivant

    if(is_category('yourCategory')){
        get_template_part('content','yourCategory');
    }else{
        get_template_part('content','single.php');
    }

Le paramètre peut être ID de catégorie, Titre de catégorie, Slug de catégorie ou Tableau d’ID, noms et slugs.

3
Karun

Ceci est un moyen pratique de le faire, trouvé ici passé ce code dans votre function.php

// Custom single template by category
// https://halgatewood.com/wordpress-custom-single-templates-by-category

add_filter('single_template', 'check_for_category_single_template');
function check_for_category_single_template( $t )
{
  foreach( (array) get_the_category() as $cat ) 
  { 
    if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php"; 
    if($cat->parent)
    {
      $cat = get_the_category_by_ID( $cat->parent );
      if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
    }
  } 
  return $t;
}

pour plus d'informations, consultez https://halgatewood.com/wordpress-custom-single-templates-by-category

2
Ninda