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');
}
?>
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 );
é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.
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