Cum să includ category-base în permalink-ul postării fără eroare 404
Am o pagină principală statică și o pagină separată /stiri/
ca pagină de articole. Doresc să am URL-uri pentru postări individuale în formatul:
www.exemplu.ro/stiri/nume-categorie/subcategorie/nume-postare/
iar pentru arhivele de categorii:
www.exemplu.ro/stiri/nume-categorie/
Ce am încercat deja:
Dacă adaug
stiri
ca bază pentru categorii și/stiri/%category%/%postname%/
ca structură personalizată de permalink-uri, obțin URL-urile dorite dar și eroarea 404 pentru postările individuale (atât custiri/
în URL cât și fără). Toate celelalte pagini (arhive de categorii, pagini etc.) sunt accesibile.Dacă las baza categoriei goală și permalink-urile ca
/stiri/%category%/%postname%/
, nu apar erori 404, dar URL-urile categoriilor conțin suplimentar slug-ul implicitcategory
, astfel:www.exemplu.ro/stiri/category/nume-categorie/
Dacă folosesc plugin-uri pentru a elimina baza implicită a categoriei sau setez baza categoriei la
.
, aceasta este eliminată împreună cu parteastiri
Dacă setez permalink-urile ca
/%category%/%postname%/
și adaug doar baza categorieistiri
, nu apar erori 404, dar link-urile către postări nu încep custiri
:www.exemplu.ro/nume-categorie/subcategorie/postname/
Există câteva întrebări similare fără răspuns: Postări care nu apar cu categorybase personalizat și subcategorii și modificări permalink-uri wordpress

Trebuie doar să adaugi "/." după baza categoriei:
Baza categoriei: stiri/.
(/. este necesar pentru a evita erorile 404 pentru articole).
Această soluție a funcționat perfect pentru mine :)
EDIT: Acest câmp va elimina slash-urile de la început sau sfârșit, cu excepția cazului în care includeți "."

M-am întors recent la această problemă și am găsit în sfârșit soluția! Poate funcționa sau nu pentru tine - există două cazuri posibile:
Dacă unele articole pe site-ul tău sunt plasate în categorii părinte și altele - în subcategorii (categorii copil), sau categoriile au niveluri diferite de imbricare (unele categorii părinte au doar subcategorii, iar altele - sub-subcategorii), atunci nu există nicio soluție. Este imposibil să distingi
news/category/post-name/
denews/category/subcategory/
cu regex în regulile de rescriere.Dacă ai un nivel fix de imbricare pentru toate categoriile și postezi doar în subcategoriile de ultim nivel, atunci ai noroc! Există o soluție destul de simplă:
Motivul pentru care apar acele pagini 404 cu news
atât în baza categoriei, cât și în structura personalizată de permalinkuri, este că regula internă de rescriere a bazei categoriei are prioritate față de regulile structurii de permalinkuri. Așadar, news/category/subcategory/postname/
este interpretat ca index.php?category_name=category/subcategory/postname
și, evident, WordPress nu poate găsi o astfel de categorie, returnând pagina 404.
Ceea ce trebuie să faci este să adaugi o nouă regulă de rescriere în partea de sus a listei de reguli. Pune acest cod în functions.php
sau oriunde consideri potrivit:
add_action( 'init', 'wpa58471_category_base' );
function wpa58471_category_base() {
// Nu uita să golești manual regulile o dată după ce ai adăugat acest cod!
add_rewrite_rule(
// Expresia regulată pentru a potrivi URL-ul primit
'news/([^/]+)/([^/]+)/([^/]+)(/[0-9]+)?/?$',
// URL-ul intern rezultat
'index.php?category_name=$matches[1]/$matches[2]&name=$matches[3]&paged=$matches[4]',
// Adaugă regula în partea de sus a listei de rescriere
'top' );
}
și apoi actualizează structura de permalinkuri din pagina de Opțiuni Generale WordPress. Codul de mai sus este pentru imbricare pe două niveluri, dacă ai o structură de categorii cu mai multe sau mai puține niveluri, atunci modifică regex-ul și URL-ul rezultat în consecință.
P.S. mulțumesc contribuitorilor acestor răspunsuri utile: ajutor cu add_rewrite_rule și unealtă pentru analiza regulilor de rescriere.

Deși nu există o soluție folosind regex în regulile de rescriere, încă există o modalitate de a avea această funcționalitate: http://wordpress.stackexchange.com/questions/98083/how-can-you-load-the-categories-page-from-a-hook/98095#98095

Structură personalizată de permalink: /media/%category%/%postname%/
Bază pentru categorii: .
A funcționat pentru mine, WordPress 3.4.1, fără plugin-uri adiționale.
Actualizare: Mai târziu am observat că wp_list_categories
afișează link-uri fără "media" în URL. Dar postările sunt accesibile cu structura dorită de URL, iar arhivele de categorii sunt în locul corect.
Acum investighez modificarea comportamentului funcției wp_list_categories.

Mulțumesc pentru răspuns, dar sunt 2 probleme: nu pot accesa arhivele de categorii (atât cu media
cât și fără, folosind aceeași versiune 3.4.1), iar linkurile generate conțin /./
în adresele lor.

Este ciudat. Cred că ar putea fi 2 motive: 1. Unele dintre plugin-urile tale au efecte secundare. 2. Configurația mea inițială de WordPress este cumva diferită. Folosesc http://qwordpress.ru/ cu upgrade imediat la versiunea curentă de WP. Și în acest caz, primul lucru la care am lucrat a fost structura categoriilor și URL-urile, așa că configurația a fost destul de curată.

Ar fi mai bine să postez un comentariu, dar momentan nu pot. Codul tău funcționează perfect, dar dacă nu vrei să strici fluxurile RSS pe categorii, ar trebui să arate astfel:
add_action( 'init', 'wpa58471_category_base' );
function wpa58471_category_base() {
// Nu uita să resetezi regulile manual o dată după ce ai adăugat acest cod!
add_rewrite_rule(
// Expresia regulată pentru a potrivi URL-ul primit
'news/([^/]+)/([^/]+)/([^/][^f][^e][^e][^d]+)(/[0-9]+)?/?$', //aici modificările mele pentru a exclude 'feed'
// URL-ul intern rezultat
'index.php?category_name=$matches[1]/$matches[2]&name=$matches[3]&paged=$matches[4]',
// Adaugă regula în partea de sus a listei de rescriere
'top' );
}
Oricum, mulțumesc pentru un exemplu de cod grozav. :)
