¿Puedo asignar una plantilla a un tipo de publicación personalizada?

35

¿Puedo asignar un archivo de plantilla a un tipo de publicación personalizado?

He creado un tipo de publicación personalizado llamado items, y me gustaría asignar plantillas a los elementos como puede hacer con las páginas.

Odyss3us
fuente
wpbeginner.com/wp-themes/… (esto es para publicaciones pero puede modificarlo para CPT) nathanrice.net/blog/wordpress-single-post-templates (esto es para publicaciones pero puede modificarlo para CPT) Es un buena idea para un complemento en realidad.
Wyck

Respuestas:

50

Desde WordPress versión 4.7 ahora puede asignar plantillas de página personalizadas a otros tipos de publicaciones junto con la página.

Para lograr esto además del encabezado del archivo de Nombre de plantilla, los tipos de publicación admitidos por una plantilla se pueden especificar usando el Tipo de publicación de plantilla: de la siguiente manera.

<?php
/*
Template Name: Full-width page layout
Template Post Type: post, page, product
*/

Puede obtener más información al respecto en las siguientes páginas.

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-en-4-7 /

Vinod Dalvi
fuente
21

Puede crear plantillas para tipos de publicaciones personalizadas creando archivos, como por ejemplo:

single-mycustomposttype.php

Ver Jerarquía de plantillas en el códice.

PD : esto ya ha sido respondido.

mike23
fuente
2
Gracias por eso, pero lo que me gustaría saber es si es posible agregar plantillas personalizadas a los tipos de publicaciones personalizadas. Entonces, por ejemplo, ¿puedo crear dos plantillas y asignar cada plantilla a su publicación respectiva? Eso solo permite especificar un archivo de plantilla para manejar ese tipo de publicación específica hasta donde yo entiendo.
Odyss3us
Es decir, si necesita diferentes plantillas para publicaciones individuales, es posible que desee crear varios tipos de publicaciones personalizadas, de acuerdo con cada plantilla necesaria. Supongo que eso depende de cuántas plantillas diferentes necesites. ¿Qué vas a hacer en las plantillas que deben ser diferentes en cada publicación?
mike23
Esta respuesta ahora está desactualizada. Ver la respuesta de Vinod Dalvi.
Simon East
8

Esto es lo que funciona para mí:

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;
});

Por lo tanto, dada una publicación de tipo de publicación personalizada foobary una barra del hello-worldcódigo anterior cargaría la single-foobar-hello-world.phpplantilla, si existiera.

Chris Carson
fuente
4

Para aquellos que llegan a este hilo a través de Google, WP 4.7 introdujo plantillas para todos los tipos de publicaciones. Vea Make WP Core para un tutorial completo. Ya no está restringido a una plantilla para todo su CPT, puede asignar plantillas individuales publicación por publicación al igual que lo hace con Pages.

WebElaine
fuente
2

Esto es un poco viejo pero también puedes probar esto:

Cree una plantilla para el tipo de publicación personalizada:

single-*custom-post-type-slug*.php

El archivo debe verificar el slug y verificar si existe un archivo, si no, recurrir a un archivo de plantilla predeterminado:

<?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  );
?>

Reemplace todas las instancias de custom-post-type-slug con la babosa real de su tipo de publicación personalizada.

Lo hago por facilidad de uso y con fines organizativos. Me parece más limpio que tener todos los archivos en la carpeta raíz del tema.

estructura de carpetas de ejemplo:

themeroot
| |single-cases.php
|-templates
| --cases
|   |default.php
|   |case-one.php
|   |case-two.php
eballeste
fuente
1

Primero cree en la página nombrada como Elementos como desee que muestre el contenido de los tipos de publicaciones de elementos, luego cree un archivo de plantilla como se muestra a continuación y denomine esos elementos de plantilla. Seleccione esa plantilla para la página que ha creado.

<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>
aplaudir
fuente
1

Esto es muy sencillo de hacer.

Cree un nuevo archivo PHP en el directorio raíz de su tema y agréguelo al principio:

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

El ejemplo completo será el siguiente:

<?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
fuente