Redéclarer / modifier le slug du type de publication personnalisé d'un plugin


28

Est-il possible de redéclarer / modifier le slug du type de publication personnalisé existant d'un plugin (sans simplement modifier le plugin)?

Autrement dit, si le plug-in X crée un type de publication personnalisé avec le slug / uncookedtoast /, est-il possible d'ajouter un filtre à functions.php (ou quelque chose de similaire) qui change le slug en / bread /?


Je viens de résoudre ce même problème en me connectant à init avec une priorité de 20, puis en appelant à nouveau register_post_type pour le même type de message. Quelqu'un sait si cela va me causer des ennuis sur la route?
Dustin

Réponses:


24

Oui, cela est possible, mais si le plugin crée un type de publication personnalisé à l'aide du rewrite => array('slug' => 'post_type')paramètre, il est peu probable que vous puissiez remplacer le slug.

Chaque fois que des types de publication personnalisés sont créés, les règles de réécriture d'URL sont écrites dans la base de données. En fonction de l'action qui déclenche la création du type de publication personnalisé (telle que l' action init ), WordPress videra les règles de réécriture et restaurera les limaces du type de publication personnalisé quelles que soient les modifications que vous tentez d'apporter.

Cela dit, vous pouvez fournir des slugs personnalisés pour les types de publication personnalisés. L'exemple suivant suppose que vous avez un type de publication personnalisé de movieset que vous essayez de changer le /movies/slug en /films/.

Pour être complet, voici la fonction de base utilisée pour définir le moviestype de publication personnalisé. Le plugin auquel vous faites référence devrait faire quelque chose comme ceci:

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');

Vous pouvez modifier le tableau des options en fournissant vos propres règles personnalisées en fonction du type de publication existant.

Fondamentalement, nous ferons ceci:

  • Prenez l'ensemble de règles existant, puis écrivez le nôtre avec nos propres slugs personnalisés
  • Donnez à la nouvelle règle une priorité plus élevée que le slug du type de publication personnalisé

Voici comment procéder:

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');

Maintenant, vous aurez deux façons d'accéder à vos films:

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

Notez que je ne recommande pas d'accrocher le add_custom_rewrite_ruledans l' initaction car il se déclenchera trop fréquemment. C'est juste un exemple. Un meilleur endroit pour appliquer la fonction serait l'activation du thème, l'activation du plugin, peut-être l'action save_post, etc.

À ce stade, vous souhaiterez peut-être envisager de mettre à jour les permaliens pour le type de publication personnalisé afin d'utiliser le /movies/slug. Par exemple, si vous accédez à /films/, vous verrez une liste de tous vos films, mais le survol du titre révélera que le /movies/slug est toujours utilisé.

Pour aller plus loin, vous pouvez techniquement créer une redirection 301 pour intercepter tous les liens /movies/vers la redirection vers leur /films/homologue, mais tout dépend de ce que vous essayez de faire.


Fonctionne magnifiquement! Pourriez-vous également m'orienter dans la bonne direction pour mettre à jour les permaliens?
Edbury

1
Selon votre thème, vous pouvez le faire au niveau du modèle. Lorsque vous voyez l'appel à 'the_title ()', vous pouvez le remplacer par $ title = get_the_title (), puis remplacer la chaîne '/ movies /' dans $ title par '/ films /'.
Tom

Que faire si le slug que vous souhaitez modifier est créé dynamiquement par une méta-valeur de la publication actuelle? J'ai besoin de pouvoir l'utiliser $postdans la add_custom_rewrite_rule()fonction, mais cela génère des erreurs dans WP Admin disant `` Essayer d'obtenir la propriété d'un non-objet ''. Comment puis-je obtenir $ post pour obtenir la méta-valeur?
Lee

6

Ce code a bien fonctionné pour mon thème enfant. Nécessaire pour changer le slug "program" 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 );

Cela fonctionne parfaitement, je l'ai également utilisé pour les balises en ajoutant la règle relative, il est nécessaire de mettre à jour les permaliens en exécutant une sauvegarde depuis la page des paramètres> permalien. Merci!
Lorenzo Magon

Fonctionne parfaitement pour changer d'autres arguments aussi, je devais régler $args['has_archive'] = falseet cela a fonctionné.
Mere Development
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.