Il template single-{custom}.php del custom post type non funziona
Ho creato un custom post type con il nome macchina special_media_post e WordPress semplicemente non riconosce il file single-special_media_post.php. Sono completamente bloccato. Continua a utilizzare il file index.php come fallback.
Ecco il mio codice per il custom post type e le sue tassonomie:
//Post e roba delle Tassonomie
//Registra Custom Post Type
function special_media_post() {
$labels = array(
'name' => _x( 'Post Media', 'Nome Tipo Post Generale', 'text_domain' ),
'singular_name' => _x( 'Post Media', 'Nome Tipo Post Singolare', 'text_domain' ),
'menu_name' => __( 'Post Media', 'text_domain' ),
'parent_item_colon' => __( 'Post Media:', 'text_domain' ),
'all_items' => __( 'Tutti i Post Media', 'text_domain' ),
'view_item' => __( 'Visualizza Post Media', 'text_domain' ),
'add_new_item' => __( 'Aggiungi Nuovo Post Media', 'text_domain' ),
'add_new' => __( 'Nuovo Post Media', 'text_domain' ),
'edit_item' => __( 'Modifica Post Media', 'text_domain' ),
'update_item' => __( 'Aggiorna Post Media', 'text_domain' ),
'search_items' => __( 'Cerca Post Media', 'text_domain' ),
'not_found' => __( 'Nessun post media trovato', 'text_domain' ),
'not_found_in_trash' => __( 'Nessun post media trovato nel Cestino', 'text_domain' ),
);
$rewrite = array(
'slug' => 'mediapost',
'with_front' => true,
'pages' => true,
'feeds' => true,
);
$args = array(
'label' => __( 'mediapost', 'text_domain' ),
'description' => __( 'Tipo Post per Media', '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 );
}
// Registra Tassonomia Personalizzata
function media_year() {
$labels = array(
'name' => _x( 'Anni', 'Nome Tassonomia Generale', 'text_domain' ),
'singular_name' => _x( 'Anno', 'Nome Tassonomia Singolare', 'text_domain' ),
'menu_name' => __( 'Anno', 'text_domain' ),
'all_items' => __( 'Tutti gli Anni', 'text_domain' ),
'parent_item' => __( 'Anno Genitore', 'text_domain' ),
'parent_item_colon' => __( 'Anno Genitore:', 'text_domain' ),
'new_item_name' => __( 'Nuovo Nome Anno', 'text_domain' ),
'add_new_item' => __( 'Aggiungi Nuovo Anno', 'text_domain' ),
'edit_item' => __( 'Modifica Anno', 'text_domain' ),
'update_item' => __( 'Aggiorna Anno', 'text_domain' ),
'separate_items_with_commas' => __( 'Separa gli anni con le virgole', 'text_domain' ),
'search_items' => __( 'Cerca anni', 'text_domain' ),
'add_or_remove_items' => __( 'Aggiungi o rimuovi anni', 'text_domain' ),
'choose_from_most_used' => __( 'Scegli tra gli anni più usati', '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 );
}
// Registra Tassonomia Personalizzata
function media_type() {
$labels = array(
'name' => _x( 'Tipi', 'Nome Tassonomia Generale', 'text_domain' ),
'singular_name' => _x( 'Tipo', 'Nome Tassonomia Singolare', 'text_domain' ),
'menu_name' => __( 'Tipo', 'text_domain' ),
'all_items' => __( 'Tutti i Tipi', 'text_domain' ),
'parent_item' => __( 'Tipo Genitore', 'text_domain' ),
'parent_item_colon' => __( 'Tipo Genitore:', 'text_domain' ),
'new_item_name' => __( 'Nuovo Nome Tipo', 'text_domain' ),
'add_new_item' => __( 'Aggiungi Nuovo Tipo', 'text_domain' ),
'edit_item' => __( 'Modifica Tipo', 'text_domain' ),
'update_item' => __( 'Aggiorna Tipo', 'text_domain' ),
'separate_items_with_commas' => __( 'Separa i tipi con le virgole', 'text_domain' ),
'search_items' => __( 'Cerca tipi', 'text_domain' ),
'add_or_remove_items' => __( 'Aggiungi o rimuovi tipi', 'text_domain' ),
'choose_from_most_used' => __( 'Scegli tra i tipi più usati', '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 );
}
// Hook nell'azione 'init'
add_action( 'init', 'special_media_post', 0 );
// Hook nell'azione 'init'
add_action( 'init', 'media_year', 0 );
// Hook nell'azione 'init'
add_action( 'init', 'media_type', 0 );
Se c'è qualcos'altro che hai bisogno di vedere, posso condividerlo, ma non viene rilevato neanche se inserisco un echo 'Hello World' all'interno. Quindi semplicemente non riconosce né il file single-special_media_post.php né archive-special_media_post.php
Modifica il codice
Da:
'has_archive' => true,
A:
'has_archive' => false,
Poi vai nella pagina dei permalink, cambia in predefinito e torna al tuo "pretty permalink"
%postname%/
Ora dovrebbe funzionare.
Il motivo per cui non va alla pagina single-{custom_post_type}.php è a causa dell'has_archive. Quando has_archive è impostato su true cercherà archive-{custom_post_type}.php invece della pagina single.
Spero che abbia funzionato.

Non sono sicuro che sia vero. Una visualizzazione singola di un post è una visualizzazione singola di un post, indipendentemente dal fatto che il post-type supporti o meno le visualizzazioni dell'indice dell'archivio.

Questa soluzione che ho pubblicato è come ho risolto il mio problema sul mio tema sviluppato autonomamente. Quando la mia pagina di post type singolo ora mi mostrava ciò che volevo vedere.

È possibile che la correzione derivi dal ripristino della struttura dei permalink, che a sua volta ha resettato le regole di riscrittura.

l'impostazione 'has_archive' non ha alcun effetto sul fatto che il template single-{post_type}.php venga utilizzato o meno per una richiesta singola.

Ho copiato il tuo codice, ho resettato le regole di riscrittura tramite l'Admin e ora il Tema utilizza i template corretti quando visito un Media Post.
Devi resettare le regole di riscrittura una volta utilizzando l'hook after_switch_theme. Questo garantirà che le regole di riscrittura vengano aggiornate automaticamente dopo che l'utente ha attivato il Tema.
Puoi usare questo codice (preso direttamente dal 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' );
Consulta il WordPress Codex per maggiori informazioni: http://codex.wordpress.org/Function_Reference/register_post_type
EDIT: In questi casi, il plugin Inspect Rewrite Rules è molto utile, perché ti permette di vedere le regole collegate al tuo custom post type: http://wordpress.org/extend/plugins/rewrite-rules-inspector/
Come nota a margine, tieni presente che il posto consigliato per inserire i Custom Post Types è un Plugin, non un Tema.

È una buona pratica utilizzare anche register_activation_hook()
e register_deactivation_hook()
quando si creano nuovi tipi di contenuto.
Sembra che i nuovi tipi di contenuto abbiano sempre problemi con la riscrittura degli URL. Per evitare questo, inserisci nel callback di register_activation_hook() la funzione flush_rewrite_rules()
insieme alla tua funzione di registrazione del nuovo tipo di contenuto. Non so il perché, ma facendo così sembra evitare il problema. Guarda:
register_activation_hook( __FILE__, 'your_active_hook' );
function your_active_hook() {
special_media_post();
flush_rewrite_rules();
}
