Cómo modificar una taxonomía que ya está registrada
Hoy necesité cambiar los argumentos de una taxonomía personalizada que ya estaba registrada por un plugin de terceros. Específicamente, quería establecer el argumento show_admin_column
a true
y cambiar el slug de rewrite
para que no fuera simplemente el slug de la taxonomía. En este caso, era un tipo de post "People" con una taxonomía personalizada "People Category".
Me sorprendió que esto no se hubiera preguntado antes, así que aquí está la pregunta y respuesta.

register_taxonomy()
es la herramienta adecuada para el trabajo. Del Codex:
Esta función añade o sobrescribe una taxonomía.
Una opción sería copiar los $args
de register_taxonomy()
y modificarlos. Sin embargo, eso significaría que cualquier cambio futuro en el código original de register_taxonomy()
los sobrescribiría.
Por lo tanto, al menos en este caso, es preferible obtener los argumentos originales, modificar los que quiero cambiar y luego volver a registrar la taxonomía. La inspiración para esta solución viene de @Otto en esta respuesta a una pregunta similar sobre tipos de contenido personalizados.
Usando el tipo de contenido personalizado people
y la taxonomía people_category
del ejemplo, esto funcionaría:
function wpse_modify_taxonomy() {
// obtener los argumentos de la taxonomía ya registrada
$people_category_args = get_taxonomy( 'people_category' ); // devuelve un objeto
// realizar cambios en los args
// en este ejemplo hay tres cambios
// de nuevo, nota que es un objeto
$people_category_args->show_admin_column = true;
$people_category_args->rewrite['slug'] = 'people';
$people_category_args->rewrite['with_front'] = false;
// volver a registrar la taxonomía
register_taxonomy( 'people_category', 'people', (array) $people_category_args );
}
// engancharlo a 11 para que sobrescriba la función register_taxonomy original
add_action( 'init', 'wpse_modify_taxonomy', 11 );
Observa arriba que convertí el tercer argumento de register_taxonomy()
al tipo array esperado. Esto no es estrictamente necesario ya que register_taxonomy()
usa wp_parse_args()
que puede manejar un object
o array
. Dicho esto, los $args
de register_taxonomy()
deberían enviarse como un array
según el Codex, por lo que esto me parece correcto.

Estoy intentando hacer esto para cambiar una taxonomía plana a una taxonomía jerárquica. Simplemente estoy cambiando la propiedad hierarchical a true. Al hacer esto, aparecen dos metaboxes para la taxonomía a la derecha de la pantalla de edición de entradas, y no puedo agregar taxonomías...

Asegúrate de usar el mismo slug (por ejemplo, 'people_category'
) que la taxonomía original para que la sobrescribas.

Encontré un problema con esta solución: el parámetro capabilities
se almacena internamente como cap
, por lo que no se pasará a la nueva taxonomía registrada. Consulta mi respuesta a una pregunta similar aquí

Parece que agregar flush_rewrite_rules();
después de register_taxonomy
es necesario para aplicar las reglas de reescritura del nuevo slug

@SajjadShirazy Eso no es recomendable ya que vaciará las reglas de reescritura en cada carga de página. Es mejor ir a Ajustes > Enlaces permanentes para vaciarlas manualmente una vez.

Esto es maravilloso, lo usé para añadir URLs jerárquicas a una taxonomía personalizada.

// Filtro para modificar los argumentos de registro de una taxonomía personalizada
add_filter( 'register_taxonomy_args', function( $args, $taxonomy, $object_type ) {
// Solo aplicamos cambios para la taxonomía 'people_category' asociada al tipo de publicación 'people'
if( $taxonomy !== 'people_category' || ! $object_type || $object_type[0] !== 'people' ) return $args;
// Mostrar columna en el listado de entradas en el admin
$args['show_admin_column'] = true;
// Modificar el slug para las URLs
$args['rewrite']['slug'] = 'people';
return $args;
}, 10, 3);
