Ma partie préférée de la hiérarchie des modèles Wordpress est la possibilité de créer rapidement des fichiers de modèle pour les pages par slug, sans avoir à modifier la page dans Wordpress pour sélectionner un modèle.
Nous pouvons actuellement le faire:
page- {slug} .php
Mais j'aimerais pouvoir faire ceci:
single- {post_type} - {slug} .php
Pour que, par exemple, dans un type de publication appelé review
, je puisse créer un modèle pour une publication intitulée "Ma grande critique" sursingle-review-my-great-review.php
Quelqu'un a-t-il déjà mis cela en place? single-{post_type}-{slug}.php
single-{post_type}-{slug}.php
, donc la mise à niveau vers WP 3.4 est une autre option.Réponses:
A) La base du noyau
Comme vous pouvez le voir dans l' explication de la hiérarchie des modèles Codex ,
single-{$post_type}.php
est déjà pris en charge.B) Extension de la hiérarchie principale
Maintenant, il y a volontiers des filtres et des crochets à l'intérieur
/wp-includes/template-loader.php
.do_action('template_redirect');
apply_filters( 'template_include', $template )
get_query_template( $type, ... )
nommé:"$type}_template"
B.1) Comment ça marche
is_*()
.is_single() && $template = get_single_template()
get_query_template( $type, $templates )
, où$type
estsingle
"{$type}_template"
filtreC) La solution
Comme nous voulons uniquement étendre la hiérarchie avec un modèle qui est chargé avant le
"single-{$object->post_type}.php"
modèle réel , nous allons intercepter la hiérarchie et ajouter un nouveau modèle au début du tableau des modèles.REMARQUE: (Si vous souhaitez utiliser autre chose que le slug d'objets par défaut) Vous devrez ajuster en
$slug
fonction de votre structure de permalien. Utilisez simplement ce dont vous avez besoin dans le monde(object) $post
.Billets Trac
Comme l'approche ci-dessus n'est actuellement pas prise en charge (vous pouvez uniquement filtrer le chemin localisé absolu de cette façon), voici une liste de tickets Trac:
get_query_template()
la source
)
à l'intérieur du filtre. Fixé. Vous souhaitez peut-être échanger le tiret avec un soulignement avant le slug à l'intérieur du modèle. Juste pour permettre au suffixe de mieux ressortir lorsque vous regardez les modèles.$templates
est un tableau. Voir les fonctions de base dans cette boîte à pâte (pas de date d'expiration). Assurez-vous de tester cela avec une installation sans plugins et le thème par défaut. Activez ensuite les uns après les autres et voyez si l'erreur persiste.slug
n'est disponible que pour les termes et les taxonomies. Vous devez remplacer$post->post_name
par ce qui correspond à votre structure de permalien. Actuellement, il n'y a aucun moyen de le faire automatiquement pour tous les cas en récupérant et en remplaçant le chemin en fonction de votre structure perma et de vos règles de réécriture. Attendez-vous à une autre mise à jour.Après l' image de la hiérarchie des modèles , je ne vois pas une telle option.
Voici donc comment j'y arriverais:
Solution 1 (la meilleure à mon avis)
Créez un fichier modèle et associez-le à la révision
En ajoutant le modèle de fichier php dans votre répertoire de thèmes, il apparaîtrait comme une option de modèle dans la page d'édition de votre article.
Solution 2
Cela pourrait probablement être réalisé en utilisant le
template_redirect
crochet.Dans le fichier functions.php:
ÉDITER
file_exists
Chèque ajoutéla source
exit;
y es ?exit()
est nécessaire pour empêcher le chargement du modèle par défaut.La meilleure réponse (il y a 4 ans) ne fonctionne plus, mais le codex WordPress a la solution ici :
la source
Utiliser des modèles de page
Une autre approche pour l'évolutivité serait de dupliquer la fonctionnalité de liste déroulante du modèle de page sur le
page
type de publication pour votre type de publication personnalisé.Code réutilisable
La duplication dans le code n'est pas une bonne pratique. Au fil du temps, cela peut provoquer un ballonnement sévère dans une base de code, ce qui rend la gestion d'un développeur très difficile. Au lieu de créer un modèle pour chaque slug, vous aurez probablement besoin d'un modèle un-à-plusieurs qui peut être réutilisé au lieu d'un post-à-modèle un-à-un.
Le code
C'est une réponse un peu tardive, mais j'ai pensé que ce serait utile car personne sur le Web n'a documenté cette approche pour autant que je sache. J'espère que cela aide quelqu'un.
la source
Dans mon cas, j'ai des types de publication personnalisés Album et Track liés par une taxonomie d'album. Je voulais pouvoir utiliser différents modèles de single pour les publications d'album et de piste en fonction de leur taxonomie d'album.
Sur la base de la réponse de Kaiser ci-dessus, j'ai écrit ce code. Ça marche bien.
Remarque. Je n'avais pas besoin de l'add_action ().
Je peux maintenant créer des modèles nommés single-gregory-cpt-track-tax-serendipity.php et single-gregory-cpt-album-tax-serendipity.php et WP les utilisera automatiquement; 'tax-serendipity' est le slug pour le premier terme de taxonomie d'Album.
pour référence, le hook de filtre 'single_template' est déclaré dans:
/wp-includes/theme.php:
get_query_template()
Merci Kaiser pour l'exemple de code.
À la vôtre, Gregory
la source
Mise à jour du code Brians, j'ai constaté que lorsque la liste déroulante n'était pas utilisée, l'option de modèle "par défaut" était enregistrée dans wp_page_template, ce qui l'a amené à essayer de trouver un modèle appelé par défaut. cette modification vérifie simplement l'option "par défaut" lors de l'enregistrement et supprime la méta post à la place (utile si vous avez redéfini l'option de modèle par défaut)
la source