Как убрать кнопку "+Добавить категорию" из метабокса категорий?
Я хочу отключить кнопку "+Добавить категорию" в метабоксе категорий, чтобы авторы могли выбирать только из существующих категорий.
Я проверил другой пост с таким же вопросом: Как убрать ссылку "+Добавить новую категорию" из метабокса категорий Но принятый ответ не имеет смысла, так как ссылается на строки 345-367, которые сейчас неактуальны (возможно, из-за обновлений WordPress). Это меня сбивает с толку.
Я установил плагин 'User Role Editor' и удалил capability 'manage_categories' для роли 'Editor', что сработало. Но я хочу убрать эту кнопку для ВСЕХ пользователей, включая администратора. Поэтому я попробовал изменить functions.php темы:
add_action( 'add_meta_boxes', 'isa_remove_categories_meta_box' ) function isa_remove_categories_meta_box() { remove_meta_box( 'categorydiv', 'post', 'side' ); // Удаляем весь бокс категорий }
Но это полностью удаляет бокс категорий. Есть ли способ заменить 'categorydiv', чтобы удалить только '+Добавить новую категорию'?
Или может кто-то объяснит, что означали строки 345-367 в принятом ответе из того поста? Я мог бы попробовать и этот вариант.
Если вы создаёте собственную таксономию, вы можете установить права доступа при её регистрации. Например...
<?php
register_taxonomy(
'members_tax',
'post',
array(
'label' => __( 'Участники' ),
'hierarchical' => true,
'rewrite' => array( 'slug' => 'members-tax' ),
'capabilities' => array(
'assign_terms' => 'manage_options',
'edit_terms' => 'god',
'manage_terms' => 'god',
),
'show_in_nav_menus' => false,
)
);
Если вы хотите, чтобы только администратор мог добавлять или редактировать, замените 'god' на 'administrator'. Это уберёт пункт "Добавить новую категорию участников" из метабокса на странице создания записи и удалит ссылку в меню под разделом "Записи".
Пример взят из этого gist-репозитория: https://gist.github.com/ChrisFlannagan/4cd3bfd0e853cda3d3f7898c59428ac2

Я установил плагин 'User Role Editor' и убрал возможность 'manage_categories' для роли 'Editor', что сработало. Но я хотел бы убрать её для ВСЕХ пользователей, включая администратора и суперадминистратора.
Если удаление возможности 'manage_categories' для роли редактора даёт вам нужный функционал, то вы можете убрать эту возможность для всех пользовательских ролей довольно легко - либо используя существующий плагин, либо написав новый плагин, который при активации удалит эту возможность из всех ролей. Вот код, который необходим для удаления возможности из каждой роли (фактически, он явно устанавливает возможность в false).
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 );
}
}
Это не удалит возможность для "суперадминистраторов", так как технически "суперадминистраторы" не являются ролью или возможностью.
Если вы хотите явно отозвать возможность manage_categories у всех пользователей, вы можете сделать и это.
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 );
}
}
Это всё ещё может не удалить возможность у "суперадминистраторов", потому что WordPress обрабатывает их иначе, чем других пользователей.

Метабокс категории устанавливается при регистрации категории с помощью функции register_taxonomy. По умолчанию эта функция устанавливает callback метабокса (meta_box_cb) в функцию WordPress под названием post_categories_meta_box. Именно эта функция отображает кнопку "+Добавить категорию". К сожалению, этот метабокс не позволяет выборочно скрыть эту кнопку. Как уже отмечали другие отвечающие, кнопка скрывается в зависимости от возможности edit_terms для таксономии, поэтому вы можете эффективно скрыть её, ограничив, у кого есть эта возможность. Однако это не работает, если, как и мне, вы хотите скрыть эту кнопку без ограничения возможностей.
Для этого вам нужно предоставить свой собственный meta_box_cb. Я сделал это, просто скопировав post_categories_meta_box и удалив эту кнопку.
Моя пользовательская функция:
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 . ']';
// Позволяет отправить пустой набор терминов. 0 является недопустимым ID термина и будет проигнорирован проверками 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
}
(Надеюсь, я могу включить сюда свою пользовательскую функцию, которая, как я уже упоминал, в значительной степени скопирована из WordPress. Если есть юридические причины, по которым я не могу этого сделать, пожалуйста, дайте мне знать.)
Применение к моей пользовательской таксономии
register_taxonomy(
"my_custom_taxonomy",
"my_custom_type",
array(
...
'hierarchical' => true,
'meta_box_cb' => 'custom_post_categories_meta_box_without_add_new'
)
);
Недостаток этого подхода в том, что, в отличие от стандартного, ваш meta_box_cb не изменится, если WordPress обновит свои стили.
Обратите внимание, что это работает только в том случае, если вы регистрируете свои таксономии вручную. Если вы используете плагин, он может не позволить вам настроить meta_box_cb.
