Cómo eliminar el botón "+Agregar categoría" del metabox de Categorías
Me gustaría desactivar el botón "+Agregar Categoría" debajo del metabox de Categorías para que cualquier persona que cree una publicación solo pueda elegir de la lista de categorías existentes.
Revisé otra publicación que tiene exactamente la misma pregunta, Cómo eliminar el enlace "+ Agregar nueva categoría" de un metabox de categorías Pero la respuesta aceptada no tiene sentido porque hace referencia a las líneas 345-367, que no son relevantes (quizás debido a actualizaciones de WP, las cosas pueden haber cambiado). Así que estoy confundido.
Instalé el plugin 'User Role Editor' y eliminé la capacidad 'manage_categories' para el 'Editor', lo cual funcionó. Pero me gustaría eliminarlo para TODOS los usuarios, incluidos admin y superadmin. Así que intenté cambiar el functions.php del tema así:
add_action( 'add_meta_boxes', 'isa_remove_categories_meta_box' ) function isa_remove_categories_meta_box() { remove_meta_box( 'categorydiv', 'post', 'side' ); // elimina el cuadro de Categorías completo }
Pero esto hace que todo el cuadro de Categorías desaparezca. ¿Hay algo que pueda usar para reemplazar 'categorydiv' y hacer que solo desaparezca el '+Agregar Nueva Categoría'?
O, ¿alguien puede indicarme a qué se refería la respuesta aceptada de la otra publicación con las líneas 345-367? También podría intentar eso.

Si estás construyendo tu propia taxonomía, puedes establecer las capacidades al registrar la taxonomía. Por ejemplo...
<?php
register_taxonomy(
'members_tax', // Nombre de la taxonomía
'post', // Tipo de post al que se aplica
array(
'label' => __( 'Miembros' ), // Etiqueta traducida
'hierarchical' => true, // Taxonomía jerárquica (como categorías)
'rewrite' => array( 'slug' => 'members-tax' ), // Slug para URLs
'capabilities' => array( // Capacidades requeridas
'assign_terms' => 'manage_options', // Asignar términos
'edit_terms' => 'god', // Editar términos
'manage_terms' => 'god', // Gestionar términos
),
'show_in_nav_menus' => false, // No mostrar en menús de navegación
)
);
Si solo quieres que el administrador pueda agregar o editar, cambia 'god' por 'administrator'. Esto elimina el enlace "Añadir nueva categoría de Miembros" del metabox en la página de nuevos posts y elimina el enlace en la barra de menú bajo Posts.
Esto proviene de este gist https://gist.github.com/ChrisFlannagan/4cd3bfd0e853cda3d3f7898c59428ac2

Instalé el plugin 'User Role Editor' y eliminé la capacidad 'manage_categories' para el rol 'Editor', lo cual funcionó. Pero me gustaría eliminarla para TODOS los usuarios incluyendo admin, superadmin.
Si eliminar la capacidad 'manage_categories' del rol de editor proporciona la funcionalidad que deseas, entonces puedes eliminar esta capacidad de todos los roles de usuario de manera relativamente fácil, ya sea usando un plugin existente o escribiendo un nuevo plugin que, al activarse, elimine la capacidad de todos los roles. Aquí está el código necesario para eliminar la capacidad de cada rol (en realidad, establece explícitamente la capacidad en falso).
register_activation_hook( __FILE__, 'wpse_259647_remove_manage_categories_cap' );
function wpse_259647_remove_manage_categories_cap() {
$roles = wp_roles();
foreach( $roles->role_names as $slug => $name ) {
$role = get_role( $slug );
$role->add_cap( 'manage_categories', false );
}
}
Sin embargo, esto no eliminará la capacidad de los "super administradores" ya que técnicamente estos no son un rol ni una capacidad.
Si deseas revocar explícitamente la capacidad manage_categories de todos los usuarios, también podrías hacerlo.
register_activation_hook( __FILE__, 'wpse_259647_remove_manage_categories_cap' );
function wpse_259647_remove_manage_categories_cap() {
$users = get_users();
foreach( $users as $user ) {
$user->add_cap( 'manage_categories', false );
}
}
Esto todavía podría no eliminar la capacidad de los "super administradores", ya que WordPress los trata de manera diferente a otros usuarios.

El metabox de la Categoría se establece cuando la categoría se registra con la función register_taxonomy. El comportamiento predeterminado de esta función es establecer la devolución de llamada del metabox (meta_box_cb) a una función de WordPress llamada post_categories_meta_box. Es esta función la que renderiza el botón "+Añadir Categoría". Desafortunadamente, este metabox no permite ocultar selectivamente este botón. Como han señalado otros respondientes, ocultará ese botón en función de la capacidad edit_terms de la taxonomía, por lo que puedes ocultarlo de manera efectiva limitando quién tiene esta capacidad. Sin embargo, esto no funciona si, como yo, deseas ocultar este botón sin limitar capacidades.
Para hacer esto, necesitas proporcionar tu propio meta_box_cb. Lo hice simplemente copiando post_categories_meta_box y eliminando ese botón.
Mi función personalizada:
function custom_post_categories_meta_box_without_add_new( $post, $box ) {
$defaults = array( 'taxonomy' => 'category' );
if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
$args = array();
} else {
$args = $box['args'];
}
$parsed_args = wp_parse_args( $args, $defaults );
$tax_name = esc_attr( $parsed_args['taxonomy'] );
$taxonomy = get_taxonomy( $parsed_args['taxonomy'] );
?>
<div id="taxonomy-<?php echo $tax_name; ?>" class="categorydiv">
<ul id="<?php echo $tax_name; ?>-tabs" class="category-tabs">
<li class="tabs"><a href="#<?php echo $tax_name; ?>-all"><?php echo $taxonomy->labels->all_items; ?></a></li>
<li class="hide-if-no-js"><a href="#<?php echo $tax_name; ?>-pop"><?php echo esc_html( $taxonomy->labels->most_used ); ?></a></li>
</ul>
<div id="<?php echo $tax_name; ?>-pop" class="tabs-panel" style="display: none;">
<ul id="<?php echo $tax_name; ?>checklist-pop" class="categorychecklist form-no-clear" >
<?php $popular_ids = wp_popular_terms_checklist( $tax_name ); ?>
</ul>
</div>
<div id="<?php echo $tax_name; ?>-all" class="tabs-panel">
<?php
$name = ( 'category' === $tax_name ) ? 'post_category' : 'tax_input[' . $tax_name . ']';
// Permite enviar un conjunto de términos vacío. 0 es un ID de término inválido y será ignorado por las comprobaciones empty().
echo "<input type='hidden' name='{$name}[]' value='0' />";
?>
<ul id="<?php echo $tax_name; ?>checklist" data-wp-lists="list:<?php echo $tax_name; ?>" class="categorychecklist form-no-clear">
<?php
wp_terms_checklist(
$post->ID,
array(
'taxonomy' => $tax_name,
'popular_cats' => $popular_ids,
)
);
?>
</ul>
</div>
</div>
<?php
}
(Espero poder incluir aquí mi función personalizada que, como mencioné, está en gran parte copiada de WordPress. Si hay razones legales por las que no puedo hacer esto, por favor házmelo saber).
Aplicado a mi taxonomía personalizada
register_taxonomy(
"my_custom_taxonomy",
"my_custom_type",
array(
...
'hierarchical' => true,
'meta_box_cb' => 'custom_post_categories_meta_box_without_add_new'
)
);
La desventaja de esto es que, a diferencia del predeterminado, tu meta_box_cb no cambiará si WordPress actualiza su estilo.
Ten en cuenta que esto solo funciona si estás registrando tus taxonomías manualmente. Si estás utilizando un plugin, es posible que no te permita configurar el meta_box_cb.
