Redéclarer / modifier le slug du type de publication personnalisé d'un plugin
-
-
Je viens de résoudre cemêmeproblèmeen me connectant àinit avec unepriorité de 20,puisen appelant ànouveau register_post_typepour lemêmetype depublication.Quelqu'un sait si cela vame causer desennuis sur la route?I just solved this same issue by hooking into init with a priority of 20 and then calling register_post_type again for the same post type. Anyone know if this is going to cause me any trouble down the road?
- 0
- 2013-04-12
- Dustin
-
2 réponses
- votes
-
- 2012-02-13
Oui,c'estpossible,mais si leplugin crée untype depublicationpersonnalisé à l'aide de
rewrite=> array ('slug'=> 'post_type')
,alorsilestpeuprobable que vouspuissiez remplacer le slug.Chaquefois que destypes depublicationpersonnalisés sont créés,des règles de réécriture d'URL sont écrites dans labase de données. Enfonction de l'action qui déclenche la création dutype depublicationpersonnalisé (comme l'action init ),WordPress videra le réécrire les règleset restaurer les slugs dutype depublicationpersonnalisé,quelles que soient lesmodifications que vousessayez d'apporter.
Cela dit,vouspouvezfournir des slugspersonnaliséspour lestypes d'articlespersonnalisés. L'exemple suivant suppose que vous avez untype depublicationpersonnalisé de
films
et que vousessayez de changer le slug/movies/
en/films/
.Pour être complet,voici lafonction debase utiliséepour définir letype depublicationpersonnalisé
films
. Leplugin que vous référencez devraitfaire quelque chose comme ceci:functionmovies_register_post_type () { register_post_type ( 'films', tableau ( 'labels'=>tableau ( 'nom'=> __('Films'), 'singular_name'=> __('Film') ), 'public'=> vrai, 'has_archive'=> vrai, 'réécrire'=>tableau ( 'slug'=> 'films' ) ) ); }//fin deexample_register_post_type add_action ('init','movies_register_post_type');
Vouspouvezmodifier letableau des optionsen fournissant vospropres règlespersonnaliséesbasées sur letype depublicationexistant.
Engros,nous allonsfaire ceci:
- Prenez l'ensemble de règlesexistant,puis écrivez lesnôtres avecnospropres slugspersonnalisés
- Donner à lanouvelle règle uneprioritéplus élevée que le slug dutype depublicationpersonnalisé
Voici commentprocéder:
function add_custom_rewrite_rule () { //Tout d'abord,essayez de charger les règles de réécriture. Onfait çajuste au cas où //la structure depermalienpar défautest utilisée. if (($ current_rules=get_option ('rewrite_rules'))) { //Ensuite,parcourez chaque règlepersonnaliséeen ajoutant unenouvelle règle //qui remplace "films"par "films"et lui donne une valeur supérieure //priorité à la règleexistante. foreach ($ current_rules as $ key=> $ val) { if (strpos ($ key,'movies')!==false) { add_rewrite_rule (str_ireplace ('films','films',$ clé),$ val,'top'); }//fin si }//fin pour chaque }//fin si/sinon //...et on vide les règles flush_rewrite_rules (); }//fin add_custom_rewrite_rule add_action ('init','add_custom_rewrite_rule');
Àprésent,vous aurez deuxfaçons d'accéder à vosfilms:
/films/Back-To-The-Future
/films/Back-To-The-Future
Notez queje ne recommandepas d'accrocher le
add_custom_rewrite_rule
à l'actioninit
caril se déclencheratropfréquemment. C'estjuste unexemple. Unmeilleurendroitpour appliquer lafonction serait l'activation duthème,l'activation duplugin,peut-être l'action save_post,etc. Enfonction de ce que vous devezfaire,vousn'aurezpeut-êtrebesoin de le déclencher qu'une ou quelquesfois.À ce stade,vouspouvezenvisager demettre àjour lespermalienspour letype depublicationpersonnalisé afin d'utiliser le slug '
/movies/
. Parexemple,si vous accédez à/films/
,vous verrez une liste detous vosfilms,mais le survol dutitre révélera que le slug/movies/
esttoujoursen cours utilisé.Pour allerplus loin,vouspouveztechniquementinstaller une redirection 301pour attrapertous les liens vers
/movies/
pour rediriger vers leur homologue/films/
,maistout cela dépend de ce que vousessayez defaire.Yes, this is possible, but if the plugin is creating a custom post type using the
rewrite => array('slug' => 'post_type')
parameter, then it's not likely that you're going to be able to replace the slug.Whenever custom post types are created, URL rewrite rules are written to the database. Depending on which action triggers the creation of the custom post type (such as the init action), WordPress will flush the rewrite rules and restore the custom post type's slugs regardless of what changes you attempt to make.
That said, you can provide custom slugs for the custom post types. The following example assumes that you have a custom post type of
movies
and that you're attempting to change the/movies/
slug to/films/
.To be complete, here's the basic function used to define the
movies
custom post type. The plugin that you're referencing should be doing something like this:function movies_register_post_type() { register_post_type( 'movies', array( 'labels' => array( 'name' => __('Movies'), 'singular_name' => __('Movie') ), 'public' => true, 'has_archive' => true, 'rewrite' => array( 'slug' => 'movies' ) ) ); } // end example_register_post_type add_action('init', 'movies_register_post_type');
You can modify the options table by providing your own custom rules based on the existing post type.
Basically, we'll do this:
- Take the existing set of rules and then write our own with our own custom slugs
- Give the new rule a higher priority than the custom post type's slug
Here's how you can do this:
function add_custom_rewrite_rule() { // First, try to load up the rewrite rules. We do this just in case // the default permalink structure is being used. if( ($current_rules = get_option('rewrite_rules')) ) { // Next, iterate through each custom rule adding a new rule // that replaces 'movies' with 'films' and give it a higher // priority than the existing rule. foreach($current_rules as $key => $val) { if(strpos($key, 'movies') !== false) { add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top'); } // end if } // end foreach } // end if/else // ...and we flush the rules flush_rewrite_rules(); } // end add_custom_rewrite_rule add_action('init', 'add_custom_rewrite_rule');
Now, you'll have two ways to access your movies:
/movies/Back-To-The-Future
/films/Back-To-The-Future
Note that I don't recommend hooking the
add_custom_rewrite_rule
into theinit
action as it will fire too frequently. This is just an example. A better place to apply the function would be on theme activation, plugin activate, perhaps the save_post action, etc. Depending on what you need to do, you may only need to fire it once or just a few times.At this point, you may want to consider updating the permalinks for the custom post type to use the '
/movies/
slug. For example, if you navigate to/films/
, you will see a listing of all your movies but hovering over the title will reveal that the/movies/
slug is still being used.To go one step further, you could technically instate a 301 redirect to catch all links to
/movies/
to redirect to their/films/
counterpart, but this all depends on what you're attempting to do.-
Abien fonctionné!Pourriez-vous égalementm'indiquer labonne directionpourmettre àjour lespermaliens?Worked beautifully! Could you also point me in the right direction for updating the permalinks?
- 0
- 2012-02-13
- Edbury
-
Enfonction de votrethème,vouspouvez lefaire auniveau dumodèle.Lorsque vous voyez l'appel à 'the_title ()',vouspouvez le remplacerpar $title=get_the_title (),puis remplacer la chaîne '/movies/' dans $titlepar '/films/'.Depending on your theme, you can do this at the template level. When you see the call to 'the_title()', you can replace that with $title = get_the_title(), then string replace '/movies/' in $title with '/films/'.
- 1
- 2012-02-14
- Tom
-
Quefaire si le slug que vous souhaitezmodifierest créé dynamiquementpar uneméta valeur de lapublication actuelle?Je doispouvoir utiliser `$post` dans lafonction` add_custom_rewrite_rule () `mais celagénère deserreurs dans WP Adminen disant" Essayer d'obtenir lapropriété d'unnon-objet ".Commentpuis-je obtenir $postpour obtenir la valeurméta?What if the slug you want to change to is dynamically created by a meta value of the current post? I need to be able to use `$post` in the `add_custom_rewrite_rule()` function but it's throwing errors in WP Admin saying 'Trying to get property of non-object'. How can I get $post to get the meta value?
- 0
- 2018-01-17
- Lee
-
- 2017-12-23
Ce code abien fonctionnépourmonthèmeenfant.Nécessaire de changer le slug "programme"en "place".
/* CHANGE SLUGS OF CUSTOM POST TYPES */ function change_post_types_slug( $args, $post_type ) { /*item post type slug*/ if ( 'program' === $post_type ) { $args['rewrite']['slug'] = 'place'; } return $args; } add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 ); /* CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages */ function change_taxonomies_slug( $args, $taxonomy ) { /*item category*/ if ( 'program-category' === $taxonomy ) { $args['rewrite']['slug'] = 'locations'; } return $args; } add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );
This code worked well for my child theme. Needed to change "program" slug to "place".
/* CHANGE SLUGS OF CUSTOM POST TYPES */ function change_post_types_slug( $args, $post_type ) { /*item post type slug*/ if ( 'program' === $post_type ) { $args['rewrite']['slug'] = 'place'; } return $args; } add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 ); /* CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages */ function change_taxonomies_slug( $args, $taxonomy ) { /*item category*/ if ( 'program-category' === $taxonomy ) { $args['rewrite']['slug'] = 'locations'; } return $args; } add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );
-
Celafonctionneparfaitement,je l'ai également utilisépour lesbalises ajoutant la règle relative,ilestnécessaire demettre àjour lespermaliensen exécutant une sauvegarde depuis lapage desparamètres>permalien.Je vous remercie!It works perfectly, I have also used it for the tags adding the relative rule, it is necessary to update the permalinks by executing a save from the settings page > permalink. Thank you!
- 0
- 2018-10-19
- Lorenzo Magon
-
Fonctionneparfaitementpour changer d'autres arguments aussi,j'avaisbesoin de définir `$ args ['has_archive']=false`et cela afonctionné.Works perfectly to change other args too, I needed to set `$args['has_archive'] = false` and this worked.
- 0
- 2019-02-08
- Mere Development
Est-ilpossible de redéclarer/modifier le slug dutype depublicationpersonnaliséexistant d'unplugin (sans simplementmodifier leplugin)?
Autrement dit,si Plugin X crée untype depublicationpersonnalisé avec le slug/uncookedtoast/,est-ilpossible d'ajouter unfiltre àfunctions.php (ou quelque chose de similaire) qui change le slugen/bread/?