Ridichiarare/Cambiare lo Slug di un Custom Post Type di un Plugin

11 feb 2012, 18:03:50
Visualizzazioni: 69.5K
Voti: 32

È possibile ridichiarare/modificare lo slug di un custom post type esistente di un plugin (senza modificare direttamente il plugin)?

Cioè, se il Plugin X crea un custom post type con lo slug /uncookedtoast/, è possibile aggiungere un filtro a functions.php (o qualcosa di simile) che cambi lo slug in /bread/?

1
Commenti

Ho appena risolto lo stesso problema agganciandomi a init con una priorità di 20 e poi richiamando register_post_type nuovamente per lo stesso post type. Qualcuno sa se questo potrebbe causarmi problemi in futuro?

Dustin Dustin
12 apr 2013 05:48:23
Tutte le risposte alla domanda 4
4
32

Sì, questo è possibile, ma se il plugin sta creando un custom post type utilizzando il parametro rewrite => array('slug' => 'post_type'), è improbabile che tu possa sostituire lo slug.

Ogni volta che vengono creati custom post type, le regole di riscrittura degli URL vengono scritte nel database. A seconda dell'azione che attiva la creazione del custom post type (come l'azione init), WordPress ripristinerà le regole di riscrittura e manterrà gli slug dei custom post type indipendentemente dalle modifiche che tenti di apportare.

Detto questo, puoi fornire slug personalizzati per i custom post type. Il seguente esempio presuppone che tu abbia un custom post type chiamato movies e che stia tentando di cambiare lo slug /movies/ in /films/.

Per completezza, ecco la funzione di base utilizzata per definire il custom post type movies. Il plugin a cui ti riferisci dovrebbe fare qualcosa di simile:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Film'),
                'singular_name' => __('Film')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

Puoi modificare la tabella delle opzioni fornendo le tue regole personalizzate basate sul post type esistente.

In sostanza, faremo questo:

  • Prendiamo l'insieme esistente di regole e poi scriviamo le nostre con slug personalizzati
  • Diamo alla nuova regola una priorità maggiore rispetto allo slug del custom post type

Ecco come puoi farlo:

function add_custom_rewrite_rule() {

    // Per prima cosa, proviamo a caricare le regole di riscrittura. Lo facciamo nel caso
    // in cui venga utilizzata la struttura dei permalink predefinita.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Successivamente, iteriamo attraverso ogni regola personalizzata aggiungendo una nuova regola
        // che sostituisce 'movies' con 'films' e gli assegna una priorità
        // più alta rispetto alla regola esistente.
        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

    // ...e infine svuotiamo le regole
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

Ora avrai due modi per accedere ai tuoi film:

  • /movies/ritorno-al-futuro
  • /films/ritorno-al-futuro

Nota che non consiglio di agganciare la funzione add_custom_rewrite_rule all'azione init perché verrebbe eseguita troppo frequentemente. Questo è solo un esempio. Un posto migliore per applicare la funzione potrebbe essere durante l'attivazione del tema, l'attivazione del plugin, forse l'azione save_post, ecc. A seconda di ciò che devi fare, potresti aver bisogno di eseguirla solo una volta o poche volte.

A questo punto, potresti voler considerare di aggiornare i permalink del custom post type per utilizzare lo slug '/movies/. Ad esempio, se navighi su /films/, vedrai un elenco di tutti i tuoi film, ma passando il mouse sul titolo si rivelerà che viene ancora utilizzato lo slug /movies/.

Per fare un ulteriore passo avanti, potresti tecnicamente impostare un reindirizzamento 301 per catturare tutti i link a /movies/ e reindirizzarli alla loro controparte /films/, ma tutto dipende da ciò che stai cercando di fare.

13 feb 2012 16:40:49
Commenti

Ha funzionato perfettamente! Potresti anche indicarmi la direzione giusta per aggiornare i permalink?

Edbury Edbury
13 feb 2012 22:23:38

A seconda del tuo tema, puoi farlo a livello di template. Quando vedi la chiamata a 'the_title()', puoi sostituirla con $title = get_the_title(), poi sostituisci la stringa '/movies/' in $title con '/films/'.

Tom Tom
14 feb 2012 15:16:06

E se lo slug che vuoi cambiare viene creato dinamicamente da un meta value del post corrente? Ho bisogno di poter usare $post nella funzione add_custom_rewrite_rule() ma restituisce errori in WP Admin dicendo 'Trying to get property of non-object'. Come posso ottenere $post per recuperare il meta value?

Lee Lee
17 gen 2018 18:15:37

Funziona alla grande. Grazie per averlo condiviso!!

Student22 Student22
22 feb 2024 10:22:14
3
15

Questo codice ha funzionato bene per il mio tema child. Avevo bisogno di cambiare lo slug "program" in "place".

/*
MODIFICA GLI SLUG DEI CUSTOM POST TYPE
*/

function change_post_types_slug( $args, $post_type ) {

   /*slug del post type item*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
MODIFICA GLI SLUG DELLE TASSONOMIE, slug usati per le pagine archivio
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*categoria item*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );
23 dic 2017 22:29:38
Commenti

Funziona perfettamente, l'ho utilizzato anche per i tag aggiungendo la regola relativa, è necessario aggiornare i permalink eseguendo un salvataggio dalla pagina delle impostazioni > permalink. Grazie!

Lorenzo Magon Lorenzo Magon
19 ott 2018 21:17:46

Funziona perfettamente anche per modificare altri argomenti, avevo bisogno di impostare $args['has_archive'] = false e questo ha funzionato.

Mere Development Mere Development
8 feb 2019 18:35:48

E se volessi cambiare il permalink del post invece dello slug del cpt, come: themename/projects/slug-del-post ??

Krys Krys
15 ott 2020 12:05:18
0

Nel mio caso c'era un plugin (necessario per il funzionamento del tema) che registrava un custom post type e volevo modificarne alcune impostazioni, incluso lo slug.

Quindi, quello che ho fatto è stato re-registrare (una sorta di sovrascrittura della funzione di registrazione del plugin) il custom post type aggiungendo quanto segue nel file functions.php del mio child theme in questo modo:

function my-theme-name_post_type_my-custom-post-type-name()
{
   $labels = array(
      ...
   );

   $args = array(
      ...

      'rewrite' => array(
         'slug' => __('lo-slug-di-tua-scelta', 'il-textdomain-di-tua-scelta-per-la-traduzione-se-necessario'),
      ),
   );
   register_post_type('il-nome-del-custom-post-type-registrato-dal-plugin', $args);
}
add_action('init', 'my-theme-name_post_type_my-custom-post-type-name');

Come puoi vedere, puoi cambiare lo slug semplicemente aggiungendo quanto segue all'array $args:

'rewrite' => array(
    'slug' => __('lo-slug-di-tua-scelta', 'il-textdomain-di-tua-scelta-per-la-traduzione-se-necessario'),
)

Maggiori informazioni su questo a: https://developer.wordpress.org/reference/functions/register_post_type/

MOLTO IMPORTANTE

Ricorda di aggiornare i permalink per applicare le modifiche e poter accedere ai post coinvolti. Vai nelle impostazioni dei permalink e semplicemente premi "Salva"...dovrebbe funzionare!

14 feb 2021 17:28:23
0
function change_portfolio_slug() {
    $args = get_post_type_object( 'portfolio' );
    if ( ! empty( $args ) ) {
        $args->rewrite['slug'] = 'project';
        register_post_type( 'portfolio', $args );
    }
}
add_action( 'init', 'change_portfolio_slug', 20 );

Nel mio caso, il plugin dichiara un custom post type "portfolio" con 'rewrite' => array( 'slug' => 'portfolio'), utilizzando un hook nell'azione 'init' add_action( 'init', 'some_plugin_custom_posts_init' );.

Lo snippet sopra, inserito nel file functions.php del tema, definisce una nuova funzione change_portfolio_slug() che modifica l'argomento rewrite per il post type portfolio, cambiando il suo slug in "project". Successivamente usiamo la funzione register_post_type() per registrare il post type con gli argomenti modificati.

La funzione add_action() collega la funzione change_portfolio_slug() all'azione init, in modo che venga eseguita quando WordPress si inizializza.

Nell'ultima riga dello snippet add_action( 'init', 'change_portfolio_slug', 10 );, il numero 10 rappresenta la priorità dell'hook dell'azione. Se vuoi modificare la priorità, puoi cambiare il 10 con un numero diverso. Nel mio caso, la priorità funzionante era 20.

Nota che potrebbe essere necessario aggiornare i permalink dopo questa modifica per assicurarti che la nuova struttura degli URL venga applicata correttamente. Puoi farlo andando in Impostazioni > Permalink nella dashboard di amministrazione di WordPress e cliccando il pulsante "Salva modifiche".

10 mar 2023 17:04:18