Pagina individuală de tip post personalizat redirecționează către pagina 404

7 mar. 2016, 16:23:39
Vizualizări: 18.4K
Voturi: 5

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.

3
Comentarii

Deoarece nu utilizați regulile implicite de rescriere, trebuie să le reîmprospătați și să le reconstruiți. Consultați acest link: custom_post_type cu has_archive nu schimbă permalinkul

cybmeta cybmeta
7 mar. 2016 16:42:44

Fișierul single ar trebui să fie single-destinations.php, nu cu regula de rescriere. Și întregul cod ar trebui să fie în interiorul unei funcții legate de init.

Mayeenul Islam Mayeenul Islam
7 mar. 2016 20:47:28

Am încercat single-destinations.php înainte de a testa single-agences.php, dar nu a funcționat. Chiar dacă nu utilizează aceste fișiere, ar trebui să utilizeze single.php, dar returnează o eroare 404. Și da, codul este în funcția legată de init.

Deepak jha Deepak jha
7 mar. 2016 20:55:44
Toate răspunsurile la întrebare 2
5
12

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:

7 mar. 2016 17:11:54
Comentarii

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".

Deepak jha Deepak jha
7 mar. 2016 20:22:18

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ă.

Mayeenul Islam Mayeenul Islam
7 mar. 2016 20:47:08

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

Deepak jha Deepak jha
7 mar. 2016 20:57:58

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. :(

Mayeenul Islam Mayeenul Islam
7 mar. 2016 21:45:20

A fost din cauza unui plugin "Remove taxonomy base slug". Intra în conflict cu slug-ul de bază al CPT "destinations". A trebuit să folosesc "add_rewrite_rule" pentru a verifica slug-ul și a redirecționa manual către locația corectă.

Deepak jha Deepak jha
8 mar. 2016 20:10:23
0

A fost din cauza unui plugin "Remove taxonomy base slug". Acesta intra în conflict cu slug-ul de bază al CPT "destinations". A trebuit să folosesc add_rewrite_rule pentru a verifica slug-ul și a redirecționa manual către locația corectă.

6 iul. 2017 07:51:43