Permalinks: tipo di post personalizzato -> tassonomia personalizzata -> post

1 ago 2013, 19:16:22
Visualizzazioni: 77K
Voti: 49

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.

2
Commenti

ti segnalo qualcosa che ho dovuto fare prima.. http://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rule-conflict-in-parameters

reikyoushin reikyoushin
1 ago 2013 20:14:18

Domanda brillante, e la risposta accettata di @Milo è così ben fatta che dovrebbe davvero essere nella documentazione ufficiale di Wordpress. Questo è un caso d'uso MOLTO comune per URL corretti.

Khom Nazid Khom Nazid
6 apr 2022 04:36:29
Tutte le risposte alla domanda 1
22
93

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.

1 ago 2013 20:44:32
Commenti

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!

Paul T Paul T
2 ago 2013 08:38:46

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.

Martin Sotirov Martin Sotirov
2 ago 2015 17:23:08

@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%

Atticus Atticus
23 ago 2015 20:47:23

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.

Jay Neely Jay Neely
5 gen 2016 02:14:37

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.

justinavery justinavery
28 set 2016 10:16:31

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

Benn Benn
26 gen 2017 16:22:16

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

Solomon Closson Solomon Closson
22 feb 2017 05:01:39

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.

Luca Reghellin Luca Reghellin
4 ago 2017 08:57:46

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.

Luca Reghellin Luca Reghellin
4 ago 2017 12:07:51

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

Milo Milo
4 ago 2017 12:48:54

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.

Luca Reghellin Luca Reghellin
4 ago 2017 13:01:45

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

Milo Milo
4 ago 2017 16:44:44

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!

trainoasis trainoasis
5 dic 2018 09:05:14

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

Ivan Topić Ivan Topić
27 feb 2019 13:07:35

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

Beee Beee
2 mar 2019 18:39:59

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

W Biggs W Biggs
6 nov 2019 00:04:46

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.

Rebecca Dessonville Rebecca Dessonville
13 nov 2019 17:08:16

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.

Sarah Sarah
8 gen 2020 15:31:35

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

bitkorn bitkorn
12 mag 2020 13:33:27

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

JoLoCo JoLoCo
27 lug 2020 20:40:48

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

Faisal Ashfaq Faisal Ashfaq
11 set 2021 22:35:45

@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' );

EmilyH EmilyH
12 ott 2022 23:24:56
Mostra i restanti 17 commenti