Mélanger des structures de type de publication personnalisée et de réécriture de taxonomie?

28

En gros, je souhaite créer un glossaire à l'aide de types d'articles personnalisés et quelques problèmes de configuration de la réécriture, comme je le souhaite. Je le veux comme ça:

L'URL du glossaire principal: http://example.com/glossary/

Termes du glossaire commençant par la lettre A : http://example.com/glossary/a/

L'URL d'un terme de glossaire unique: http://example.com/glossary/a/atomic/

J’ai effectivement réalisé cela en utilisant le code ci-dessous, mais je suis sûr que c’est une façon très délicate de le faire et je sais que cela fonctionne mal quelque part car les mauvais modèles sont appelés lors de la visualisation des pages. Sauf pour enlace , où archive-sumo-glossary-term.php est appelé comme prévu, les deux autres activent simplement index.php dans my thème.

Voilà ( functions.php dans le thème):

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');
    
posée maryisdead 25.06.2011 - 17:03

2 réponses

28

Vous pouvez toujours remplacer le modèle appelé par le filtre template_include ou un filtre associé, mais cela pourrait masquer des problèmes plus graves liés aux archives personnalisées.

Si je comprends bien, vous souhaitez utiliser la structure suivante:

  • /glossary/ devrait être une page d'archive pour tous les sumo-glossary-term posts
  • /glossary/[letter]/ devrait être une page d'archive pour les publications avec le terme de taxonomie [letter] dans la sumo-glossary-letter taxonomie
  • /glossary/[letter]/[term-name]/ devrait être un individu sumo-glossary-term post

Cela signifie que le premier chargera le modèle archive-sumo-glossary-term.php , le second chargera taxonomy-sumo-glossary-letter.php et le troisième chargera single-sumo-glossary-term.php .

J’ai atteint cet objectif dans WordPress 3.2 en définissant explicitement le slug de réécriture de taxonomie, ainsi que le slug de réécriture et le slug d’archive pour le type de publication, et aucune autre règle de réécriture. De plus, j’ai tout d’abord enregistré la taxonomie et le type de publication après, pour vérifier que les priorités étaient correctes (sinon, une URL comme /glossary/f/page/2 renvoie le terme du glossaire page au lieu de la page 2 de la lettre du glossaire 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;
}
    
réponse donnée Jan Fabry 09.07.2011 - 14:43
0

Je n'ai pas personnellement utilisé cela, mais vous voudrez peut-être regarder "add_rewrite_rule"

enlace

N'oubliez pas de sauvegarder les permaliens une fois que vous les avez modifiés.

    
réponse donnée eeMZee 29.06.2011 - 20:57

Lire d'autres questions sur les étiquettes