Puis-je affecter un fichier de modèle à un type de publication personnalisé?
J'ai créé un type d'article personnalisé appelé items
et j'aimerais attribuer des modèles aux éléments, comme vous pouvez le faire avec des pages.
À partir de WordPress version 4.7 , vous pouvez désormais attribuer des modèles de page personnalisés à d’autres types de publication avec page.
Pour ce faire, en plus de l'en-tête du fichier Nom du modèle, les types de publication pris en charge par un modèle peuvent être spécifiés à l'aide du type de publication du modèle: comme suit.
<?php
/*
Template Name: Full-width page layout
Template Post Type: post, page, product
*/
Vous pouvez obtenir plus d'informations à ce sujet dans les pages suivantes.
https://wptavern.com/wordpress-4-7-brings-custom-page-template-functionality-to-all-post-typeshttps://make.wordpress.org/core/2016/11/03/post-type-templates-in-4-7/
Vous pouvez créer un modèle pour les types de publication personnalisés en créant des fichiers, comme par exemple:
single-mycustomposttype.php
Voir Hiérarchie des modèles dans le codex.
PS: il a été répondu à déjà .
Voici ce qui fonctionne pour moi:
add_filter('single_template', function($original){
global $post;
$post_name = $post->post_name;
$post_type = $post->post_type;
$base_name = 'single-' . $post_type . '-' . $post_name . '.php';
$template = locate_template($base_name);
if ($template && ! empty($template)) return $template;
return $original;
});
Ainsi, étant donné une publication de type personnalisé foobar
et un slug de hello-world
, le code ci-dessus chargerait le modèle single-foobar-hello-world.php
, s'il existait déjà.
Pour ceux qui atteignent ce fil via Google, WP 4.7 a introduit des modèles pour tous les types d'articles. Voir Make WP Core pour une procédure complète. Vous n'êtes plus limité à un modèle pour l'ensemble de votre CPT, vous pouvez affecter des modèles individuels poste par poste, comme vous pouvez le faire avec Pages.
Commencez par créer une page nommée Items en tant qu’élément qui affiche le contenu à partir d’articles post types, puis créez un fichier modèle comme ci-dessous et appelez-le. Sélectionnez ce modèle pour la page que vous avez créée.
<div class="container">
<div class="row">
<div class="col-md-9">
<div class="panel panel-default text-center">
<?php $loop = new WP_Query( array( 'post_type' => 'items', 'posts_per_page' => 5 ) ); ?>
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
<?php the_title();?>
<?php if(has_post_thumbnail() ) { the_post_thumbnail(); } ?>
<?php the_content();?>
<?php endwhile; ?>
<?php wp_reset_query(); ?>
</div>
</div>
</div>
</div>
C'est un peu vieux mais vous pouvez aussi essayer ceci:
Créez un modèle pour le type de publication personnalisé:
single-*custom-post-type-slug*.php
Le fichier doit vérifier le slug et vérifier si un fichier existe, sinon, se replier sur un fichier de modèle par défaut:
<?php
$slug = get_post_field( 'post_name', get_post() );
$slug = ( locate_template( 'templates/*custom-post-type-slug*/' . $slug . '.php' ) ) ? $slug : 'default';
get_template_part( 'templates/*custom-post-type-slug*/' . $slug );
?>
Remplacez toutes les instances de custom-post-type-slug par le slug actuel de votre type de publication personnalisé.
Je le fais pour des raisons de facilité d'utilisation et d'organisation. Cela me semble plus propre que d'avoir tous les fichiers dans le dossier racine du thème.
exemple de structure de dossier:
themeroot
| |single-cases.php
|-templates
| --cases
| |default.php
| |case-one.php
| |case-two.php