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?
Edbury
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
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
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!
Lorenzo Magon
Funziona perfettamente anche per modificare altri argomenti, avevo bisogno di impostare $args['has_archive'] = false e questo ha funzionato.
Mere Development
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".