Как убрать кнопку "+Добавить категорию" из метабокса категорий?

10 мар. 2017 г., 17:00:15
Просмотры: 5.46K
Голосов: 1

Я хочу отключить кнопку "+Добавить категорию" в метабоксе категорий, чтобы авторы могли выбирать только из существующих категорий.

  1. Я проверил другой пост с таким же вопросом: Как убрать ссылку "+Добавить новую категорию" из метабокса категорий Но принятый ответ не имеет смысла, так как ссылается на строки 345-367, которые сейчас неактуальны (возможно, из-за обновлений WordPress). Это меня сбивает с толку.

  2. Я установил плагин '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 в принятом ответе из того поста? Я мог бы попробовать и этот вариант.

4
Комментарии

как упомянул автор вопроса, на который вы ссылаетесь, я использую "CSS-хаки, чтобы скрыть это", когда мне это нужно.

Paul 'Sparrow Hawk' Biron Paul 'Sparrow Hawk' Biron
10 мар. 2017 г. 17:05:10

Не могли бы вы подробнее рассказать, как реализовать CSS-хаки? Какие CSS-файлы нужно модифицировать?

Ashwin Baskaran Ashwin Baskaran
10 мар. 2017 г. 17:11:16

в ответе на тот вопрос также упоминается "В настоящее время нет доступного хука для фильтрации вывода". Около 10 дней назад я создал тикет в Trac и запросил добавление такого фильтра (правда, по другой причине). Похоже, что команда разработчиков ядра даже не рассмотрела этот тикет, но возможно, если вы (и другие) оставите комментарии, что это было бы полезно и вам, они примут меры.

Paul 'Sparrow Hawk' Biron Paul 'Sparrow Hawk' Biron
10 мар. 2017 г. 17:12:48

В вашем плагине/теме добавьте следующий код #category-adder { display: none ;} в любой CSS, который вы подключаете через admin_enqueue_scripts

Paul 'Sparrow Hawk' Biron Paul 'Sparrow Hawk' Biron
10 мар. 2017 г. 17:21:05
Все ответы на вопрос 3
1

Если вы создаёте собственную таксономию, вы можете установить права доступа при её регистрации. Например...

<?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

7 авг. 2019 г. 14:23:45
Комментарии

Дополнение. Если вы хотите, чтобы любой пользователь мог назначать термины, удалите строку 'assign_terms' => 'manage_options',

CDToad CDToad
7 авг. 2019 г. 14:26:01
0

Я установил плагин '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 обрабатывает их иначе, чем других пользователей.

10 мар. 2017 г. 18:50:21
0

Метабокс категории устанавливается при регистрации категории с помощью функции 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.

5 нояб. 2020 г. 22:24:44