Puis-je affecter un modèle à un type de publication personnalisé?

35

Puis-je affecter un fichier de modèle à un type de publication personnalisé?

J'ai créé un type d'article personnalisé appelé itemset j'aimerais attribuer des modèles aux éléments, comme vous pouvez le faire avec des pages.

Odyss3us
la source
wpbeginner.com/wp-themes/… (c'est pour les posts mais vous pouvez le modifier pour les CPT) nathanrice.net/blog/wordpress-single-post-templates (c'est pour les posts mais vous pouvez le modifier pour les CPT) C'est un bonne idée pour un plugin en fait.
Wyck

Réponses:

50

À partir de la version 4.7 de WordPress, vous pouvez désormais attribuer des modèles de page personnalisés à d'autres types de publication en même temps que 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-types https://make.wordpress.org/core/2016/11/03/post -type-templates-in-4-7 /

Vinod Dalvi
la source
21

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 : cela a déjà été répondu.

mike23
la source
2
Merci pour cela, mais j'aimerais savoir s'il est possible d'ajouter des modèles personnalisés à des types d'articles personnalisés. Ainsi, par exemple, puis-je créer deux modèles et affecter chaque modèle à son article respectif? Cela ne permet de spécifier qu'un seul fichier modèle pour gérer ce type de publication spécifique, pour autant que je sache.
Odyss3us
Vous voyez, si vous avez besoin de modèles différents pour des publications uniques, vous pouvez créer plusieurs types de publication personnalisés, en fonction de chaque modèle requis. Je suppose que cela dépend du nombre de modèles différents dont vous avez besoin. qu'allez-vous faire dans les modèles qui doivent être différents pour chaque poste?
mike23
Cette réponse est maintenant obsolète. Voir la réponse de Vinod Dalvi.
Simon East
8

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, un message de type message personnalisé foobaret un slug du hello-worldcode ci-dessus chargeraient le single-foobar-hello-world.phpmodèle, s'il existait.

Chris Carson
la source
4

Pour ceux qui atteignent ce fil via Google, WP 4.7 a introduit des modèles pour tous les types de publication. 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.

WebElaine
la source
2

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 réel 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
eballeste
la source
1

Commencez par créer une page nommée Items en tant qu’élément qui affiche le contenu des types d’articles post, puis créez un fichier modèle comme ci-dessous et nommez-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>
taper
la source
1

C'est très simple à faire.

Créez un nouveau fichier PHP dans le répertoire racine de votre thème et ajoutez-le au début:

<?php /*
 * Template Name: My custom view
 * Template Post Type: Post_typename   // here you need to add the name of your custom post type
 */ ?>

Exemple complet sera comme suit:

<?php /*
 * Template Name: My custom view
 * Template Post Type: Post_typename   // here you need to add the name of your custom post type
 */ ?>
<?php get_header();?>


<div class="container pt-5 pb-5">


    <?php if (has_post_thumbnail()):?>

      <img src="<?php the_post_thumbnail_url('largest');?>" class="img-fluid">

    <?php endif;?>




    <?php if (have_posts()) : while (have_posts()) : the_post();?>

        <?php the_content();?>

    <?php endwhile; endif;?>


</div>

<?php get_footer();?>
Jerryurenaa
la source