Includere category-base nel permalink di un post risulta in 404

14 lug 2012, 09:29:23
Visualizzazioni: 17.9K
Voti: 6

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 con news/ 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 predefinito category, 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 parte news

  • Se imposto i permalink come /%category%/%postname%/ e aggiungo solo la base delle categorie news, non ci sono errori 404, ma i link ai post non iniziano con news: 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

0
Tutte le risposte alla domanda 4
0

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

30 mag 2017 02:16:45
1

Sono tornato su questo problema recentemente e ho finalmente trovato la soluzione! Potrebbe funzionare o meno per te - ci sono due possibili casi:

  1. 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/ da news/categoria/sottocategoria/ con regex nelle regole di riscrittura.

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

15 set 2012 10:28:56
Commenti

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

Jeremy Jeremy
2 mag 2013 20:09:49
2

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.

22 ago 2012 08:40:59
Commenti

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.

semyonfilippov semyonfilippov
23 ago 2012 09:21:17

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

Leo Eidinov Leo Eidinov
24 ago 2012 09:55:50
0

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

19 gen 2015 02:55:02