zuzuleinen
Sé cómo crear una plantilla personalizada para una página específica. Sin embargo, me gustaría crear una plantilla para un tipo de publicación personalizada específica. ¿Es eso posible y si es cierto, cómo puedo hacer eso?
Si creo una nueva plantilla, se mostrará en el administrador solo cuando agregue una página, pero cuando agregue un nuevo tipo de publicación, no tengo la opción de seleccionar una plantilla determinada.
Problema resuelto:
/*
Show the list of available custom templates templates in the Custom Post Type admin section
*/
/**
* Post_type
*/
define( 'MY_THEME_POST_TYPE', 'cases' );
/**
* Load the page template for any post object
* having the appropriate meta key set.
*/
add_action( 'template_redirect', 'mytheme_template_redirect' );
function mytheme_template_redirect() {
global $wp_query;
$id = (int) $wp_query->get_queried_object_id();
$template = get_post_meta( $id, '_wp_page_template', true );
if ( $template && 'default' !== $template ) {
$file = STYLESHEETPATH . "https://stackoverflow.com/" . $template;
if( is_file( $file ) ) {
require_once $file;
exit;
}
}
}
/**
* Process the Meta Box
* @todo Permissions check.
* @todo Filter input.
* @todo Nonces.
*/
add_action( 'save_post', 'mytheme_process_resource_template' );
function mytheme_process_resource_template() {
global $post;
/* Sanitize $_POST array. */
$clean_id = ( isset( $_POST['ID'] ) ) ? intval( $_POST['ID'] ) : 0;
if ( !empty( $_POST['page_template'] ) && MY_THEME_POST_TYPE == $post->post_type ) {
$page_templates = get_page_templates();
if ( 'default' != $page_template && !in_array( $_POST['page_template'], $page_templates ) ) {
if ( $wp_error )
return new WP_Error('invalid_page_template', __('The page template is invalid.'));
else
return 0;
}
update_post_meta( $clean_id, '_wp_page_template', $_POST['page_template'] );
}
}
/**
* Registers the Meta Box
* @uses mytheme_page_attributes_meta_box()
*/
add_action( 'admin_init', 'mytheme_register_meta_boxes', 10 );
function mytheme_register_meta_boxes() {
add_meta_box(
'mytheme_post_type_template',
'Template',
'mytheme_page_attributes_meta_box',
MY_THEME_POST_TYPE,
'side',
'low'
);
}
/**
* Creates the Meta Box
*/
function mytheme_page_attributes_meta_box() {
global $post;
$post_type_object = get_post_type_object($post->post_type);
if ( 0 != count( get_page_templates() ) ) {
$template = get_post_meta( $post->ID, '_wp_page_template', true );
?>
<p><strong><?php _e('Template') ?></strong></p>
<label class="screen-reader-text" for="page_template"><?php _e('Page Template') ?></label><select name="page_template" id="page_template">
<option value="default"><?php _e('Default Template'); ?></option>
<?php page_template_dropdown( $template ); ?>
</select>
<?php
}
}
Crea una página que se llame:
single-{cpt-slug}.php, por ejemplo, single-product.php
Se utilizará cuando se muestre una página de un tipo de publicación personalizada. es decir, cuando alguien va a http://example.com/product/awesome-shoes/
-
¿En qué carpeta tengo que poner este archivo de plantilla?
– Biagio Cannistraro
11 de noviembre de 2013 a las 12:02
-
Raíz del tema. Si tu tema es
awesome-theme
quewordpress/wp-content/themes/awesome-theme/single-product.php
.– Iván Ivánic
11 de noviembre de 2013 a las 14:20
Todavía no lo he probado, pero hay algunos complementos para habilitar TEMPLATE para un post_type personalizado: wordpress.org/plugins/custom-post-template wordpress.org/plugins/custom-post-type-page-template
– T. Todua
17 de enero de 2014 a las 17:23