Cum să includ category-base în permalink-ul postării fără eroare 404

14 iul. 2012, 09:29:23
Vizualizări: 17.9K
Voturi: 6

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 cu stiri/ î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 implicit category, 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 partea stiri

  • Dacă setez permalink-urile ca /%category%/%postname%/ și adaug doar baza categoriei stiri, nu apar erori 404, dar link-urile către postări nu încep cu stiri: 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

0
Toate răspunsurile la întrebare 4
0

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

30 mai 2017 02:16:45
1

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:

  1. 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/ de news/category/subcategory/ cu regex în regulile de rescriere.

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

15 sept. 2012 10:28:56
Comentarii

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

Jeremy Jeremy
2 mai 2013 20:09:49
2

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.

22 aug. 2012 08:40:59
Comentarii

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.

semyonfilippov semyonfilippov
23 aug. 2012 09:21:17

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

Leo Eidinov Leo Eidinov
24 aug. 2012 09:55:50
0

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

19 ian. 2015 02:55:02