Struttura permalink personalizzata causa errore 404 sulla paginazione
Ho un problema con i permalink. Per la cronaca, ci sono diverse categorie all'interno di un sito e molti post in una singola categoria.
La mia impostazione dei permalink è:
Struttura personalizzata: /%category%/%postname%/
Base categoria: .
Dopo aver salvato queste impostazioni, il mio URL sarà
www.miodominio.com/slug-categoria/
invece di
www.miodominio.com/categoria/slug-categoria/
Ho impostato Le pagine blog mostrano al massimo: 8 post in Impostazioni > Lettura. La paginazione appare quando ci sono più di 8 post in una pagina di categoria.
Ho cliccato su "pagina 2" e ho notato che www.miodominio.com/slug-categoria/page/2/
mi porta a una pagina di errore 404.
Originariamente, l'URL di qualsiasi "pagina2" di categoria era www.miodominio.com/categoria/slug-categoria/page/2/
, funziona bene se c'è "categoria" nell'URL come URL originale. Altrimenti, sarà una pagina di errore 404.
La mia preoccupazione principale è che non voglio che la categoria compaia nell'URL. Ma voglio che lo slug della categoria appaia nell'URL quando visualizzo il post selezionato. E che "/page/2/" e le successive funzionino correttamente.
Spero che questo problema non venga risolto con plugin consigliati. Perché non voglio che il sito diventi troppo pesante.
Qualche suggerimento?

Questo è un comportamento del tutto normale. Se vuoi rimuovere la base delle categorie, dovrai scrivere alcune regole di riscrittura personalizzate, non semplici peraltro. Dal mio punto di vista, rimuovere la base delle categorie richiede un lavoro extra ad ogni richiesta che non vale la pena perché non offre alcun vantaggio per la SEO o per una migliore navigazione del sito. Alcuni plugin popolari, come WordPress SEO di Yoast, avevano questa opzione in passato e l'hanno rimossa tempo fa. Ma questa è solo un'opinione.
Configura la base delle categorie come .
(punto), inserisci questo codice nel functions.php del tuo tema, o meglio ancora in un plugin, e svuota le regole di riscrittura (codice preso da questo post in 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;
}

Ho fatto come da tue istruzioni. Ma, la "/page/2" ancora non funziona. C'è qualche altra soluzione per farla funzionare? Grazie!

Ho testato il codice prima di pubblicarlo e funziona. Per favore, come detto nella risposta, ricorda di svuotare le regole di riscrittura (dopo aver copiato e salvato il codice, vai su impostazioni->permalink e clicca su "salva". Questo farà sì che WordPress ricostruisca le regole di riscrittura tenendo conto delle nuove).

Ciao! Ho provato. Il tuo codice per la funzione funziona. Ma, non riesco a inserire il "punto" nella base della categoria, e ho bisogno di usare il "Reindirizzamento 301" per reindirizzare tutti gli "domain.com/category/category-slug-name/" a "domain.com/category/category-slug-name/". Solo la "/page/2/" funziona così.

Ho testato con il "punto" nella base della categoria come vedi nella risposta, infatti quel punto è necessario. Non hai parlato di alcun reindirizzamento e il modo in cui hai implementato il reindirizzamento mi è sconosciuto, è un altro problema che necessita di un altro thread.

Ciao Cybmeta, il punto davvero non funziona dalla mia parte. Va bene! Comunque, grazie anche per il tuo aiuto. Voterò comunque per la tua risposta visto che mi hai aiutato. :)

È meglio se troviamo la soluzione ;). Hai detto nella domanda che il "punto" funziona e non capisco perché non funziona adesso; il codice postato nella risposta gestisce l'impaginazione e i feed ma non ha nulla a che fare con il "punto". Quando dici che non funziona, intendi che non funziona se usi il codice della risposta o non funziona anche senza quel codice?

Le "/page/2/ & altre pagine" non funzionano (reindirizzano a 404) se inserisco il "punto" nel campo "Base categoria" dopo aver applicato il tuo codice al mio file functions.php. Le "/page/2/ & altre pagine" funzionano bene dopo aver rimosso il "punto" dal campo "Base categoria". Ma, la condizione per farlo funzionare è che devo usare la regola di riscrittura nel mio file htaccess per reindirizzare da "/category/nome-slug-categoria" a "/nome-slug/".

Hai svuotato le regole di riscrittura dopo aver applicato il codice?. Come ho detto, il codice pubblicato funziona bene qui. Forse hai altro codice che influisce sulle regole di riscrittura delle categorie. Provalo con tutti i plugin disattivati e con un tema predefinito. A proposito, il reindirizzamento nel file htaccess dovrebbe essere fatto solo se sei in un sito live che utilizzava la vecchia struttura URL in passato per non perdere il ranking SEO e per non perdere gli utenti che arrivano da un URL vecchio; fare quel reindirizzamento in un nuovo sito non ha senso.

Ha funzionato come descritto anche per me. Inoltre, grazie per aver inserito il codice direttamente nella tua risposta dato che il link al blog non è più valido.

Questa soluzione ha funzionato per me,
Aggiungi questa funzione nel tuo file functions.php in WordPress e questa funzione cambierà i tuoi link:
Precedente: http://www.example.com/advice/category/category_name/page/3/
In: 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
rimuovi_slug_categoria_url($query_string){
if ($query_string['name'] == 'page' && isset($query_string['page'])) {
unset($query_string['name']);
list($delim, $page_index) = split('/', $query_string['page']);
$query_string['paged'] = $page_index;
}
return $query_string;
}
add_filter('request', 'rimuovi_slug_categoria_url');
Questo codice ha funzionato per me, aggiungi questa funzione al tuo file functions.php in WordPress
Nota: vai in Impostazioni->Permalinks e clicca su "Salva". Questo farà sì che WordPress ricostruisca le regole di riscrittura tenendo conto delle nuove

Questo ha funzionato per me.
function remove_page_from_query_string($query_string){
if ($query_string['name'] == 'page' && isset($query_string['page'])) {
unset($query_string['name']);
// 'page' nella query_string appare come '/2', quindi lo separo
list($delim, $page_index) = split('/', $query_string['page']);
$query_string['paged'] = $page_index;
}
return $query_string;
}
add_filter('request', 'remove_page_from_query_string');
