web-dev-qa-db-fra.com

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

Fondamentalement, je souhaite créer un glossaire à l'aide de types de publication personnalisés et rencontrer des problèmes lors de la 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 lettreA: http://example.com/glossary/a/

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

Pour ce faire, j'ai utilisé le code ci-dessous, mais je suis sûr que c'est une façon très maladroite 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 http://example.com/glossary/ , où archive-sumo-glossary-term.php est appelé comme prévu, les deux autres activent simplement index.php dans mon thème.

Voici (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');
30
maryisdead

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

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

  • /glossary/ devrait être une page d'archive pour tous les articles sumo-glossary-term
  • /glossary/[letter]/ devrait être une page d'archive pour les publications avec le terme de taxonomie [letter] dans la taxonomie sumo-glossary-letter
  • /glossary/[letter]/[term-name]/ devrait être un sumo-glossary-term individuel 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 d’article après pour s’assurer que les priorités étaient exactes (sinon, une URL comme /glossary/f/page/2 renvoie le terme glossaire page au lieu de la page 2 de la lettre 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;
}
29
Jan Fabry

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

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

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

0
eeMZee