Come modificare la struttura dei permalink per i custom post type e le relative tassonomie?
Questo è un repost di una domanda precedente, ma vorrei entrare più nei dettagli ora per poter risolvere completamente il problema.
Dunque, con i post (normali) modificare il permalink è semplice come andare in Impostazioni > Permalink e cambiarlo come si preferisce, ad esempio usando il diffuso %category%/%postname%.html
. Questo funziona. Se solo fosse altrettanto facile per i custom post type e le relative tassonomie.
Ecco cosa vorrei ottenere:
- http://mywordpress.com/portfolio.html - Mostra tutti i post in tutte le categorie.
- http://mywordpress.com/portfolio/music/ - Mostra tutti i post in questa categoria.
- http://mywordpress.com/portfolio/music/trance/ - Mostra tutti i post in questa categoria (figlia).
- http://mywordpress.com/portfolio/music/trance/Tiesto.html - Mostra il post.
Ecco cosa ho fatto finora:
- Prima ho creato un
custom_post_type
chiamato project e unataxonomy
project_category. - Ho creato una pagina Portfolio e le ho assegnato un Template di Pagina che elencherà tutti i post con
post_type = project
. Come posso aggiungere .html al permalink delle pagine? Ora il link è http://mywordpress.com/portfolio mentre voglio http://mywordpress.com/portfolio.html. Questo dovrebbe risolvere il primo problema. - Poi le cose si complicano, perché non sappiamo in anticipo quante sottocategorie ci saranno, forse non ce ne saranno affatto. Quindi la struttura che cerchiamo è
portfolio/(PERCORSO CATEGORIA DALLA PRINCIPALE ALLA FIGLIA)/post.html
. Sono ancora bloccato a questo punto. Penso che dovrei in qualche modo ottenere l'ultima categoria aggiunta al percorso e passarla alla project_category, che dovrebbe portare a un file taxonomy.php dove posso elaborarla correttamente. - Non ho affrontato neanche questo, ma dovrebbe avere a che fare con
%postname%.html
alla fine di qualcosa.
Spero che il mio problema sia chiaro e che ci siano sviluppatori coraggiosi che mi aiuteranno a risolvere questo problema che mi ha già tenuto occupato per QUATTRO giorni interi!

Ok, penso di poter avere una soluzione. Non ho idea se questo sia il modo giusto per ottenere questo risultato, ma per ora è l'unica cosa che sembra funzionare.
add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules = array();
$newRules['portfolio/(.+)/(.+?).html$'] = 'index.php?project=$matches[2]';
$newRules['portfolio/(.+)/?$'] = 'index.php?project_category=$matches[1]';
return array_merge($newRules, $rules);
}
add_filter('request', 'mmp_rewrite_request');
function mmp_rewrite_request($vars) {
if (isset($vars['project_category'])) {
if (strpos($vars['project_category'], '/') !== false) {
$categories = explode('/', $vars['project_category']);
$vars['project_category'] = $categories[count($categories) - 1];
}
}
return $vars;
}

Il filtro di richiesta è un buon modo per filtrare se stiamo chiedendo una categoria (un termine in realtà) e un articolo. Permette di aggiungere solo una regola di riscrittura e ottenere la pagina dell'articolo indipendentemente dal fatto che l'articolo sia in una categoria, una sottocategoria o non lo sia affatto.

Dopo averci sbattuto la testa per ore, ho trovato questo plugin molto utile.
https://wordpress.org/plugins/custom-post-type-permalinks/
Di seguito lo screenshot delle opzioni che offre.

2 Metodi Differenti:
*Vedi le note in fondo a questo post.
ad esempio, vuoi avere una struttura di permalink come questa:
/CATEGORIA_PRINCIPALE/SOTTOCAT_2/Un_altra_SOTTOCAT/mio-articolo
Innanzitutto, potresti dover impostare i permalink su /%category%/%postname%. Poi...
METODO 1:
crea categorie STANDARD (CATEGORIA_PRINCIPALE
, SOTTOCAT_1
, ecc..
), e registra il CUSTOM POST, includendo questo parametro:
'taxonomies' => array('category'..)
e usa questi codici per modificare i permalink: https://wordpress.stackexchange.com/a/195643/33667
Poi, dopo aver pubblicato un CUSTOM POST (se associato a una categoria), l'URL sarà:
esempio.com/CATEGORIA_PRINCIPALE/SOTTOCAT_1/mio-articolo
METODO 2:
(p.s. questo metodo non è consigliato se prevedi di pubblicare centinaia o migliaia di articoli)
registra il CUSTOM POST (chiamato CATEGORIA_PRINCIPALE
), includendo questi parametri:
"supports" => array('page-attributes'......
"hierarchical" => true,
poi, pubblica i custom post in questo modo:
(cioè pubblica diversi custom post, chiamati SOTTOCAT_2, SOTTOCAT_1..
. Successivamente, quando pubblichi un altro post, scegli SOTTOCAT_2
come genitore.
p.s.
1) Se sei un principiante, rivedi: Registrare un CUSTOM POST e Registrare un CUSTOM POST con TASSONOMIA
2) se avrai bisogno di funzionalità di ricerca per i livelli secondari, allora usa una query di ricerca personalizzata
