Combinare strutture rewrite di custom post type e tassonomie?

25 giu 2011, 18:03:17
Visualizzazioni: 26.2K
Voti: 32

Fondamentalmente voglio creare un glossario utilizzando i custom post type ma ho alcuni problemi nell'impostare i rewrite nel modo in cui li desidero. Voglio ottenere questo risultato:

L'URL principale del glossario: http://example.com/glossary/

Termini del glossario che iniziano con la lettera A: http://example.com/glossary/a/

L'URL per un singolo termine del glossario: http://example.com/glossary/a/atomic/

In realtà ho ottenuto questo risultato utilizzando il codice qui sotto, ma sono sicuro che sia un modo molto macchinoso per farlo e so che non funziona correttamente da qualche parte poiché vengono richiamati i template sbagliati durante la visualizzazione delle pagine. Ad eccezione di http://example.com/glossary/, dove archive-sumo-glossary-term.php viene richiamato come previsto, gli altri due attivano semplicemente index.php nel mio tema.

Ecco il codice (functions.php nel tema):

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Termini Glossario', 'nome generale tipo post'),
                'singular_name' => _x('Termine Glossario', 'nome singolare tipo post')
                # E così via...
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => true
        )
    );

    register_taxonomy
    (
        'sumo-glossary-letter',
        'sumo-glossary-term',
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Lettere', 'nome generale tassonomia'),
                'singular_name' => _x('Lettera', 'nome singolare tassonomia')
                # E così via...
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => false
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ($post->post_type == 'sumo-glossary-term')
    {
        $permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
    }
    return $permalink;
}

add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');
0
Tutte le risposte alla domanda 2
8
35

Puoi sempre sovrascrivere il template che verrà chiamato con il filtro template_include o un filtro correlato, ma questo potrebbe nascondere problemi più profondi con gli archivi personalizzati.

Come ho capito, vuoi utilizzare la seguente struttura:

  • /glossary/ dovrebbe essere una pagina di archivio per tutti i post di tipo sumo-glossary-term
  • /glossary/[lettera]/ dovrebbe essere una pagina di archivio per i post con il termine di tassonomia [lettera] nella tassonomia sumo-glossary-letter
  • /glossary/[lettera]/[nome-termine]/ dovrebbe essere un singolo post di tipo sumo-glossary-term

Ciò significa che il primo caricherà il template archive-sumo-glossary-term.php, il secondo caricherà taxonomy-sumo-glossary-letter.php e il terzo caricherà single-sumo-glossary-term.php.

Ho ottenuto questo risultato in WordPress 3.2 impostando esplicitamente lo slug di riscrittura della tassonomia, sia lo slug di riscrittura che lo slug dell'archivio per il tipo di post, senza altre regole di riscrittura. Inoltre, ho registrato prima la tassonomia e poi il tipo di post, per assicurarmi che le priorità fossero corrette (altrimenti un URL come /glossary/f/page/2 porta al termine del glossario page invece della pagina 2 della lettera del glossario f).

add_action('init', 'create_glossary');
function create_glossary()
{

    register_taxonomy
    (
        'sumo-glossary-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Lettere', 'nome generale tassonomia'), // Lettere
                'singular_name' => _x('Lettera', 'nome singolare tassonomia') // Lettera
                # E così via...
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Termini del Glossario', 'nome generale tipo di post'), // Termini del Glossario
                'singular_name' => _x('Termine del Glossario', 'nome singolare tipo di post') // Termine del Glossario
                # E così via...
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary/%sumo-glossary-letter%',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => 'glossary',
            'taxonomies' => array( 'sumo-glossary-letter' ),
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
        $glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
        $post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
    }
    return $post_link;
}
9 lug 2011 15:43:12
Commenti

Proverò domani e vedrò se funziona, poi tornerò qui. Grazie!

maryisdead maryisdead
9 lug 2011 19:37:47

Ok, non esattamente domani... Ha funzionato, quasi perfettamente! Grazie!

Quello che non funziona è /glossary/. Mi dà un 404 (archive-sumo-glossary-term.php è configurato). Qualche idea? Devo dire che sono bloccato su WP 3.0.1 e forse è un problema di versione. Dovrò testare di nuovo quando potrò aggiornare.

Comunque, per la maggior parte funziona e per ora non mi serve necessariamente /glossary/ e posso semplicemente reindirizzare alla lettera A. Grazie ancora!

maryisdead maryisdead
16 lug 2011 17:40:44

hey @maryisdead, ho avuto esattamente lo stesso problema e sono arrivato alla tua stessa soluzione, ma mi sono trovato con il tuo stesso problema - come fai a far sì che /glossary utilizzi il template archive-glossery.php? Ho appena trovato la risposta - usa 'has_archive' => 'glossary', invece di has_archive => true

Ho appena notato che Jan lo ha scritto così nella sua risposta, ma tu non lo hai nel tuo codice originale - l'hai aggiornato? Per me ha iniziato a funzionare non appena ho fatto questa modifica

Jeff Jeff
9 feb 2012 02:01:11

Ciao Jeff! Sì, ho aggiornato quella parte. Ho ricontrollato, ma ancora non funziona. L'installazione di WordPress in questione non è ancora aggiornata (3.0.1) quindi forse è ancora quello il problema alla radice.

maryisdead maryisdead
11 feb 2012 15:50:20

Stesso problema qui, uso WP 3.2.1. Ancora nessuna soluzione?

Richard B Richard B
5 mar 2012 17:42:32

Codice ancora rilevante - lo uso ancora come soluzione principale per ottenere questa struttura.

Una domanda: se c'è un post creato a cui non è assegnato alcun termine di tassonomia (quindi l'URL sarebbe tipo customposttypeslug/postslug) - ricevo un errore 404. C'è un modo (probabilmente tramite le regole dei permalink) per far sì che funzioni anche in questo caso?

Gerben van Dijk Gerben van Dijk
27 mag 2014 12:12:52

FUNZIONA PERFETTAMENTE! L'ordine di registrazione della tassonomia e del CPT era la chiave nel mio caso.

FullStack Alex FullStack Alex
19 set 2019 06:50:51

Questo continua a funzionare benissimo. Sto creando post in modo programmatico, e il filtro post_type_link viene attivato quando si usa wp_insert_post(). Ma sono riuscito a risolvere il problema definendo il guid durante l'uso di wp_insert_post().

Daan van den Bergh Daan van den Bergh
2 mar 2025 16:07:32
Mostra i restanti 3 commenti
1

Non l'ho utilizzato personalmente, ma potresti voler dare un'occhiata a "add_rewrite_rule"

http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

inoltre non dimenticare di salvare i permalink una volta che li hai modificati.

29 giu 2011 21:57:41
Commenti

In realtà uso add_rewrite_rule, scorri semplicemente il mio codice fino in fondo. :-) Funziona bene finora, è solo che vengono chiamati i template sbagliati con questo modo di procedere.

maryisdead maryisdead
30 giu 2011 07:25:18