Permalinks: tipo di post personalizzato -> tassonomia personalizzata -> post
Sto avendo difficoltà a lavorare con le regole di riscrittura di WordPress e avrei bisogno di aiuto.
Ho un tipo di post personalizzato chiamato _shows_
.
Tutti gli shows hanno una singola categoria di tassonomia personalizzata _show-category_
. Un _show_
non avrà mai più di una _show-category_
.
Vorrei che i miei URL venissero instradati in questo modo:
www.mysite.com/shows/ => archive-shows.php
www.mysite.com/shows/%category%/ => taxonomy-show-category.php
www.mysite.com/shows/%category%/%postname%/ => single-shows.php
Quindi, come esempio reale, supponiamo di avere una _show-category_
"Foo" e un post _show_
intitolato "Bar" che ha "Foo" come sua _show-category_
. Mi aspetto che la mia applicazione WordPress si presenti così:
www.mysite.com/shows/foo/ => mostra tutti i post sotto la categoria foo
www.mysite.com/shows/foo/bar => mostra il post individuale
Cerco di evitare i plugin quando possibile, ma sono aperto a qualsiasi soluzione.
Prima di tutto, registra la tua tassonomia e imposta l'argomento slug
di rewrite
a shows
:
register_taxonomy(
'show_category',
'show',
array(
'rewrite' => array( 'slug' => 'shows', 'with_front' => false ),
// altri tuoi argomenti...
)
);
Successivamente, registra il tuo tipo di contenuto e imposta lo slug a shows/%show_category%
, e imposta l'argomento has_archive
a shows
:
register_post_type(
'show',
array(
'rewrite' => array( 'slug' => 'shows/%show_category%', 'with_front' => false ),
'has_archive' => 'shows',
// altri tuoi argomenti...
)
);
Infine, aggiungi un filtro a post_type_link
per sostituire la categoria dello show nei permalink dei singoli show:
function wpa_show_permalinks( $post_link, $post ){
if ( is_object( $post ) && $post->post_type == 'show' ){
$terms = wp_get_object_terms( $post->ID, 'show_category' );
if( $terms ){
return str_replace( '%show_category%' , $terms[0]->slug , $post_link );
}
}
return $post_link;
}
add_filter( 'post_type_link', 'wpa_show_permalinks', 1, 2 );
MODIFICA
Mi ero dimenticato l'argomento has_archive
di register_post_type
sopra, che dovrebbe essere impostato a shows
.

Milo, grazie mille! Il filtro post_type_link era il pezzo mancante per me. Chiunque stia leggendo questo thread con lo stesso problema, l'unica cosa da notare è che c'è un piccolo errore nella funzione wpa_show_permalinks, dove $post->post_type == 'show' dovrebbe essere invece 'shows'. Grazie ancora Milo!

Grazie, Milo! Questo ha risolto il mio problema. Stavo provando a ottenere qualcosa di simile usando questo plugin e gli URL riscritti restituivano errore 404. Immagino che farlo manualmente fosse la strada giusta.

@milo, arrivando da http://wordpress.stackexchange.com/questions/199456/custom-taxonomy-post-slug-permalink, continuo a ottenere un 404
con questo approccio. La mia struttura dei permalink è %category%/%postname%

Se stai apportando una modifica a un'istanza WordPress esistente, assicurati di andare su Impostazioni > Permalink e cliccare su salva. Le modifiche apportate nel file functions.php non avranno effetto finché non lo farai.

Questo metodo ha quasi funzionato nel mio caso, nel senso che la tassonomia viene visualizzata sulla pagina del post type, l'URL /post_type/taxonomy/ è una pagina legittima (precedentemente dava 404) ma il mio /post_type/taxonomy/post restituisce errore 404. Ho notato che durante la registrazione della tassonomia sopra venivano registrati sia "show_category" che "show", anche se solo show_category è la tassonomia. Io sto registrando solo la tassonomia.

@Milo c'è un modo per far funzionare questo con sotto-sotto-tassonomie come shows/tax/subtax/post ?

Anch'io sarei interessato a sapere come far funzionare questo con le tassonomie figlie come /shows/tax/subtax/postname

Questa è una tecnica davvero utile, grazie. C'è però un piccolo problema: utilizzando 'post_type_link', il pulsante modifica/modifica nella vista di modifica del post in admin, scomparirà. Significa che lo slug del post non sarà modificabile, e quindi, quello slug sarà fissato e se cambierai il post_title successivamente, non sarai in grado di rifletterlo sullo slug.

Come (internamente) 'shows/%show_category%' si risolve automaticamente nella tassonomia/termine corretta? Sono solo curioso. La documentazione ufficiale di register_post_type non spiega, né fornisce alcuna informazione e invece lascia credere che possiamo passare solo stringhe regolari invece di strutture di permalink complete. Inoltre, non riesco a trovare alcuna documentazione sulla generazione automatica di tag di permastruttura alla creazione di una tassonomia.

@Stratboy Dovrò provare di nuovo, non ricordo che lo slug del post non fosse modificabile in questo caso. So che con strutture più complesse ho dovuto usare add_permastruct
invece. WP non fa nulla con %show_category%
in questo caso, è solo un segnaposto che devi sostituire tu stesso nel filtro post_type_link
. Questo può essere in realtà qualsiasi tag di rewrite valido, ad esempio se vuoi usare un campo personalizzato o qualcos'altro nell'URL.

Infatti, se dai un'occhiata a $wp_rewrite subito dopo la registrazione dei post type ma prima del filtro post_type_link
, noterai che il tag %show_category% è stato generato, così come le relative permastrutture. Quindi è strano, esistono, quindi vengono riconosciuti ma probabilmente WordPress non sa come trattarli.

@stratboy show_category deve essere un tag di rewrite valido, e lo è, perché è stato aggiunto come parte della registrazione della tassonomia, ma può anche essere semplicemente uno aggiunto tramite add_rewrite_tag. Fa la stessa cosa dietro le quinte.

Cosa succede quando hai bisogno di uno slug diverso in varie lingue? (Ad esempio con WPML). E quando alcuni post non hanno una categoria impostata, avranno comunque solo /shows/nome-post? Grazie!

Nel caso di WPML questo funziona per la lingua predefinita ma purtroppo non per le altre

Avrei tanto voluto che funzionasse anche per me ma ogni singolo post finisce in un errore 404...

Purtroppo anche per me questo risulta in errori 404... anche dopo aver aggiornato i permalink.

Anche con WordPress 5.2.4 e WordPress 5.3 questa soluzione ha generato errori 404. Ho pubblicato una domanda nel forum di supporto di WP chiedendo se qualcun altro avesse informazioni su cosa sia cambiato nei rewrite negli ultimi anni che potrebbe aver interrotto questa funzionalità.
Attualmente sto usando un plugin per gestire la struttura dei permalink e sembra che il plugin stia facendo qualche analisi wp_query per far funzionare correttamente i permalink.

Anch'io ho avuto lo stesso problema di 404 sulle pagine dei singoli post show come segnalato da altri utenti, ma sono riuscito a risolverlo aggiungendo add_rewrite_rule( 'shows/([^/]+)/([^/]+)', 'index.php?show =$matches[2]', 'top' );
alle mie funzioni. Questo farà corrispondere la seconda parte dello slug dopo 'show' al nome del post show.

La soluzione di Milo quasi funziona. Sfortunatamente, il tipo di post viene perso e viene utilizzato il template predefinito invece del CPT.

Questo quasi ha funzionato per me - la pagina principale del tipo di post e le pagine delle categorie funzionavano bene, ma falliva sui post! (WP pensava che il post fosse una sottocategoria e restituiva un 404.) Il passaggio mancante era il filtro rewrite_rules_array
, come descritto qui: https://stackoverflow.com/a/23702560/915762

C'è un inconveniente: non puoi avere gli stessi slug per diverse tassonomie, ad esempio /post-type/taxonomy-1/seo-agency/
e /post-type/taxonomy-2/seo-agency/
non saranno possibili

@Sarah ODDIO sei la mia SALVATRICE! Ora funziona, finalmente ODDIO! Grazie grazie! Avevo un caso d'uso molto simile in cui avevo un post type "resource" con la tassonomia "resource_category". Le pagine della tassonomia funzionavano e l'archivio funzionava, ma le singole no. Questo ha funzionato: add_rewrite_rule( '^resources/([^/]+)/([^/]+)', 'index.php?resource=$matches[2]', 'top' );
