J'ai créé une taxonomie de «forum» en utilisant ces règles:
register_taxonomy(
'forum',
array('topic'),
array(
'public' => true,
'name' => _a('Forums'),
'singular_name' => _a('Forum'),
'show_ui' => true,
'show_in_nav_menus' => true,
'hierarchical' => true,
'labels' => array(
'name' => _a('Forums'),
'singular_name' => _a('Forum'),
'search_items' => _a('Search Forums'),
'popular_items' => _a('Popular Forums'),
'all_items' => _a('All Forums'),
'parent_item' => _a('Parent Forum'),
'parent_item_colon' => _a('Parent Forum:'),
'edit_item' => _a('Edit Forum'),
'update_item' => _a('Update Forum'),
'add_new_item' => _a('Add New Forum'),
'new_item_name' => _a('New Forum Name'),
),
'query_var' => true,
'rewrite' => array('slug' => 'forums', 'with_front' => false, 'hierarchical' => true),
)
);
Dans le front-end, les URL ressemblent à:
forums/general-discussion/sub-forum
Comment puis-je supprimer la limace avant ("forums")? Autrement dit, changez les URL en:
general-discussion/sub-forum
Si je passe un argument slug vide à register_taxonomy () cela fonctionne, mais cela provoque des problèmes avec les permaliens du type de message associé à cette taxonomie
custom-post-types
custom-taxonomy
permalinks
onetrickpony
la source
la source
'slug' => 'forums'
blanc simplement le retirer complètement et simplement l'avoir'rewrite' => array('with_front' => false, 'hierarchical' => true)
? Je pense que cela a fonctionné dans le passé pour moi. Assurez-vous également de vider les permaliens.'slug' => ''
fait fonctionner, mais les publications utilisant cette taxonomie génèrent 404%forum%
devrait être un segment de haut niveauRéponses:
MISE À JOUR
Depuis l'écriture, ce noyau WordPress a ajouté le
'do_parse_request'
crochet qui permet au routage d'URL d'être géré avec élégance et sans avoir à étendre laWP
classe. J'ai couvert le sujet en profondeur dans mon exposé WordCamp d'Atlanta 2014 intitulé " Routage d'URL hardcore " ; les diapositives sont disponibles sur le lien.RÉPONSE ORIGINALE
La conception d'URL est importante depuis plus d'une décennie; J'ai même écrit un blog à ce sujet il y a plusieurs années. Et bien que WordPress soit la somme d'un logiciel génial, malheureusement, son système de réécriture d'URL est juste à court de cervelle (à mon humble avis, bien sûr. :) Quoi qu'il en soit, heureux de voir des gens se soucier de la conception d'URL!
La réponse que je vais fournir est un plugin que j'appelle
WP_Extended
qui est une preuve de concept pour cette proposition sur Trac (Notez que la proposition a commencé comme une chose et a évolué en une autre, vous devez donc lire la chose entière pour voir où il était dirigé.)Fondamentalement, l'idée est de sous-
WP
classer la classe, de remplacer laparse_request()
méthode, puis d'affecter la$wp
variable globale avec une instance de la sous-classe. Ensuite, enparse_request()
vous, inspectez réellement le chemin par segment de chemin au lieu d'utiliser une liste d'expressions régulières qui doivent correspondre à l'URL dans leur intégralité.Donc, pour le dire explicitement, cette technique insère une logique devant celle
parse_request()
qui vérifie les correspondances URL-à-RegEx et recherche d'abord des correspondances de termes de taxonomie, mais elle remplace et laisse UNIQUEMENTparse_request()
le reste du système de routage d'URL WordPress intact, y compris et en particulier l'utilisation de la$query_vars
variable.Pour votre cas d'utilisation, cette implémentation compare uniquement les segments de chemin d'URL aux termes de taxonomie, car c'est tout ce dont vous avez besoin. Cette implémentation inspecte les termes de taxonomie respectant les relations de terme parent-enfant et lorsqu'elle trouve une correspondance, elle attribue le chemin URL (moins les barres obliques de début et de fin) à
$wp->query_vars['category_name']
,$wp->query_vars['tag']
ou$wp->query_vars['taxonomy']
&$wp->query_vars['term']
et elle contourne laparse_request()
méthode de laWP
classe.En revanche, si le chemin URL ne correspond pas à un terme d'une taxonomie que vous avez spécifiée, il délègue la logique de routage URL au système de réécriture WordPress en appelant la
parse_request()
méthode de laWP
classe.Pour l'utiliser
WP_Extended
pour votre cas d'utilisation, vous devrez appeler laregister_url_route()
fonction à partir dufunctions.php
fichier de votre thème comme ceci:Voici le code source du plugin:
PS CAVEAT # 1
Bien que pour un site donné, je pense que cette technique fonctionne à merveille mais cette technique ne doit JAMAIS être utilisée pour qu'un plugin soit distribué sur WordPress.org pour que d'autres puissent l'utiliser . S'il est au cœur d'un progiciel basé sur WordPress, cela pourrait être correct. Sinon, cette technique devrait se limiter à améliorer le routage d'URL pour un site spécifique .
Pourquoi? Parce qu'un seul plugin peut utiliser cette technique . Si deux plugins essaient de l'utiliser, ils entreront en conflit.
En aparté, cette stratégie peut être étendue pour gérer de manière générique pratiquement tous les modèles de cas d'utilisation qui pourraient être requis et c'est ce que j'ai l'intention de mettre en œuvre dès que je trouve le temps libre ou un client qui peut parrainer le temps qu'il faudrait pour construire des implémentations entièrement génériques.
CAVEAT # 2
J'ai écrit ceci pour remplacer
parse_request()
ce qui est une très grande fonction, et il est fort possible que j'ai raté une propriété ou deux de l'$wp
objet global que j'aurais dû définir. Donc, si quelque chose agit de manière chancelante, faites le moi savoir et je serai heureux de recherchez-le et révisez la réponse si nécessaire.En tous cas...
la source
'forum'
taxonomie, mais je le réviserai pour fonctionner plus tard dans la'forums'
plutôt que'forum'
? Vous attendez-vous à ce que les URL qui pointent vers ces pages changent (si oui, pas étonnant, mon code ne traite pas de l'impression des URL, mais uniquement du routage des URL.)site/rootforum/
fonctionne, maissite/rootforum/subforum/
ne fonctionne pas (erreur 404) ...Vraiment simple.
Étape 1: arrêtez complètement d'utiliser le paramètre de réécriture. Nous allons lancer vos propres réécritures.
Étape 2: définir des règles de page détaillées. Cela force les pages normales à avoir leurs propres règles au lieu d'être un fourre-tout au bas de la page.
Étape 3: créez des règles de réécriture pour gérer vos cas d'utilisation.
Étape 4: Forcer manuellement les règles de vidage à se produire. Manière la plus simple: allez dans Paramètres-> permalien et cliquez sur le bouton Enregistrer. Je préfère cela à une méthode d'activation de plugin pour mon propre usage, car je peux forcer les règles à vider chaque fois que je change les choses.
Donc, codez l'heure:
N'oubliez pas qu'après avoir ajouté ce code, vous devez l'avoir actif lorsque vous allez vider les règles de permalien (en enregistrant la page sur Paramètres-> Permaliens)!
Après avoir vidé les règles et enregistré dans la base de données, alors / quoi que ce soit devrait aller sur votre page forum = quelle que soit la taxonomie.
La réécriture des règles n'est vraiment pas si difficile si vous comprenez les expressions régulières. J'utilise ce code pour m'aider lors du débogage:
De cette façon, je peux voir les règles actuelles en un coup d'œil sur ma page. N'oubliez pas que compte tenu de n'importe quelle URL, le système commence en haut des règles et les parcourt jusqu'à ce qu'il en trouve une qui correspond. La correspondance est ensuite utilisée pour réécrire la requête dans un ensemble? Key = value plus normal. Ces clés sont analysées dans ce qui se trouve dans l'objet WP_Query. Simple.
Edit: Note latérale, cette méthode ne fonctionnera probablement que si votre structure de publication personnalisée normale commence par quelque chose qui n'est pas un fourre-tout, comme% category% ou quelque chose comme ça. Vous devez le démarrer avec une chaîne statique ou numérique, comme% year%. C'est pour l'empêcher d'attraper votre URL avant qu'elle n'atteigne vos règles.
la source
Vous ne pourrez pas le faire en utilisant WP_Rewrite seul, car il ne peut pas faire la distinction entre les slugs de terme et les post-slugs.
Vous devez également vous connecter à la «demande» et empêcher le 404, en définissant la variable post-requête au lieu de la taxonomie.
Quelque chose comme ça:
Notez que la taxonomie doit être définie avant le type de message.
Ce serait un bon moment pour souligner que le fait d'avoir une taxonomie et un type de publication avec la même requête var est une mauvaise idée.
De plus, vous ne pourrez pas accéder aux publications qui ont le même slug que l'un des termes.
la source
Je jetterais un œil au code du plugin de chats de haut niveau:
http://fortes.com/projects/wordpress/top-level-cats/
Vous pouvez facilement l'adapter afin qu'il recherche votre limace de taxonomie personnalisée en changeant le
sur la ligne 74 à quelque chose comme:
la source
Je suggère de jeter un œil au plugin Custom Post Permalinks . Je n'ai pas le temps de tester pour le moment, mais cela peut vous aider avec votre situation.
la source
%forum%
, c'est exactement ce que j'essaie d'éviter ...Comme je connais bien votre autre question , je vais répondre en gardant cela à l'esprit.
Je n'ai pas testé cela du tout, mais cela pourrait fonctionner si vous l'exécutez une fois juste après avoir enregistré toutes les infrastructures que vous souhaitez .:
Ce que cela fait: il supprime les règles de réécriture générées à partir des rubriques permalien du flux normal du tableau de règles et les fusionne à la fin du tableau. Cela empêche ces règles d'interférer avec d'autres règles de réécriture. Ensuite, il force les règles de réécriture verbeuses (chaque page obtient une règle individuelle avec une expression régulière spécifique). Cela empêche les pages d'interférer avec les règles de votre sujet. Enfin, il exécute un vidage dur (assurez-vous que votre fichier .htaccess est accessible en écriture, sinon cela ne fonctionnera pas) et enregistre le très grand tableau très compliqué de règles de réécriture.
la source
Il existe un plugin pour cela .
Il supprime le slug de type en ajoutant une règle spécifique pour chaque page de type de message personnalisé.
la source
Je ne sais pas si cela fonctionnera pour les taxonomies, mais cela a fonctionné pour les types de publication personnalisés
Bien qu'il n'ait pas été mis à jour depuis 2 ans, le plugin ci-dessous a fonctionné pour moi: http://wordpress.org/plugins/remove-slug-from-custom-post-type/
Pour info, je lance WP
3.9.1
avec WP Types1.5.7
la source
Utiliser une barre oblique comme valeur pour slug ... 100% de travail
la source
page
type de message à 404.