¿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.
¿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.
Respuestas:
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 /
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.
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 foobar
y una barra del hello-world
código anterior cargaría la single-foobar-hello-world.php
plantilla, si existiera.
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.
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
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>
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();?>
Elaboramos otra solución utilizando el complemento de plantilla de publicación personalizada