Mélanger le type de message personnalisé et les structures de réécriture de la taxonomie?

30

Fondamentalement, je veux réaliser un glossaire en utilisant des types de publication personnalisés et avoir des problèmes pour configurer la réécriture comme je le souhaite. Je le veux comme ça:

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

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

L'URL pour un seul terme du glossaire: http://example.com/glossary/a/atomic/

J'ai réussi à le faire en utilisant 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 l'affichage des pages. À l'exception de 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.

Voilà ( functions.phpdans 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');
maryisdead
la source

Réponses:

30

Vous pouvez toujours remplacer le modèle qui sera appelé avec le template_includeou un filtre associé, mais cela peut masquer des problèmes plus profonds avec les 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-termmessages
  • /glossary/[letter]/devrait être une page d'archive pour les publications avec le terme de taxonomie [letter]dans la sumo-glossary-lettertaxonomie
  • /glossary/[letter]/[term-name]/devrait être un sumo-glossary-termposte individuel

Cela signifie que le premier chargera le modèle archive-sumo-glossary-term.php, le second se chargera taxonomy-sumo-glossary-letter.phpet le troisième se 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 la taxonomie, ainsi que le slug de réécriture et le slug d'archivage pour le type de publication, et aucune autre règle de réécriture. De plus, j'ai enregistré la taxonomie en premier et le type de message après, pour m'assurer que les priorités étaient correctes (sinon une URL comme /glossary/f/page/2va au terme du glossaire pageau 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;
}
Jan Fabry
la source
Je vais essayer ça demain et voir si ça fait l'affaire et revenir ici. Merci!
maryisdead
Ok, pas exactement demain… Ça a fonctionné, presque parfaitement! Merci! Ce qui ne fonctionne pas, c'est /glossary/. Me donne un 404 ( archive-sumo-glossary-term.phpest installé). Des idées? Je dois dire que je suis bloqué sur WP 3.0.1 et c'est peut-être un problème de version. Je dois le tester à nouveau lorsque je pourrai mettre à niveau. Quoi qu'il en soit, pour la plupart, cela fonctionne et pour l'instant je n'ai pas nécessairement besoin de /glossary/rediriger vers la lettre A. Merci encore!
maryisdead
hey @maryisdead, j'ai eu exactement le même problème et j'ai trouvé la même solution exacte, mais je me suis retrouvé avec votre même problème exact - comment obtenir / glossaire pour accéder au modèle archive-glossery.php? Je viens de trouver la réponse - utilisez 'has_archive' => 'glossary', au lieu de has_archive => true je viens de remarquer que Jan l'a comme ça dans sa réponse, mais vous ne l'avez pas comme ça dans votre code d'origine - avez-vous mis à jour cette partie? Cela a commencé à fonctionner pour moi dès que j'ai apporté ce changement
Jeff
Salut Jeff! Oui, mis à jour cette partie. Je viens de vérifier à nouveau, ne fonctionne toujours pas. L'installation de WordPress en question n'est pas encore à jour (3.0.1) donc c'est peut-être toujours la racine du problème.
maryisdead
Même problème ici, en utilisant WP 3.2.1. Toujours pas de solution?
Richard B
0

Je ne l'ai pas personnellement utilisé, mais ce que vous voudrez peut-être regarder est "add_rewrite_rule"

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

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

eeMZee
la source
J'utilise en fait add_rewrite_rule, faites simplement défiler mon code vers le bas. :-) Cela fonctionne bien jusqu'à présent, c'est seulement que les mauvais modèles sont appelés avec cette façon de le faire.
maryisdead