J'ai enregistré un nouveau type de message appelé Ressources. Je spécifie "attributs de page" en tant que fonctionnalité prise en charge. Lorsque je crée un nouveau poste de ressource, je le vois sous Modèle que je peux choisir parmi un certain nombre de modèles personnalisés que j'ai définis. Mais après avoir choisi ceci et cliqué sur mettre à jour, le paramètre n'est pas enregistré et le modèle n'est pas utilisé. Des idées?
function create_post_type() {
register_post_type( 'foo_resources',
array(
'labels' => array(
'name' => __( 'Resources' ),
'singular_name' => __( 'Resource' )
),
'public' => true,
'has_archive' => true,
'hierarchical' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_position' => 5,
'supports' => array('title','editor','author','page-attributes'),
'rewrite' => array(
'slug' => 'resources',
'with_front' => false
),
)
);
}
Le modèle de page pour le type de publication personnalisé n'est pas enregistré car il vérifie si le type de publication est "page" - il n'est pas encore implémenté pour les types de publication personnalisés. La liste déroulante des modèles de page a été complètement supprimée en 3.1.
C'est ma façon de gérer ça:
/* Define the custom box */
// WP 3.0+
add_action('add_meta_boxes', 'custom_template_add_custom_box');
// backwards compatible
//add_action('admin_init', 'custom_templatet_add_custom_box', 1);
/* Do something with the data entered */
add_action('save_post', 'custom_template_save_postdata');
/* Adds a box to the main column on the Post and Page edit screens */
function custom_template_add_custom_box() {
add_meta_box( 'custom-post-type-template', 'Custom Post Type Template', 'custom_template_inner_box', 'foo_resources', 'side' );
}
/* Prints the box content */
function custom_template_inner_box( $post ) {
// Use nonce for verification
wp_nonce_field( plugin_basename(__FILE__), 'custom_template_noncename' );
if ( 0 != count( get_page_templates() ) ) {
$page_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($page_template); ?>
</select>
<?php }
}
/* When the post is saved, saves our custom data */
function custom_template_save_postdata( $post_id ) {
// verify this came from the our screen and with proper authorization,
// because save_post can be triggered at other times
if ( !isset( $_POST['custom_template_noncename'] ) || !wp_verify_nonce( $_POST['custom_template_noncename'], plugin_basename(__FILE__) ) )
return $post_id;
// verify if this is an auto save routine.
// If it is our form has not been submitted, so we dont want to do anything
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
// Check permissions
if ( 'page' == $_POST['post_type'] )
{
if ( !current_user_can( 'edit_page', $post_id ) )
return $post_id;
}
else
{
if ( !current_user_can( 'edit_post', $post_id ) )
return $post_id;
}
// OK, we're authenticated: we need to find and save the data
$page_template = $_POST['page_template'];
if ( !empty($page_template) && 'foo_resources' == get_post_type($post_id) ) {
$page_templates = get_page_templates();
if ( 'default' != $page_template && !in_array($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($post_id, '_wp_page_template', $page_template);
}
}
/* Custom template redirection hook */
function custom_template_redirect() {
global $post;
if ( is_single() && 'foo_resources' == get_post_type($post) ) {
$page_template = get_page_template();
include($page_template);
exit;
}
}
add_action("template_redirect", 'custom_template_redirect');
Vous devriez peut-être envisager d'utiliser les formats de publication comme une autre option.