Permalinks: tip de postare personalizat -> taxonomie personalizată -> postare
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.
Î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
.

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!

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

@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%

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.

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.

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

Ș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

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.

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.

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

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.

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

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!

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

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

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

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.

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.

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.

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

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

@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' );
