Mescolando le strutture di riscrittura personalizzate per tipo di posta e tassonomia?


30

Fondamentalmente voglio realizzare un glossario usando tipi di post personalizzati e ho alcuni problemi con la configurazione riscrive come voglio che siano. Lo voglio così:

L'URL del glossario principale: 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à l'ho raggiunto usando il codice qui sotto, ma sono sicuro che sia un modo molto imbarazzante per farlo e so che sta funzionando male da qualche parte poiché vengono visualizzati i modelli sbagliati quando si visualizzano le pagine. Ad eccezione di http://example.com/glossary/ , in cui l'archivio-sumo-glossary-term.php viene chiamato come previsto, gli altri due attivano solo index.php nel mio tema.

Ecco qui ( functions.phpnel tema):

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            '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('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            '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');

Risposte:


30

Puoi sempre sostituire il modello che verrà chiamato con il template_includefiltro o un filtro correlato, ma ciò potrebbe nascondere problemi più profondi con gli archivi personalizzati.

A quanto ho capito, vuoi usare la seguente struttura:

  • /glossary/dovrebbe essere una pagina di archivio per tutti i sumo-glossary-termpost
  • /glossary/[letter]/dovrebbe essere una pagina di archivio per i post con il termine tassonomia [letter]nella sumo-glossary-lettertassonomia
  • /glossary/[letter]/[term-name]/dovrebbe essere un sumo-glossary-termpost individuale

Ciò significa che il primo caricherà il modello archive-sumo-glossary-term.php, il secondo verrà caricato taxonomy-sumo-glossary-letter.phpe il terzo verrà caricato single-sumo-glossary-term.php.

Ho raggiunto questo obiettivo in WordPress 3.2 impostando esplicitamente la lumaca di riscrittura della tassonomia e sia la lumaca di riscrittura che la lumaca di archivio per il tipo di post e nessuna altra regola di riscrittura. Inoltre, ho registrato prima la tassonomia e il tipo di post, per assicurarsi che le priorità fossero giuste (altrimenti un URL come /glossary/f/page/2va al termine del glossario pageanziché alla 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('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            '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;
}

Lo proverò domani e vedrò se fa il trucco e torno qui. Grazie!
Maryisdead,

Ok, non esattamente per domani ... Ha funzionato, quasi perfettamente! Grazie! Ciò che non funziona è /glossary/. Mi dà un 404 ( archive-sumo-glossary-term.phpè impostato). Qualche idea? Devo dire che sono bloccato su WP 3.0.1 ed è forse un problema di versione. Devo testarlo di nuovo quando sono in grado di eseguire l'aggiornamento. Comunque, per la maggior parte funziona e per ora non ho necessariamente bisogno /glossary/e reindirizzare alla lettera A. Grazie ancora!
maryisdead,

hey @maryisdead, ho avuto lo stesso identico problema e ho trovato la stessa identica soluzione, ma mi è rimasto lo stesso identico problema: come si ottiene / glossario per andare al modello archive-glossery.php? Ho appena trovato la risposta - usa 'has_archive' => 'glossary', invece di has_archive => true aver notato Jan nella sua risposta in quel modo, ma tu non ce l'hai nel tuo codice originale - hai aggiornato quella parte? Ha iniziato a funzionare per me non appena ho apportato tale modifica
Jeff

Ehi Jeff! Sì, ho aggiornato quella parte. Ho appena controllato di nuovo, ancora non funziona. L'installazione di WordPress in questione non è ancora aggiornata (3.0.1), quindi forse è ancora la radice del problema.
Maryisdead,

Stesso problema qui, usando WP 3.2.1. Ancora nessuna soluzione?
Richard B

0

Non l'ho usato personalmente, ma quello che potresti voler guardare è "add_rewrite_rule"

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

inoltre, non dimenticare di salvare i permalink dopo averli modificati.


In realtà lo uso add_rewrite_rule, basta scorrere il mio codice verso il basso. :-) Finora funziona bene, è solo che vengono chiamati modelli sbagliati con questo modo di farlo.
maryisdead,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.