Permalinks: tip de postare personalizat -> taxonomie personalizată -> postare

1 aug. 2013, 19:16:22
Vizualizări: 77K
Voturi: 49

Am probleme cu regulile de rescriere WordPress și aș avea nevoie de ajutor.

Am un tip de postare personalizat numit _shows_.

Toate shows au o singură categorie de taxonomie personalizată _show-category_. Un _show_ nu va avea niciodată mai mult de o _show-category_.

Aș dori ca URL-urile mele să fie direcționate în acest mod:

www.mysite.com/shows/  =>  archive-shows.php

www.mysite.com/shows/%category%/ => taxonomy-show-category.php

www.mysite.com/shows/%category%/%postname%/ => single-shows.php

Așadar, ca exemplu din lumea reală, să zicem că avem o _show-category_ "Foo" și o postare _show_ intitulată "Bar" care are "Foo" ca _show-category_. Mă aștept ca aplicația mea WordPress să arate astfel:

www.mysite.com/shows/foo/ => afișează toate postările din categoria foo
www.mysite.com/shows/foo/bar => afișează postarea individuală

Încerc să evit plugin-urile când este posibil, dar sunt deschis la orice soluție.

2
Comentarii

doar îți arăt ceva ce a trebuit să fac înainte.. http://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rule-conflict-in-parameters

reikyoushin reikyoushin
1 aug. 2013 20:14:18

Întrebare excelentă, iar răspunsul acceptat de @Milo este atât de bine făcut încât ar trebui să fie în documentația oficială Wordpress. Acesta este un caz de utilizare FOARTE comun pentru URL-uri corecte.

Khom Nazid Khom Nazid
6 apr. 2022 04:36:29
Toate răspunsurile la întrebare 1
22
93

În primul rând, înregistrează-ți taxonomia și setează argumentul slug din rewrite la shows:

register_taxonomy(
    'show_category',
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows', 'with_front' => false ),
        // alte argumente...
    )
);

Apoi, înregistrează-ți tipul de post și setează slug-ul la shows/%show_category%, iar argumentul has_archive la shows:

register_post_type(
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows/%show_category%', 'with_front' => false ),
        'has_archive' => 'shows',
        // alte argumente...
    )
);

În final, adaugă un filtru la post_type_link pentru a substitui categoria show în legăturile permanente ale show-urilor individuale:

function wpa_show_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == 'show' ){
        $terms = wp_get_object_terms( $post->ID, 'show_category' );
        if( $terms ){
            return str_replace( '%show_category%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'wpa_show_permalinks', 1, 2 );

EDITARE

Am uitat argumentul has_archive din register_post_type de mai sus, acesta trebuie setat la shows.

1 aug. 2013 20:44:32
Comentarii

Milo, mulțumesc! Filtrul post_type_link a fost piesea lipsă pentru mine. Oricine citește acest thread cu aceeași problemă, singurul lucru de notat este că există o mică greșeală în funcția wpa_show_permalinks, unde $post->post_type == 'show' ar trebui să fie de fapt 'shows'. Mulțumesc din nou, Milo!

Paul T Paul T
2 aug. 2013 08:38:46

Mulțumesc, Milo! Asta a rezolvat problema mea. Încercam să realizez ceva similar folosind acest plugin și URL-urile rescrise primeau eroarea 404. Presupun că a face-o manual a fost calea corectă.

Martin Sotirov Martin Sotirov
2 aug. 2015 17:23:08

@milo, venind de la http://wordpress.stackexchange.com/questions/199456/custom-taxonomy-post-slug-permalink, tot ajung la o eroare 404 cu această abordare. Structura mea de permalink este %category%/%postname%

Atticus Atticus
23 aug. 2015 20:47:23

Dacă faci modificări la o instanță WordPress existentă, asigură-te că mergi la Setări > Legături permanente și dai click pe Salvare. Modificările pe care le-ai făcut în functions.php nu vor avea efect până nu faci acest lucru.

Jay Neely Jay Neely
5 ian. 2016 02:14:37

Aproape că a funcționat pentru mine în sensul că taxonomia apare pe pagina tipului de post, URL-ul /tip_post/taxonomie/ este o pagină validă (anterior dădea eroare 404), dar /tip_post/taxonomie/post dă în continuare 404. Am observat că la înregistrarea taxonomiei mai sus, atât "show_category", cât și "show" erau înregistrate, deși doar show_category este taxonomia. Eu înregistrez doar taxonomia.

justinavery justinavery
28 sept. 2016 10:16:31

@Milo există vreo modalitate de a face acest lucru să funcționeze și cu sub-sub-taxonomii precum shows/taxonomie/subtaxonomie/post?

Benn Benn
26 ian. 2017 16:22:16

Și eu aș fi interesat să aflu cum să fac asta să funcționeze cu termenii descendentați din taxonomii, precum /shows/tax/subtax/postname

Solomon Closson Solomon Closson
22 feb. 2017 05:01:39

Aceasta este o tehnică foarte valoroasă, mulțumesc. Există totuși o mică problemă: prin utilizarea 'post_type_link', butonul de modificare/editare din vizualizarea de editare a postării din admin va dispărea. Aceasta înseamnă că slug-ul postării nu va mai putea fi editat, astfel încât acel slug va rămâne fix și dacă veți schimba post_title ulterior, nu veți putea reflecta modificarea în slug.

Luca Reghellin Luca Reghellin
4 aug. 2017 08:57:46

Cum (intern) 'shows/%show_category%' se rezolvă automat către taxonomia/termenul corect? Sunt doar curios. Documentația oficială register_post_type nu explică, nici nu oferă informații și lasă impresia că putem folosi doar șiruri de caractere obișnuite în loc de structuri complete de permalink. De asemenea, nu găsesc nicio documentație despre generarea automată a tag-urilor de structură permalink la crearea taxonomiilor.

Luca Reghellin Luca Reghellin
4 aug. 2017 12:07:51

@Stratboy Va trebui să încerc din nou, nu-mi amintesc ca slug-ul articolului să nu fie editabil în acest caz. Știu că pentru structuri mai complexe a trebuit să folosesc add_permastruct în loc. WP nu face nimic cu %show_category% în acest caz, este doar un substituent pe care trebuie să-l înlocuiești manual în filtrul post_type_link. Acesta poate fi orice tag de rewrite valid, de exemplu dacă vrei să folosești un câmp personalizat sau altceva în URL.

Milo Milo
4 aug. 2017 12:48:54

De fapt, dacă te uiți la $wp_rewrite imediat după înregistrarea tipurilor de postări dar înainte de filtrul post_type_link, vei observa că tag-ul %show_category% a fost generat, precum și permastructurile asociate. Deci este ciudat, ele există, deci sunt recunoscute dar probabil WordPress nu știe cum să le trateze.

Luca Reghellin Luca Reghellin
4 aug. 2017 13:01:45

@stratboy show_category trebuie să fie un tag de rewrite valid, ceea ce este, pentru că a fost adăugat ca parte a înregistrării taxonomiei, dar poate fi și unul adăugat prin add_rewrite_tag. În spate, face același lucru.

Milo Milo
4 aug. 2017 16:44:44

Ce se întâmplă când ai nevoie de slug diferit în diverse limbi? (de exemplu WPML). Și când anumite articole nu au categorie setată, vor avea doar /spectacole/nume-postare? Mulțumesc!

trainoasis trainoasis
5 dec. 2018 09:05:14

În cazul WPML, acest lucru funcționează pentru limba implicită dar din păcate nu și pentru celelalte

Ivan Topić Ivan Topić
27 feb. 2019 13:07:35

Aș fi dorit să funcționeze și pentru mine dar fiecare singular se termină cu eroare 404....

Beee Beee
2 mar. 2019 18:39:59

Din păcate, și pentru mine rezultă în erori 404... chiar și după reîmprospătarea legăturilor permanente.

W Biggs W Biggs
6 nov. 2019 00:04:46

Atât WordPress 5.2.4, cât și WordPress 5.3 au rezultat în erori 404 și pentru această soluție. Am postat o întrebare pe forumul de suport WordPress întrebând dacă altcineva ar putea avea cunoștințe despre ce s-a schimbat în rescrierile din ultimii ani care ar fi putut strica această funcționalitate.

Acum folosesc un plugin pentru a gestiona structura legăturilor permanente și se pare că plugin-ul face o analiză wp_query pentru a face legăturile permanente să funcționeze corect.

Rebecca Dessonville Rebecca Dessonville
13 nov. 2019 17:08:16

Am avut aceeași problemă cu erorile 404 pe paginile individuale ale spectacolelor, așa cum au menționat și alți utilizatori, dar am reușit să o rezolv adăugând add_rewrite_rule( 'shows/([^/]+)/([^/]+)', 'index.php?show =$matches[2]', 'top' ); în functions. Acest cod va potrivi a doua porțiune de slug după 'show' cu numele postării spectacolului.

Sarah Sarah
8 ian. 2020 15:31:35

Soluția lui Milo aproape că funcționează. Din păcate, tipul de postare se pierde și este utilizat șablonul implicit în loc de CPT.

bitkorn bitkorn
12 mai 2020 13:33:27

Aceasta a funcționat aproape pentru mine – pagina principală de tip postare și paginile de categorii funcționau corect, dar dădea eroare la postările individuale! (WP considera că postarea este o subcategorie și returna eroarea 404.) Pasul lipsă era filtrul rewrite_rules_array, așa cum este descris aici: https://stackoverflow.com/a/23702560/915762

JoLoCo JoLoCo
27 iul. 2020 20:40:48

Există o problemă - nu poți avea aceleași slug-uri pentru taxonomii diferite, de exemplu /post-type/taxonomy-1/seo-agency/ și /post-type/taxonomy-2/seo-agency/ nu vor funcționa

Faisal Ashfaq Faisal Ashfaq
11 sept. 2021 22:35:45

@Sarah Doamne, ești SALVATOAREA mea! Funcționează acum, în sfârșit, Doamne! Mulțumesc, mulțumesc! Am avut un caz de utilizare foarte similar în care am avut un tip de postare resursă cu taxonomia resource_category. Paginile de taxonomie funcționau și arhiva funcționa, dar cele individuale nu. Acest lucru a funcționat: add_rewrite_rule( '^resources/([^/]+)/([^/]+)', 'index.php?resource=$matches[2]', 'top' );

EmilyH EmilyH
12 oct. 2022 23:24:56
Arată celelalte 17 comentarii