Includere category-base nel permalink di un post risulta in 404
Ho una pagina frontale statica e una pagina separata /news/
come pagina dei Post. Vorrei che gli URL dei singoli post fossero così:
www.example.com/news/categoryname/subcategory/postname/
e per gli archivi delle categorie:
www.example.com/news/categoryname/
Cosa ho già provato:
Se aggiungo
news
come base delle categorie e/news/%category%/%postname%/
come struttura personalizzata dei permalink, ottengo gli URL desiderati ma anche un errore 404 per i singoli post (sia connews/
nell'URL che senza). Tutte le altre pagine (es. archivi di categoria, pagine ecc.) sono accessibili.Se lascio la base delle categorie vuota e i permalink come
/news/%category%/%postname%/
, non ci sono errori 404, ma gli URL delle categorie includono anche lo slug predefinitocategory
, così:www.example.com/news/category/categoryname/
Se uso plugin per rimuovere la base predefinita delle categorie o imposto semplicemente la base delle categorie a
.
, viene rimossa insieme alla partenews
Se imposto i permalink come
/%category%/%postname%/
e aggiungo solo la base delle categorienews
, non ci sono errori 404, ma i link ai post non iniziano connews
:www.example.com/categoryname/subcategory/postname/
Ci sono alcune domande simili senza risposta: I post non vengono visualizzati con categorybase personalizzato e sottocategorie e modifiche ai permalink di WordPress

Devi solo aggiungere "/." dopo la base della categoria:
Base categoria: news/.
(/. è necessario per evitare errori 404 per gli articoli).
Questa soluzione ha funzionato perfettamente per me :)
MODIFICA: Questo campo rimuoverà gli slash finali o iniziali a meno che non includi il "."

Sono tornato su questo problema recentemente e ho finalmente trovato la soluzione! Potrebbe funzionare o meno per te - ci sono due possibili casi:
Se alcuni articoli sul tuo sito si trovano sotto categorie principali e altri in sottocategorie (categorie figlie), o le categorie hanno diversi livelli di nidificazione (alcune categorie principali hanno solo sottocategorie mentre altre hanno sotto-sottocategorie), allora non esiste una soluzione. È impossibile distinguere
news/categoria/nome-articolo/
danews/categoria/sottocategoria/
con regex nelle regole di riscrittura.Se hai un livello di nidificazione fisso per tutte le categorie e pubblichi articoli solo nelle sottocategorie dell'ultimo livello, allora sei fortunato! Esiste una soluzione piuttosto semplice:
La ragione di quelle pagine 404 con news
sia nella base delle categorie che nella struttura dei permalink personalizzati è che la regola interna di riscrittura della base delle categorie ha la precedenza sulle regole della struttura dei permalink. Quindi news/categoria/sottocategoria/nomearticolo/
viene interpretato come index.php?category_name=categoria/sottocategoria/nomearticolo
e, ovviamente, WordPress non riesce a trovare una tale categoria, restituendo una pagina 404.
Quello che devi fare è aggiungere una nuova regola di riscrittura in cima alla lista delle regole. Inserisci questo codice nel tuo functions.php
o dove ritieni opportuno:
add_action( 'init', 'wpa58471_category_base' );
function wpa58471_category_base() {
// Ricorda di svuotare manualmente le regole una volta dopo aver aggiunto questo codice!
add_rewrite_rule(
// La regex per abbinare l'URL in ingresso
'news/([^/]+)/([^/]+)/([^/]+)(/[0-9]+)?/?$',
// L'URL interno risultante
'index.php?category_name=$matches[1]/$matches[2]&name=$matches[3]&paged=$matches[4]',
// Aggiungi la regola in cima alla lista di riscrittura
'top' );
}
e poi aggiorna la struttura dei permalink dalla pagina delle Opzioni Generali di WordPress. Il codice sopra è per una nidificazione a due livelli, se hai una struttura di categorie con più o meno livelli di nidificazione, modifica di conseguenza la regex e l'URL risultante.
P.S. grazie ai contributori di queste utili risposte: aiuto con add_rewrite_rule e strumento per analizzare le regole di riscrittura.

Sebbene non esista una soluzione che utilizzi le regex nelle regole di riscrittura, c'è comunque un modo per ottenere questa funzionalità: http://wordpress.stackexchange.com/questions/98083/how-can-you-load-the-categories-page-from-a-hook/98095#98095

Struttura personalizzata dei permalink: /media/%category%/%postname%/
Base delle categorie: .
Ha funzionato per me, WordPress 3.4.1, senza alcun plugin correlato.
Aggiornamento: Più tardi ho notato che wp_list_categories
genera link senza "media" nell'URL. Ma i post sono accessibili con la struttura di URL desiderata, e gli archivi delle categorie sono nel posto giusto.
Ora sto cercando di modificare il comportamento di wp_list_categories.

Grazie per la risposta, ma ci sono 2 problemi: non riesco ad accedere agli archivi delle categorie (sia con media
che senza, utilizzando la stessa versione 3.4.1), e i link generati effettivamente contengono /./
nei loro indirizzi.

È strano. Suppongo ci possano essere 2 ragioni: 1. Alcuni dei tuoi plugin hanno effetti collaterali. 2. La mia configurazione iniziale di WordPress è in qualche modo diversa. Sto usando http://qwordpress.ru/ con un aggiornamento immediato all'attuale versione di WP. E in quel caso la prima cosa su cui ho lavorato è stata la struttura delle categorie e gli URL, quindi la configurazione era piuttosto pulita.

Preferirei postare un commento, ma al momento non posso. Il tuo codice funziona perfettamente, ma se non vuoi interrompere i feed RSS per categoria dovrebbe essere così:
add_action( 'init', 'wpa58471_category_base' );
function wpa58471_category_base() {
// Ricorda di svuotare le regole manualmente una volta dopo aver aggiunto questo codice!
add_rewrite_rule(
// L'espressione regolare per abbinare l'URL in entrata
'news/([^/]+)/([^/]+)/([^/][^f][^e][^e][^d]+)(/[0-9]+)?/?$', //qui le mie modifiche per escludere 'feed'
// L'URL interno risultante
'index.php?category_name=$matches[1]/$matches[2]&name=$matches[3]&paged=$matches[4]',
// Aggiungi la regola in cima alla lista di riscrittura
'top' );
}
Comunque, grazie per l'ottimo esempio di codice. :)
