web-dev-qa-db-fra.com

Redeclare/Change Slug du type de message personnalisé d'un plugin

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

En d’autres termes, si Plugin 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 /?

26
Edbury

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

Chaque fois que des types de publication personnalisés sont créés, des 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 purge les règles de réécriture et restaure les slugs 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 movies et que vous essayez de modifier le /movies/ slug en /films/.

Pour être complet, voici la fonction de base utilisée pour définir le type de publication personnalisé movies. Le plugin que vous référencez 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.

En gros, nous allons faire ceci:

  • Prenez les règles existantes et écrivez les nôtres avec nos propres slugs
  • Donner à la nouvelle règle une priorité plus élevée que le slug du type de publication personnalisé

Voici comment vous pouvez faire ceci:

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

Vous avez désormais deux moyens 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_rule à l’action init car il se déclenche trop souvent. C'est juste un exemple. Un meilleur endroit pour appliquer la fonction serait l’activation du thème, l’activation du plug-in, peut-être l’action save_post, etc. Selon ce que vous devez faire, vous devrez peut-être l’activer une ou plusieurs fois.

À ce stade, vous pouvez envisager de mettre à jour les liens permanents pour le type de publication personnalisé afin d'utiliser le slug '/movies/. Par exemple, si vous accédez à /films/, vous verrez une liste de tous vos films, mais survolez le titre en indiquant que la slug /movies/ est toujours utilisée.

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

21
Tom

Ce code a bien fonctionné pour le thème de mon enfant. Nécessaire pour changer "programme" slug à "lieu".

/*
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 );
4
Iggy