Создание capability

315
12 апреля 2017, 16:28

Помогите решить задачу. Нужно создать отдельную сущность (новый тип поста) при активации плагина. Пусть новая сущность называется new_product.
При активации плагина должна создаваться новая capability, пусть new_cap, и добавить эту capability к роли Administrator. Новый раздел с новым типом (new_product) может видеть только администратор с новой capability.
Как создавать новую capability? Разве add_cap() для этого подойдёт?
По идее add_cap() добавляет только существующие capability, а как нужно создать и добавить новую capability?

Answer 1

Правильно, add_cap() не подойдет. Для того, чтобы создавать новые возможности и роли пользователей, проще всего воспользоваться плагином User Roles and Capabilities.

Можно добавить такой код в functions.php

function custom_add_cap() {
    $custom_cap = 'kagg_cap';
    $min_cap    = 'activate_plugins'; // Смотрите роли в codex
    $grant      = true;
    foreach ( $GLOBALS['wp_roles']->role_objects as $role_obj )
    {
        if ( (! $role_obj->has_cap( $custom_cap ))
            && ($role_obj->has_cap( $min_cap )) ) {
            $role_obj->add_cap( $custom_cap, $grant );
        }
    }
}
add_action( 'init', 'custom_add_cap' );

На этапе инициализации вызывается функция, которая добавляет новую возможность. Для примера новая возможность названа kagg_cap. Функция проверяет все существующие роли, сравнивает с некой минимальной возможностью (в примере - activate_plugins), и добавляет новую возможность во все роли, где есть минимальная.

Перечень ролей и возможностей, а также таблицу соответствия можно посмотреть в codex.

Проверить, что роли и возможности установлены, можно таким кодов в functions.php

function action_footer(){
    var_dump($GLOBALS['wp_roles']->role_objects);
    var_dump($GLOBALS['wp_roles']->role_objects['administrator']);
    var_dump($GLOBALS['wp_roles']->role_objects['administrator']->has_cap('activate_plugins'));
    var_dump(current_user_can( 'administrator'));
    var_dump(current_user_can( 'activate_plugins'));
    var_dump(current_user_can( 'kagg_cap'));
    var_dump(current_user_can( 'kagg1_cap'));
}
add_action( 'wp_footer', 'action_footer' );

Поскольку kagg1_cap мы не создавали, последняя строка выведет false.

READ ALSO
Замена массива в многомерном массиве

Замена массива в многомерном массиве

Подскажите как проще сделать замену массивов в многомерном массиве

251
Получение ip клиента сайта Opera

Получение ip клиента сайта Opera

Есть следующий код определяющий ip клиента

222