Ridichiarare/Cambiare lo Slug di un Custom Post Type di un Plugin
È 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/?

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.

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

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/'.

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?

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

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!

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

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!

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".
