Pagina singola di un custom post type reindirizza alla pagina 404
Ho dichiarato il post type come segue:
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'agences'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'taxonomies' => array('brands', 'country'),
'supports' => array('title', 'editor', 'author', 'thumbnail', 'custom-fields')
);
register_post_type('destinations', $args);
Inizialmente potevo accedere alla pagina singola di questo post type usando single-agences.php
ma ora viene reindirizzato alla 404.
Ho controllato altre risposte e ho scoperto che è un errore comune ma le altre soluzioni non hanno risolto il problema. Qualsiasi aiuto sarà prezioso.

Un CPT appena registrato mostra un errore 404 perché la funzione register_post_type()
non aggiorna automaticamente le regole di riscrittura. Sta a te decidere se farlo manualmente o automaticamente.
Metodo Manuale:
Accedi a /wp-admin/
, poi vai su Impostazioni » Permalink, e semplicemente clicca il pulsante Salva modifiche per aggiornare le regole di riscrittura.
Metodo Automatico:
Puoi aggiornare le regole di riscrittura usando la funzione flush_rewrite_rules()
. Tuttavia, poiché register_post_type()
viene chiamato nell'hook init
, verrà eseguito ogni volta che l'hook init
viene attivato. Anche il codex lo conferma:
Questa funzione è utile quando si utilizzano custom post type perché permette l'aggiornamento automatico delle regole di riscrittura di WordPress (che di solito devono essere aggiornate manualmente per i nuovi custom post type). Tuttavia, questa è un'operazione costosa quindi dovrebbe essere usata solo quando strettamente necessario.
Per questo motivo è meglio agganciare l'operazione a qualcosa che viene eseguito una sola volta, e che aggiorna le regole solo quando necessario. Come @cybmeta ha già mostrato. Ma puoi anche seguire l'approccio di @bainternet:
/**
* Per attivare la pagina singola del CPT
* @author Bainternet
* @link http://en.bainternet.info/2011/custom-post-type-getting-404-on-permalinks
* ---
*/
$set = get_option( 'post_type_rules_flased_mycpt' );
if ( $set !== true ){
flush_rewrite_rules( false );
update_option( 'post_type_rules_flased_mycpt', true );
}
Lui salva un valore nella tabella options
solo per il tuo post type. E se il valore non è presente, aggiorna le regole di riscrittura. Se è presente, non lo fa.
Ma nota che questa operazione effettua una query al database ogni volta (se non è in cache). Quindi, preferirei agganciare il codice all'hook after_setup_theme
per i temi, o a register_activation_hook
per i plugin.
Bonus
Durante il debug delle regole di riscrittura, questi plugin possono essere molto utili:

Non è un CPT appena registrato. Ho anche provato a ripulire le regole di rewrite più volte ma non ha funzionato. Quando uso il formato permalink "semplice" funziona. Ma non con il formato "Nome articolo".

Potresti confermare che mod_rewrite
sia abilitato sul tuo server e che funzioni per altri URL standard di questa installazione WordPress? Ti consiglio anche di seguire il processo di debug base.

Sul server ho molte installazioni WordPress con diversi custom post type e tutti funzionano correttamente.

Quindi per noi è impossibile da rilevare. Puoi condividere il tuo prodotto utilizzando GitHub, Bitbucket, GitLab, ecc., in modo che qualcuno possa verificare se ha funzionato globalmente o meno. È troppo localizzato al tuo ambiente di sviluppo, che purtroppo nessuno può toccare. :(
