Come modificare una tassonomia già registrata
Oggi ho avuto bisogno di modificare gli argomenti di una tassonomia personalizzata che era già stata registrata da un plugin di terze parti. Nello specifico, volevo impostare l'argomento show_admin_column
a true
e cambiare lo slug rewrite
in modo che non fosse semplicemente lo slug della tassonomia. In questo caso, si trattava di un custom post type "Persone" con una tassonomia personalizzata "Categoria Persone".
Mi ha sorpreso che questa domanda non fosse stata posta prima, quindi ecco una domanda e risposta.

register_taxonomy()
è lo strumento adatto per questo lavoro. Dal Codex:
Questa funzione aggiunge o sovrascrive una tassonomia.
Un'opzione sarebbe quella di copiare gli $args
di register_taxonomy()
e modificarli. Tuttavia, questo significherebbe che eventuali modifiche future al codice originale di register_taxonomy()
verrebbero sovrascritte.
Pertanto, almeno in questo caso, è preferibile ottenere gli argomenti originali, modificare quelli che si desidera cambiare, e poi ri-registrare la tassonomia. L'ispirazione per questa soluzione va a @Otto in questa risposta a una domanda simile sui tipi di post personalizzati.
Utilizzando il tipo di post personalizzato people
e la tassonomia people_category
dell'esempio, questo è il codice che fa al caso nostro:
function wpse_modify_taxonomy() {
// ottiene gli argomenti della tassonomia già registrata
$people_category_args = get_taxonomy( 'people_category' ); // restituisce un oggetto
// apporta modifiche agli argomenti
// in questo esempio ci sono tre modifiche
// nota ancora che è un oggetto
$people_category_args->show_admin_column = true;
$people_category_args->rewrite['slug'] = 'people';
$people_category_args->rewrite['with_front'] = false;
// ri-registra la tassonomia
register_taxonomy( 'people_category', 'people', (array) $people_category_args );
}
// aggancia la funzione all'hook init con priorità 11 per sovrascrivere la funzione originale register_taxonomy
add_action( 'init', 'wpse_modify_taxonomy', 11 );
Nota sopra che ho eseguito il typecast del terzo argomento di register_taxonomy()
al tipo array atteso. Questo non è strettamente necessario poiché register_taxonomy()
utilizza wp_parse_args()
che può gestire sia un oggetto
che un array
. Detto questo, gli $args
di register_taxonomy()
dovrebbero essere inviati come un array
secondo il Codex, quindi questa soluzione mi sembra corretta.

Sto cercando di fare questo per cambiare una tassonomia piatta in una tassonomia gerarchica. Sto semplicemente cambiando la proprietà hierarchical a true. Facendo questo, causa due meta box per la tassonomia a destra della schermata di modifica del post, e non riesco ad aggiungere effettivamente le tassonomie...

Assicurati di usare lo stesso slug (es. 'people_category'
) della tassonomia originale in modo da sovrascriverla.

Ho trovato un problema con questa soluzione: il parametro capabilities
viene memorizzato internamente come cap
quindi non verrà passato alla nuova tassonomia registrata. Vedi la mia risposta a una domanda simile qui

Sembra che aggiungere flush_rewrite_rules();
dopo register_taxonomy
sia necessario per applicare le regole di riscrittura del nuovo slug

@SajjadShirazy Non è consigliato perché questo comporterà il flush delle regole di riscrittura ad ogni caricamento di pagina. È meglio andare in Impostazioni > Permalink per eseguire manualmente il flush una sola volta.

È fantastico, l'ho usato per aggiungere URL gerarchici a una tassonomia personalizzata.

add_filter( 'register_taxonomy_args', function( $args, $taxonomy, $object_type ) {
// Modifica gli argomenti di registrazione per la tassonomia 'people_category'
if( $taxonomy !== 'people_category' || ! $object_type || $object_type[0] !== 'people' ) return $args;
$args['show_admin_column'] = true; // Mostra colonna nell'amministrazione
$args['rewrite']['slug'] = 'people'; // Modifica lo slug per i rewrite URL
return $args;
}, 10, 3);
