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.