El archivo single-{custom}.php de tipo de entrada personalizado no funciona
Creé un tipo de entrada personalizado con el nombre especial special_media_post y WordPress simplemente no detecta el archivo single-special_media_post.php. Estoy completamente perdido. Sigue usando por defecto el index.php
Aquí está mi código para mi tipo de entrada personalizado y sus taxonomías:
//Cosas de Entradas y Taxonomías
//Registrar Tipo de Entrada Personalizado
function special_media_post() {
$labels = array(
'name' => _x( 'Entradas de Medios', 'Nombre General del Tipo de Entrada', 'text_domain' ),
'singular_name' => _x( 'Entrada de Medio', 'Nombre Singular del Tipo de Entrada', 'text_domain' ),
'menu_name' => __( 'Entrada de Medio', 'text_domain' ),
'parent_item_colon' => __( 'Entrada de Medio:', 'text_domain' ),
'all_items' => __( 'Todas las Entradas de Medios', 'text_domain' ),
'view_item' => __( 'Ver Entrada de Medio', 'text_domain' ),
'add_new_item' => __( 'Añadir Nueva Entrada de Medio', 'text_domain' ),
'add_new' => __( 'Nueva Entrada de Medio', 'text_domain' ),
'edit_item' => __( 'Editar Entrada de Medio', 'text_domain' ),
'update_item' => __( 'Actualizar Entrada de Medio', 'text_domain' ),
'search_items' => __( 'Buscar Entradas de Medios', 'text_domain' ),
'not_found' => __( 'No se encontraron entradas de medios', 'text_domain' ),
'not_found_in_trash' => __( 'No se encontraron entradas de medios en la Papelera', 'text_domain' ),
);
$rewrite = array(
'slug' => 'mediapost',
'with_front' => true,
'pages' => true,
'feeds' => true,
);
$args = array(
'label' => __( 'mediapost', 'text_domain' ),
'description' => __( 'Tipo de Entrada para Medios', 'text_domain' ),
'labels' => $labels,
'supports' => array( 'title', 'editor', 'custom-fields', ),
'taxonomies' => array( 'year', 'type' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'show_in_admin_bar' => true,
'menu_position' => 5,
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'query_var' => 'mediapost',
'rewrite' => $rewrite,
'capability_type' => 'page',
);
register_post_type( 'special_media_post', $args );
}
// Registrar Taxonomía Personalizada
function media_year() {
$labels = array(
'name' => _x( 'Años', 'Nombre General de Taxonomía', 'text_domain' ),
'singular_name' => _x( 'Año', 'Nombre Singular de Taxonomía', 'text_domain' ),
'menu_name' => __( 'Año', 'text_domain' ),
'all_items' => __( 'Todos los Años', 'text_domain' ),
'parent_item' => __( 'Año Padre', 'text_domain' ),
'parent_item_colon' => __( 'Año Padre:', 'text_domain' ),
'new_item_name' => __( 'Nombre del Nuevo Año', 'text_domain' ),
'add_new_item' => __( 'Añadir Nuevo Año', 'text_domain' ),
'edit_item' => __( 'Editar Año', 'text_domain' ),
'update_item' => __( 'Actualizar Año', 'text_domain' ),
'separate_items_with_commas' => __( 'Separar años con comas', 'text_domain' ),
'search_items' => __( 'Buscar años', 'text_domain' ),
'add_or_remove_items' => __( 'Añadir o eliminar años', 'text_domain' ),
'choose_from_most_used' => __( 'Elegir entre los años más usados', 'text_domain' ),
);
$rewrite = array(
'slug' => 'year',
'with_front' => true,
'hierarchical' => true,
);
$capabilities = array(
'manage_terms' => 'manage_categories',
'edit_terms' => 'manage_categories',
'delete_terms' => 'manage_categories',
'assign_terms' => 'edit_posts',
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
'query_var' => 'year',
'rewrite' => $rewrite,
'capabilities' => $capabilities,
);
register_taxonomy( 'year', 'special_media_post', $args );
}
// Registrar Taxonomía Personalizada
function media_type() {
$labels = array(
'name' => _x( 'Tipos', 'Nombre General de Taxonomía', 'text_domain' ),
'singular_name' => _x( 'Tipo', 'Nombre Singular de Taxonomía', 'text_domain' ),
'menu_name' => __( 'Tipo', 'text_domain' ),
'all_items' => __( 'Todos los Tipos', 'text_domain' ),
'parent_item' => __( 'Tipo Padre', 'text_domain' ),
'parent_item_colon' => __( 'Tipo Padre:', 'text_domain' ),
'new_item_name' => __( 'Nombre del Nuevo Tipo', 'text_domain' ),
'add_new_item' => __( 'Añadir Nuevo Tipo', 'text_domain' ),
'edit_item' => __( 'Editar Tipo', 'text_domain' ),
'update_item' => __( 'Actualizar Tipo', 'text_domain' ),
'separate_items_with_commas' => __( 'Separar tipos con comas', 'text_domain' ),
'search_items' => __( 'Buscar tipos', 'text_domain' ),
'add_or_remove_items' => __( 'Añadir o eliminar tipos', 'text_domain' ),
'choose_from_most_used' => __( 'Elegir entre los tipos más usados', 'text_domain' ),
);
$rewrite = array(
'slug' => 'type',
'with_front' => true,
'hierarchical' => true,
);
$capabilities = array(
'manage_terms' => 'manage_categories',
'edit_terms' => 'manage_categories',
'delete_terms' => 'manage_categories',
'assign_terms' => 'edit_posts',
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
'query_var' => 'media_type',
'rewrite' => $rewrite,
'capabilities' => $capabilities,
);
register_taxonomy( 'type', 'special_media_post', $args );
}
// Conectar a la acción 'init'
add_action( 'init', 'special_media_post', 0 );
// Conectar a la acción 'init'
add_action( 'init', 'media_year', 0 );
// Conectar a la acción 'init'
add_action( 'init', 'media_type', 0 );
Si hay algo más que necesites ver, puedo mostrarlo, pero ni siquiera lo detecta si pongo un echo 'Hello World' allí. Así que simplemente no está viendo ni el single-special_media_post.php ni el archive-special_media_post.php
Cambia el código
De :
'has_archive' => true,
A :
'has_archive' => false,
Y luego ve a la página de enlaces permanentes, cambia a predeterminado y vuelve a tu "enlace permanente bonito"
%postname%/
Ahora debería funcionar.
La razón por la que no va a la página single-{custom_post_type}.php es por el has_archive. Cuando has_archive está configurado en true buscará archive-{custom_post_type}.php en lugar de la página single.
Espero que esto haya funcionado.

No estoy seguro de que eso sea cierto. Una vista de publicación única es una vista de publicación única, independientemente de que el tipo de publicación admita vistas de índice de archivo o no.

Esta solución que publiqué es cómo resolví mi problema en mi tema desarrollado por mí mismo. Cuando mi página de tipo de publicación única no me mostraba lo que quería ver.

Es posible que la solución provenga de restablecer la estructura de enlaces permanentes, lo que a su vez reinició las reglas de reescritura.

la configuración 'has_archive' no tiene efecto sobre si la plantilla single-{post_type}.php se utilizará para una solicitud individual.

Copié tu código, limpié las reglas de reescritura a través del Admin y ahora el Tema usa las plantillas correctas cuando visito una Publicación de Medios.
Necesitas limpiar las reglas de reescritura una vez usando el hook after_switch_theme. Esto asegurará que las reglas de reescritura se limpien automáticamente después de que el usuario active el Tema.
Puedes usar este código (directo del Codex):
add_action( 'init', 'theme_prefix_cpt_init' );
function theme_prefix_cpt_init() {
register_post_type( ... );
}
function theme_prefix_rewrite_flush() {
flush_rewrite_rules();
}
add_action( 'after_switch_theme', 'theme_prefix_rewrite_flush' );
Por favor consulta el Codex de WordPress para más información: http://codex.wordpress.org/Function_Reference/register_post_type
EDIT: En tal caso, el Plugin Inspect Rewrite Rules es muy útil, porque te permite ver las reglas conectadas a tu tipo de contenido personalizado: http://wordpress.org/extend/plugins/rewrite-rules-inspector/
Como nota adicional, ten en cuenta que el lugar recomendado para poner Tipos de Contenido Personalizados es un Plugin, no un Tema.

También es una buena práctica usar register_activation_hook()
y register_deactivation_hook()
al crear nuevos tipos de contenido.
Parece que los tipos de contenido recién creados siempre fallan al intentar reescribir las reglas. Para evitar esto, coloca en el callback de register_activation_hook() la función flush_rewrite_rules()
junto con tu función de registro de nuevo contenido. No sé exactamente por qué, pero hacer esto parece evitar el problema. Mira:
register_activation_hook( __FILE__, 'your_active_hook' );
function your_active_hook() {
special_media_post();
flush_rewrite_rules();
}
