Comment créer une structure de lien permanent avec des taxonomies personnalisées et des types de publication personnalisés tels que base-name / parent-tax / child-tax / custom-post-type-name
3 réponses
- votes
-
- 2012-01-23
Après avoir combiné untas demorceaux d'autres réponses,je l'aifaitfonctionner! Voici donc la solutionpour ceux d'entre vous qui sont également auxprises avec ceproblème:
Cemessage et celui-ci m'a aidé,doncgrâce à Cesgars.
Notez quetout ce code,ainsi que votretype depublicationpersonnaliséinitialet votre code d'enregistrement detaxonomie vont dans votrefichier
functions.php
.Commencezparbien définir vos slugs lors de la définition de vostypes depublicationpersonnaliséset de vostaxonomies:pour letype depublicationpersonnalisé,il doit être
basename/%taxonomy_name%
et le slug de votretaxonomie doit être simplementbasename
. N'oubliezpas d'ajouter également'hierarchical' => true
autableau de réécriture detaxonomiepour obtenir destermesimbriqués dans votre URL. Assurez-vous également quequery_var
est défini surtrue
dans les deux cas.Vous devez ajouter unenouvelle règle de réécriturepour que WordPress sache commentinterpréter votre structure d'URL. Dansmon cas,lapartie detype depublicationpersonnalisée de l'URI seratoujours le 5ème segment d'URI,j'ai donc définima règle de correspondanceen conséquence. Notez que vous devrezpeut-être changer cela si vous utilisezplus oumoins de segments d'URI. Si vous avez différentsniveaux determesimbriqués,vous devrez écrire unefonctionpour vérifier si le dernier segment d'URIest untype depublicationpersonnalisé ou unterme detaxonomiepour savoir quelle règle ajouter (demandez-moi si vous avezbesoin d'aide sur ça).
add_filter('rewrite_rules_array', 'mmp_rewrite_rules'); function mmp_rewrite_rules($rules) { $newRules = array(); $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment $newRules['basename/(.+)/?$'] = 'index.php?taxonomy_name=$matches[1]'; return array_merge($newRules, $rules); }
Ensuite,vous devez ajouter ce codepour laisser workpress commentgérer
%taxonomy_name%
dans votre structure de slug de réécriture detype depublicationpersonnalisée:function filter_post_type_link($link, $post) { if ($post->post_type != 'custom_post_type_name') return $link; if ($cats = get_the_terms($post->ID, 'taxonomy_name')) { $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below } return $link; } add_filter('post_type_link', 'filter_post_type_link', 10, 2);
J'ai créé unefonctionpersonnaliséebasée sur lepropre
get_category_parents
de Wordpress:// my own function to do what get_category_parents does for other taxonomies function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) { $chain = ''; $parent = &get_term($id, $taxonomy); if (is_wp_error($parent)) { return $parent; } if ($nicename) $name = $parent -> slug; else $name = $parent -> name; if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) { $visited[] = $parent -> parent; $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited); } if ($link) { // nothing, can't get this working :( } else $chain .= $name . $separator; return $chain; }
Ensuite,vous devez vider vospermaliens (il vous suffit de charger votrepage deparamètres depermaliens).
Maintenant,tout "devrait"fonctionner,espérons-le! Allez créer untas determes detaxonomieet lesimbriquer correctement,puis créez des articlespersonnaliséset classez-les correctement. Vouspouvez également créer unepage avec le slug
basename
,et tout devraitfonctionner commeje l'ai spécifié dansma question. Vouspouvez créer despages d'archives detaxonomiepersonnaliséespour contrôler leur apparenceet ajouter une sorte de widget detaxonomie pour afficher vos catégoriesimbriquées dans labarre latérale.J'espère que cela vous aide!
After combining a bunch of pieces of other answers I got it working! So here's the solution for those of you who are struggling with this too:
This post and this one helped me out some, so thanks to those guys.
Note, all this code, plus your initial custom post type and taxonomy registration code goes in your
functions.php
file.First get your slugs right when defining your custom post types and taxonomies: for the custom post type it should be
basename/%taxonomy_name%
and the slug for your taxonomy should be justbasename
. Don't forget to also add'hierarchical' => true
to the taxonomy rewrite array to get nested terms in your url. Also make surequery_var
is set totrue
in both cases.You need to add a new rewrite rule so WordPress knows how to interpret your url structure. In my case the custom post type part of the uri will always be the 5th uri segment, so I defined my match rule accordingly. Note that you may have to change this if you use more or less uri segments. If you'll have varying levels of nested terms then you'll need to write a function to check whether the the last uri segment is a custom post type or a taxonomy term to know which rule to add (ask me if you need help on that).
add_filter('rewrite_rules_array', 'mmp_rewrite_rules'); function mmp_rewrite_rules($rules) { $newRules = array(); $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment $newRules['basename/(.+)/?$'] = 'index.php?taxonomy_name=$matches[1]'; return array_merge($newRules, $rules); }
Then you need to add this code to let workpress how to handle
%taxonomy_name%
in your custom post type rewrite slug structure:function filter_post_type_link($link, $post) { if ($post->post_type != 'custom_post_type_name') return $link; if ($cats = get_the_terms($post->ID, 'taxonomy_name')) { $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below } return $link; } add_filter('post_type_link', 'filter_post_type_link', 10, 2);
I created a custom function based on Wordpress's own
get_category_parents
:// my own function to do what get_category_parents does for other taxonomies function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) { $chain = ''; $parent = &get_term($id, $taxonomy); if (is_wp_error($parent)) { return $parent; } if ($nicename) $name = $parent -> slug; else $name = $parent -> name; if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) { $visited[] = $parent -> parent; $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited); } if ($link) { // nothing, can't get this working :( } else $chain .= $name . $separator; return $chain; }
Then you need to flush your permalinks (just load your permalinks settings page).
Now everything 'should' work hopefully! Go make a bunch of taxonomy terms and nest them correctly, then make some custom post type posts and categorize them correctly. You can also make a page with the slug
basename
, and everything should work the way I specified in my question. You may want to create some custom taxonomy archive pages to control how they look and add some kind of taxonomy widget plugin to show your nested categories in the sidebar.Hope that helps you!
-
Fixe - voir la question.Jeff,mercipour votreexplication!Maispourrait-il êtrepossiblepour vous depublier lebuildpersonnalisé deposttype/taxonomie?Doncje peux voir ce queje fais [mal] (http://wordpress.stackexchange.com/questions/46994/custom-permalinks-post-type-hierarchical-taxonomys)?Serait vraiment reconnaissant!Fixed- see question. Jeff, thanks for your explanation! But might it be possible for you to post the custom posttype / taxonomy build? So i can see what i am doing [wrong](http://wordpress.stackexchange.com/questions/46994/custom-permalinks-post-type-hierarchical-taxonomys) ? Would be realy thankfull!
- 0
- 2012-03-28
- Reitze Bos
-
Hey Jeff,mercipour votre réponse!J'y suispresque,après 4 heures de combat avec ça.Mon seulproblèmeest quej'obtiens une doublebarre oblique avant lenom dumessage (comme ceci:portfolio/diseno-grafico-2/logo//alquimia-sonora/) Pouvez-vousm'aider?Hey Jeff, thanks for your answer! I'm almost there, after 4 hours fighting with this. My only problem is that I get a double slash before the post name (as this: portfolio/diseno-grafico-2/logo//alquimia-sonora/ ) Can you help me?
- 0
- 2012-04-07
- Cmorales
-
@Cmorales,Vousn'êtespas sûr sans voir votre code,mais cherchez unendroit où vous définissezmanuellement unebarre oblique avant lenom de votremessage,commepeut-être l'enregistrement de slug cpt ou dans lafonctionfilter_post_type?Si vousne pouvezpas localiser où vous ajoutez labarre oblique supplémentaire,vouspouvez simplement supprimer le dernier caractère de la valeur renvoyée de lafonctionget_taxonomy_parents appelée dansfilter_post_type_link,car cela vous laissera avec unebarre oblique defin,quiest lapremière dele double.Bonne chance.@Cmorales, Not sure without seeing your code, but look for a place where you manually define a slash before your post name, like maybe the cpt slug registration or in the filter_post_type function? If you can't track down where you're adding the extra slash then you could just strip the last character from the returned value of the get_taxonomy_parents function called in filter_post_type_link, because that will leave you with a trailing slash, which is the first of the double. Good luck.
- 1
- 2012-04-09
- Jeff
-
J'ai créé lespermaliens comme votreguidemais le lienpar défaut dans wordpresspour letype depublicationpersonnalisé: domain.com/my-post-type/custom-post-type-name (domain.com/place/lotus-hotel) Je viens detester votre code dans lefunction.php,je netrouvepas lemoyen d'ajouter unetaxonomiepersonnalisée au lien ci-dessus (domain.com/place/tokyo/lotus-hotel) -tokyoestmataxonomiepersonnaliséeI created the permalinks like your guide but the default link in wordpress for custom post type: domain.com/my-post-type/custom-post-type-name (domain.com/place/lotus-hotel) I just test your code in the function.php, I can't find the way to add custom taxonomy to above link ( domain.com/place/tokyo/lotus-hotel) - tokyo is my custom taxonomy
-
Mercibeaucouppour cela.Unproblèmemineur cependant,il semblepoluer les règles de réécriture avec untas d'entrées%taxonomy_name% ou dansmon cas: `apps/%primary_tag%/([^/] +)/page/? ([0-9] {1,})/? $]=> Index.php?% Primary_tag% $matches [1] & apps-post=$matches [2] &paged=$matches [3] `Les règles quej'ajoutemanuellement sontprioritaireset semblent lefaireletravail,mais cesentréesimpliquent que quelque chosene vapas.Desidées?Many many many thanks for this. One minor issue though, it seems to polute the rewrite rules with a bunch of %taxonomy_name% entries or in my case: `apps/%primary_tag%/([^/]+)/page/?([0-9]{1,})/?$] => index.php?%primary_tag%$matches[1]&apps-post=$matches[2]&paged=$matches[3]` The rules I add manually take precedence and seem to do the job, but these entries imply something isn't quite right. Any ideas?
- 0
- 2012-05-16
- Hari Karam Singh
-
"Si vous avez différentsniveaux determesimbriqués,vous devrez écrire unefonctionpour vérifier si le dernier segment d'URIest untype depublicationpersonnalisé ou unterme detaxonomiepour savoir quelle règle ajouter (demandez-moi si vous avezbesoin d'aideà ce sujet) ... "Ehbien,pouvez-vousm'aider,s'il vousplaît?:)"If you'll have varying levels of nested terms then you'll need to write a function to check whether the the last uri segment is a custom post type or a taxonomy term to know which rule to add (ask me if you need help on that)..." Well, can you help me, please? :)
- 1
- 2013-05-22
- Cmorales
-
^ c'estexactement ce dontj'avaisbesoin.quelqu'un sait comment lefaire?voirma questionici: http://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rules^ that's exactly what i needed. anybody know how to do it? see my question here: http://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rules
- 2
- 2013-06-07
- reikyoushin
-
Cela abien fonctionné,maispour une raison quelconque,celane tire que la catégorie desparentset aucun desenfants.J'ai copiéexactement comme vous l'avezpubliéet n'ai changémontype depublicationet lesnoms detaxes que là où cela étaitindiqué.Desidées?This worked good, but for some reason it's only pulling the parent category and none of the children. I copied exactly as you posted and only changed my post type and tax names where indicated. Any ideas?
- 0
- 2014-02-12
- paper_robots
-
Je sais que c'est unpeu vieux,mais avez-vous desidées sur lafaçon degarder '/basename'pointé vers les éléments lesplus récents de cetype depublication,quelle que soit lataxonomie?I know this is a little old, but do you have any ideas on how to keep '/basename' pointed towards the most recent items in that post type regardless of taxonomy?
- 0
- 2015-02-04
- Daron Spence
-
- 2012-09-17
Jetez un œil à ceplugin .Ilfournit des URL hiérarchiquespour les catégories,mais vouspouvezfacilement vous adapter àn'importe quelletaxonomie.
La création de la règle suit une fonction récursive .
Take a look at this plugin. It provides hierarchical URLs for categories, but you can easily adapt to any taxonomy.
The rule creation follows a recursive function.
-
Cepluginn'estplus disponible.This plugin no longer is available.
- 2
- 2018-12-05
- Enkode
-
- 2020-05-03
Pourgérer différentsniveaux d'imbrication,
/basename/top-cat/ -> Top Cat Archive /basename/top-cat/post-name/ -> Post in Top Cat /basename/top-cat/child-cat/ -> Child Cat Archive /basename/top-cat/child-cat/post-name/ -> Post in Child Cat
J'aifini par utiliser la solution de Jeff sans lefiltre
rewrite_rules_array
. Au lieu de cela,j'ai utilisé lefiltrerequest
pour vérifier si la dernièrepartie de l'urlest unpostname valideet l'ajouter à query_vars.parexemple.
function vk_query_vars($qvars){ if(is_admin()) return $qvars; $custom_taxonomy = 'product_category'; if(array_key_exists($custom_taxonomy, $qvars)){ $custom_post_type = 'product'; $pathParts = explode('/', $qvars[$custom_taxonomy]); $numParts = sizeof($pathParts); $lastPart = array_pop($pathParts); $post = get_page_by_path($lastPart, OBJECT, $custom_post_type); if( $post && !is_wp_error($post) ){ $qvars['p'] = $post->ID; $qvars['post_type'] = $custom_post_type; } } return $qvars; } add_filter('request', 'vk_query_vars');
For dealing with varying level of nesting,
/basename/top-cat/ -> Top Cat Archive /basename/top-cat/post-name/ -> Post in Top Cat /basename/top-cat/child-cat/ -> Child Cat Archive /basename/top-cat/child-cat/post-name/ -> Post in Child Cat
I ended up using Jeff's solution without the
rewrite_rules_array
filter. Instead I used therequest
filter to check if the last url part is a valid postname and add it to the query_vars.eg.
function vk_query_vars($qvars){ if(is_admin()) return $qvars; $custom_taxonomy = 'product_category'; if(array_key_exists($custom_taxonomy, $qvars)){ $custom_post_type = 'product'; $pathParts = explode('/', $qvars[$custom_taxonomy]); $numParts = sizeof($pathParts); $lastPart = array_pop($pathParts); $post = get_page_by_path($lastPart, OBJECT, $custom_post_type); if( $post && !is_wp_error($post) ){ $qvars['p'] = $post->ID; $qvars['post_type'] = $custom_post_type; } } return $qvars; } add_filter('request', 'vk_query_vars');
J'aipassé aupeigne fin ce siteet Googlepour la réponseet je suis venu complètement vide. Engros,je veuxfaireexactement ce que cemessage demande,maisj'aibesoin unetaxonomie hiérarchique. La réponse donnée dans cet articlefonctionnetrèsbien,mais uniquement avec unetaxonomie à un seulniveau. Est-ilpossible defaire ce queje veux? J'aiessayé unmillion de choses,mais aucunene fonctionne,aumieux,je peux obtenir lesbonspermaliens,maisils arrivent 404.
Pourillustrer visuellement ce queje veux:
Vouspouvez lefaire correctement avec les articleset les catégoriesintégrés,comment lefaire avec destaxonomieset destypes demessagespersonnalisés? Je sais que vous devez utiliser
'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),
pour obtenir des slugs hiérarchiques,ce quifonctionnebien sur lespages d'archives,mais le lesmessages detype depublicationpersonnalisé apparaissent 404. Sije supprime le'hierarchical' => true
partie alors lesmessagesfonctionnent,maisje perds les URL hiérarchiques (seulement/basename/petitchild-cat/post-name/works).Alors,des solutions? Mercibeaucoup,celame rend dingue depuisenviron 3 semainesmaintenant.