Pagina individuală de tip post personalizat redirecționează către pagina 404
Am declarat tipul de post astfel:
$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);
Inițial puteam accesa pagina individuală a acestui tip de post folosind single-agences.php
, dar acum redirecționează către 404.
Am verificat alte răspunsuri și am aflat că este o greșeală comună, dar alte soluții nu au funcționat. Orice ajutor ar fi minunat.

Un nou CPT înregistrat afișează eroarea 404 deoarece funcția register_post_type()
nu actualizează automat regulile de rescriere (rewrite rules). Astfel, este de la tine dacă vrei să o faci manual sau automat.
Manual:
Accesează /wp-admin/
, apoi mergi la Setări » Legături permanente și apasă butonul Salvează modificările pentru a actualiza regulile de rescriere.
Automat:
Poți actualiza regulile de rescriere folosind funcția flush_rewrite_rules()
. Dar, întrucât register_post_type()
este apelat în hook-ul init
, această acțiune se va executa de fiecare dată când hook-ul init
este declanșat. Același lucru este menționat și în codex:
Această funcție este utilă atunci când lucrezi cu tipuri personalizate de postări (custom post types), deoarece permite actualizarea automată a regulilor de rescriere WordPress (de obicei, acest lucru trebuie făcut manual pentru noile tipuri de postări). Totuși, aceasta este o operațiune costisitoare, așa că ar trebui utilizată doar atunci când este absolut necesar.
De aceea, este mai bine să atașezi această acțiune la ceva care se declanșează o singură dată și să actualizezi regulile doar atunci când este necesar. Așa cum @cybmeta a demonstrat deja. Dar poți urma și abordarea lui @bainternet:
/**
* Pentru a activa pagina Single pentru 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 );
}
El salvează o valoare în tabelul options
doar pentru tipul tău de postare. Dacă valoarea nu există, actualizează regulile de rescriere. Dacă există, nu face nimic.
Dar reține că această abordare face o interogare la baza de date de fiecare dată (dacă nu este cache-uită). Așadar, aș prefera să atașez codul la hook-ul after_setup_theme
pentru teme sau register_activation_hook
pentru plugin-uri.
Bonus
În timp ce depanezi regulile de rescriere, următoarele plugin-uri pot fi foarte utile:

Nu este un CPT nou înregistrat. De asemenea, am încercat să resetez regulile de rescriere de mai multe ori, dar nu a funcționat. Când folosesc formatul de permalink "simplu", funcționează. Dar nu funcționează cu formatul de permalink "Nume articol".

Poți să confirmi că mod_rewrite
este activat pe serverul tău și că funcționează pentru alte URL-uri standard ale acelei instalări WordPress? Aș recomanda și procesul de depanare de bază.

Pe server am mai multe instalări WordPress cu multiple tipuri de postări personalizate și toate funcționează corect.

Atunci este imposibil pentru noi să detectăm. Puteți partaja produsul dvs. folosind GitHub, Bitbucket, GitLab etc., astfel încât cineva să poată testa dacă a funcționat global sau nu. Este prea localizat în mediul dvs. de dezvoltare, despre care nimeni nu poate interveni, din păcate. :(
