web-dev-qa-db-fra.com

Comment activer les liens permanents hiérarchiques pour les taxonomies hiérarchiques

Si vous avez une catégorie appelée "terme" et une sous-catégorie appelée "sous-terme", vous pouvez accéder aux publications de sous-termes à/cat/subcat. Mais cela ne fonctionne pas immédiatement avec les taxonomies personnalisées. Ils sont accessibles dans/taxonomy/subterm, mais pas/taxonomy/term/subterm.

Ils en ont déjà parlé dans le Wordpress Trac ( http://core.trac.wordpress.org/ticket/12659 ), et ils ont en quelque sorteregardssolution, mais comme je n’ai jamais utilisé le Trac et que je ne comprends pas bien son langage (diffs, etc.), j’ai besoin de quelqu'un de plus expérimenté pour me dire réellement comment le mettre en œuvre. Y a-t-il du code que je dois coller dans les fichiers principaux de Wordpress? Est-ce déjà implémenté et je peux ajouter quelque chose au functions.php de mon thème?

Si possible, je préférerais ne pas modifier les fichiers de base. Aidez-moi!

1
supertrue

Ceci est implémenté dans WordPress à partir de la version 3.1.

Lorsque vous enregistrez votre taxonomie , assurez-vous de définir rewrite hierarchical sur true, ainsi que sur la taxonomie elle-même:

<?php
register_taxonomy('genre',array('book'), array(
'hierarchical' => true, // this makes it hierarchical in the UI
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'hierarchical' => true ), // this makes hierarchical URLs
));
6
Milo

Pour que les liens permanents hiérarchiques fonctionnent, vous devez ajouter des règles de réécriture. J'ai réussi à assembler du code pour créer un type d'article personnalisé avec une taxonomie personnalisée utilisant des termes parent/enfant reflétés dans des permaliens. Ce n'est pas parfait, mais ça marche!

function keha_add_rewrite_rules() {
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/(.+?)$', 'index.php?taxonomy=$matches[1]&taxonomy=$matches[2]&posttype=$matches[3]', 'top' );
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/$', 'index.php?posttype=$matches[2]', 'top' );
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/(.+?)$', 'index.php?posttype=$matches[3]', 'top' );
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/?$', 'index.php?taxonomy=$matches[2]', 'top' );
        add_rewrite_rule( '^posttype_slug/(.+?)$', 'index.php?taxonomy=$matches[1]', 'top' );
}
add_action('init', 'keha_add_rewrite_rules');

Voir mon exemple de travail à Github:

https://github.com/keha76/WordPress-CPT-Hierarchical-Taxonomy-Permalinks

2
keha76

Existe-t-il un moyen d’ajouter un paramètre à une taxonomie personnalisée déjà enregistrée? Toutes mes taxonomies ont été construites avec un plugin, alors ce serait bien si je pouvais ajouter quelque chose à functions.php qui ajouterait simplement 'rewrite' => array ('hierarchical' => true) à ces taxonomies.

Vous devriez pouvoir utiliser register_taxonomy pour ré-enregistrer la taxonomie que vous souhaitez affecter.

http://core.trac.wordpress.org/browser/tags/3.4.2/wp-includes/taxonomy.php#L305

AVERTISSEMENT: code non testé!
(La plupart du temps, ça me vient à l’esprit. Je n’assume aucune responsabilité pour les sites endommagés.):

function reregister_taxonomy() {
    # the post types that the taxonomy is registered to
    $post_types = array('post');
    # set this to the taxonomy name
    $tax_name = 'TAXONOMY_NAME_TO_CHANGE';
    # load the already created taxonomy as array so we can
    # pass it back in as $args to register_taxonomy
    $tax = (array)get_taxonomy($tax_name);

    if ($tax) {
        # adjust the hierarchical necessities
        $tax['hierarchical'] = true;
        $tax['rewrite']['hierarchical'] = true;

        # adjust the hierarchical niceties (these could be ignored)
        $tax['labels']['parent_item'] = sprintf(__("Parent %s"),
            $tax->labels->singular_name);
        $tax['labels']['parent_item_colon'] = sprintf(__("Parent %s:"),
            $tax->labels->singular_name);

        # cast caps to array as expected by register_taxonomy
        $tax['capabilities'] = (array)$tax['cap'];
        # cast labels to array
        $tax['labels'] = (array)$tax['labels'];
        # register the taxonomy with our new settings
        register_taxonomy($tax_name, array('post'), $tax);
    }
}
# init action with a late priority so other taxonomies are loaded
# alternatively could be done with the `registered_taxonomy` action hook
add_action('init', 'reregister_taxonomy', 9999);

Ce n'est qu'après avoir écrit ceci que je me suis rendu compte que cette question était vieille d'un an et demi, peut-être que quelqu'un la trouvera utile de toute façon.

2
totels

Merci à @anubhava

Petite étude sur WP Rewrite API découvrez la solution.

1) J'ai créé une URL de réécriture personnalisée et l'ai placée dans mon functions.php

function services_rewrite_basic() {
  add_rewrite_rule('^services/.*', 'index.php?page_id=110&level=$matches[1]&level=$matches[1]&level=$matches[1]', 'top');
}
add_action('init', 'services_rewrite_basic');

2) Et enfin, je viens juste de sauvegarder la page de permlink sans aucun changement et ça fait le tour.

0
Fury