Structura personalizată de permalink duce la eroare 404 la paginare
Am o problemă cu permalink-urile. Pentru informații, există mai multe categorii pe un site și multe articole într-o singură categorie.
Setările mele pentru permalink sunt:
Structură Personalizată: /%category%/%postname%/
Bază pentru Categorii: .
După salvarea acestor setări, URL-ul meu va fi
www.mydomain.com/numele-slug-categorie/
în loc de
www.mydomain.com/categorie/numele-slug-categorie/
Am setat Paginile blogului afișează maxim: 8 articole sub Setări > Citire. Paginarea va apărea când există mai mult de 8 articole pe o pagină de categorie.
Am dat click pe "pagina 2" și am observat că www.mydomain.com/numele-slug-categorie/page/2/
m-a dus la o pagină de eroare 404.
Inițial, URL-ul pentru orice "pagina 2" a unei categorii era www.mydomain.com/categorie/numele-slug-categorie/page/2/
, funcționează corespunzător dacă există "categorie" în URL-ul original. Altfel, apare eroarea 404.
Principala mea preocupare este că nu doresc ca "categorie" să apară în URL. Dar vreau ca numele slug al categoriei să apară în URL când vizualizez un articol selectat. Și "/page/2/" și restul să funcționeze corect.
Sper că această problemă nu va fi rezolvată cu plugin-uri recomandate. Pentru că nu doresc ca site-ul să devină prea greu.
Ce sugestii aveți?

Acesta este un comportament complet normal. Dacă doriți să eliminați baza categoriei (category base), va trebui să scrieți niște reguli personalizate de rescriere, nu reguli simple, trebuie să menționez. Din punctul meu de vedere, eliminarea bazei categoriei necesită un efort suplimentar pentru fiecare cerere care nu merită, deoarece nu oferă niciun avantaj pentru SEO sau pentru o navigare mai bună pe site. Unele pluginuri populare, cum ar fi WordPress SEO de Yoast, au avut această opțiune în trecut și au eliminat-o acum ceva timp. Dar aceasta este doar o părere.
Configurați baza categoriei la .
(punct), puneți acest cod în fișierul functions.php al temei dumneavoastră, sau mai bine într-un plugin, și resetați regulile de rescriere (cod preluat din acest articol de pe Daily Web Kit):
add_filter( 'category_rewrite_rules', 'vipx_filter_category_rewrite_rules' );
function vipx_filter_category_rewrite_rules( $rules ) {
$categories = get_categories( array( 'hide_empty' => false ) );
if ( is_array( $categories ) && ! empty( $categories ) ) {
$slugs = array();
foreach ( $categories as $category ) {
if ( is_object( $category ) && ! is_wp_error( $category ) ) {
if ( 0 == $category->category_parent ) {
$slugs[] = $category->slug;
} else {
$slugs[] = trim( get_category_parents( $category->term_id, false, '/', true ), '/' );
}
}
}
if ( ! empty( $slugs ) ) {
$rules = array();
foreach ( $slugs as $slug ) {
$rules[ '(' . $slug . ')/feed/(feed|rdf|rss|rss2|atom)?/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
$rules[ '(' . $slug . ')/(feed|rdf|rss|rss2|atom)/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
$rules[ '(' . $slug . ')(/page/(\d)+/?)?$' ] = 'index.php?category_name=$matches[1]&paged=$matches[3]';
}
}
}
return $rules;
}

Am făcut conform instrucțiunilor dumneavoastră. Dar, "/page/2" încă nu funcționează. Există vreo altă soluție pentru a o face să funcționeze? Mulțumesc!

Am testat codul înainte de a-l posta și funcționează. Vă rog, așa cum se menționează în răspuns, nu uitați să reîmprospătați regulile de rescriere (după ce copiați și salvați codul, mergeți la settings->permalinks și faceți clic pe "save". Acest lucru va determina WordPress să reconstruiască regulile de rescriere ținând cont de cele noi).

Bună! Am încercat. Codul tău pentru funcție funcționează. Dar, nu pot pune "punct" în baza de categorii și am nevoie să folosesc "301 Redirect" pentru a redirecționa toate "domain.com/category/category-slug-name/" către "domain.com/category/category-slug-name/". Doar "/page/2/" funcționează atunci.

Am testat cu "punctul" în baza categoriei, așa cum vezi în răspuns, de fapt acel punct este necesar. Tu nu ai menționat nicio redirecționare, iar modul în care ai implementat redirecționarea îmi este necunoscut, aceasta este o altă problemă care necesită un alt fir de discuție.

Salut Cybmeta, punctul chiar nu funcționează la mine. E în regulă! Apropo, mulțumesc și pentru ajutorul tău. Voi vota totuși pentru răspunsul tău, deoarece m-ai ajutat. :)

E mai bine dacă găsim soluția ;). Ai spus în întrebare că "punctul" funcționează și nu înțeleg de ce nu funcționează acum; codul postat în răspuns gestionează paginarea și feed-urile, dar nu are nicio legătură cu "punctul". Când spui că nu funcționează, te referi că nu funcționează dacă folosești codul din răspuns sau că nu funcționează chiar și fără acel cod?

Pagina "/page/2/ & mai multe pagini" nu funcționează (redirecționează către 404) dacă introduc "punctul" în câmpul "Bază de categorie" după ce am aplicat codul tău în fișierul meu functions.php. Pagina "/page/2/ & mai multe pagini" funcționează corespunzător după ce am eliminat "punctul" din câmpul "Bază de categorie". Dar, condiția pentru ca acesta să funcționeze este că trebuie să folosesc rescrierea regulii în fișierul meu htaccess pentru a redirecționa "/category/numele-slug-categoriei" către "/numele-slug/".

Ai resetat regulile de rescriere după aplicarea codului?. După cum am spus, codul postat funcționează corect aici. Poate ai mai mult cod care afectează regulile de rescriere a categoriei. Încearcă cu toate pluginurile dezactivate și cu o temă implicită. Apropo, redirecționarea în fișierul htaccess ar trebui făcută doar dacă ești pe un site live care folosea structura veche de URL în trecut pentru a nu pierde poziționarea SEO și a nu pierde utilizatorii care vin de la un URL vechi; realizarea acelei redirecționări pe un site nou este inutilă.

A funcționat conform așteptărilor pentru mine. De asemenea, mulțumesc că ai pus codul direct în răspuns, deoarece linkul către blog nu mai este valid.

Aceasta soluție a funcționat pentru mine, Adaugă această funcție în fișierul functions.php din WordPress și aceasta va modifica URL-ul după cum urmează:
Anterior: http://www.example.com/advice/category/category_name/page/3/
După: http://www.example.com/advice/category_name/page/3/
function remove_category_slug_url($query_string){
if ($query_string['name'] == 'page' && isset($query_string['page'])) {
unset($query_string['name']);
list($delim, $page_index) = explode('/', $query_string['page']);
$query_string['paged'] = $page_index;
}
return $query_string;
}
add_filter('request', 'remove_category_slug_url');

function
remove_category_slug_url($query_string){
if ($query_string['name'] == 'page' && isset($query_string['page'])) {
unset($query_string['name']);
list($delim, $page_index) = explode('/', $query_string['page']);
$query_string['paged'] = $page_index;
}
return $query_string;
}
add_filter('request', 'remove_category_slug_url');
Acest cod a funcționat pentru mine, adaugă acest cod funcție în fișierul functions.php din WordPress
Notă: du-te la Setări->Legături permanente și apasă pe "Salvare". Acest lucru va face ca WordPress să reconstruiască regulile de rescriere ținând cont de cele noi.

Această soluție a funcționat pentru mine.
function remove_page_from_query_string($query_string){
if ($query_string['name'] == 'page' && isset($query_string['page'])) {
unset($query_string['name']);
// 'page' în query_string arată ca '/2', așa că o despart
list($delim, $page_index) = split('/', $query_string['page']);
$query_string['paged'] = $page_index;
}
return $query_string;
}
add_filter('request', 'remove_page_from_query_string');

Pentru oricine mai întâmpină această problemă, cu redirecționările pe paginile paginate, următoarea soluție a funcționat pentru mine:
În structura legăturilor permanente, schimbați: /%category%/%postname%/
în
/%category%/%postname%
Observați eliminarea barei oblice de la sfârșit "/".
Rob
