Il template single-{custom}.php del custom post type non funziona

22 apr 2013, 22:30:41
Visualizzazioni: 61.6K
Voti: 23

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

0
Tutte le risposte alla domanda 4
3
75

Visita la pagina dei permalink (che li rigenererà) e controlla nuovamente. WordPress probabilmente ha solo bisogno di un piccolo incoraggiamento per riconoscere la tua aggiunta alla gerarchia.

22 apr 2013 23:53:29
Commenti

wow! funziona alla perfezione, ho perso 1 ora :(

Mohammed Sufian Mohammed Sufian
22 set 2016 13:05:16

anche io ho perso un'ora, grazie!

Ted Whitehead Ted Whitehead
8 apr 2020 18:38:21

sì, un'ora persa. Pazienza. Passiamo alla prossima cosa.

bwoogie bwoogie
28 apr 2020 20:33:59
6

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.

23 apr 2013 16:06:31
Commenti

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.

Chip Bennett Chip Bennett
23 apr 2013 16:07:56

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.

Wesley Cheung Wesley Cheung
23 apr 2013 16:12:11

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

Chip Bennett Chip Bennett
23 apr 2013 16:18:05

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.

Jules Jules
18 gen 2018 16:07:42

Funziona perfettamente. Grazie mille!

user1202416 user1202416
30 ago 2019 23:18:35

@Jules - Forse non dovrebbe, ma sicuramente LO FA.

dgo dgo
29 giu 2022 00:43:34
Mostra i restanti 1 commenti
0

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.

23 apr 2013 17:58:53
0

È 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();
}
22 ago 2017 14:36:27