Разрешение доступа пользовательской роли к пользовательскому типу записей в админке

5 мая 2015 г., 14:01:43
Просмотры: 18.3K
Голосов: 10

У меня возникли проблемы с этим, и я не могу понять причину. Мне просто нужно, чтобы пользовательская роль имела доступ к блогу в админке.

Я добавил новый тип записей с типом возможностей blog и новую роль пользователя со всеми правами, которые позволяют администраторам добавлять/редактировать этот кастомный тип записей. Для администраторов это работает, и они могут получить доступ к типу записей в админке. Однако пользователи с моей пользовательской ролью вообще не могут войти в админку.

Аргументы типа записей, на которые стоит обратить внимание

"capability_type" => 'blog',
"map_meta_cap" => true,

Регистрация роли

function add_blog_manager_role(){
    add_role(
        'blog_manager',
        'Менеджер блога',
        array(
            'read' => true,
            'edit_posts' => false,
            'delete_posts' => false,
            'publish_posts' => false,
            'upload_files' => true
        )
    );
}
add_action( 'admin_init', 'add_blog_manager_role', 4 );

Добавление возможностей

function add_blog_role_caps() {
    $roles = array('blog_manager', 'editor','administrator');
    foreach($roles as $the_role) {
        $role = get_role($the_role);
        $role->add_cap( 'read' );
        $role->add_cap( 'read_blog');
        $role->add_cap( 'read_private_blog' );
        $role->add_cap( 'edit_blog' );
        $role->add_cap( 'edit_others_blog' );
        $role->add_cap( 'edit_published_blog' );
        $role->add_cap( 'publish_blog' );
        $role->add_cap( 'delete_others_blog' );
        $role->add_cap( 'delete_private_blog' );
        $role->add_cap( 'delete_published_blog' );
    }
}
add_action('admin_init', 'add_blog_role_caps', 5 );

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

Редактирование Вот дамп возможностей blog_manager из базы данных, там осталось много тестового мусора, но это не должно мешать входу в админку, насколько я знаю.

'blog_manager' => array (
    'name' => 'Менеджер блога',
    'capabilities' => array (
        'read' => true,
        'edit_posts' => false,
        'delete_posts' => false,
        'publish_posts' => false,
        'upload_files' => true,
        'read_blog' => true,
        'read_private_blog' => true,
        'edit_blog' => true,
        'edit_others_blog' => true,
        'edit_published_blog' => true,
        'publish_blog' => true,
        'delete_others_blog' => true,
        'delete_private_blog' => true,
        'delete_published_blog' => true,
        'blog' => true,
        'read_private_blogs' => true,
        'edit_blogs' => true,
        'edit_others_blogs' => true,
        'edit_published_blogs' => true,
        'publish_blogs' => true,
        'delete_others_blogs' => true,
        'delete_private_blogs' => true,
        'delete_published_blogs' => true,
        'delete_blogs' => true,
        'delete_blog' => true,
    ),
)
4
Комментарии

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

Rarst Rarst
5 мая 2015 г. 17:32:31

Я добавил дамп возможностей из базы данных. У меня только 3 возможности для записей установлены в false, как указано в коде выше.

Chris Morris Chris Morris
5 мая 2015 г. 17:54:49

Я бы установил плагин User Role Editor - https://wordpress.org/plugins/user-role-editor/. Затем вручную проверил различия между пользователями/ролями - там может быть какой-то конфликт или отсутствующие настройки.

Welcher Welcher
21 мая 2015 г. 02:50:29

Привет @ChrisMorris, как у тебя дела с этим вопросом? Удалось ли найти решение?

Tim Malone Tim Malone
29 июн. 2016 г. 11:18:05
Все ответы на вопрос 2
1

Сложно устранить неполадки в приведённом выше коде, так как это только часть фактического кода, но вот минимальный плагин, необходимый для регистрации пользовательского типа записи (называемого Example) и пользовательской роли (Blog Manager), которая имеет доступ к пользовательскому типу записи Example.

Этот код также можно использовать в файле functions.php темы. Просто используйте хуки активации и деактивации темы вместо плагина.

<?php
/**
 * Plugin Name: WPSE 186337
 * Description: Отладка вопроса WordPress StackExchange 186337
 * Plugin URI: https://wordpress.stackexchange.com/questions/186337/
 * Author: Nathan Johnson
 * Licence: GPL2+
 * Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
 */

//* Не получать прямой доступ к этому файлу
defined( 'ABSPATH' ) or die();

//* Добавляем действие к init для регистрации пользовательского типа записи
add_action( 'init', 'se186337_init' );

//* Регистрируем хук активации для добавления роли Blog Manager
register_activation_hook( __FILE__ , 'se186337_activation' );

//* Регистрируем хук деактивации для удаления роли Blog Manager
register_deactivation_hook( __FILE__ , 'se186337_deactivation' );

function se186337_activation() {
  $caps = [
    //* Мета-возможности
    'read'                   => true,
    'edit_blog'              => true,
    'read_blog'              => true,
    'delete_blog'            => true,

    //* Базовые возможности, используемые вне map_meta_cap()
    'edit_blogs'             => true,
    'edit_others_blogs'      => true,
    'publish_blogs'          => true,
    'read_private_blogs'     => true,

    //* Базовые возможности, используемые внутри map_meta_cap()
    'delete_blogs'           => true,
    'delete_private_blogs'   => true,
    'delete_published_blogs' => true,
    'delete_others_blogs'    => true,
    'edit_private_blogs'     => true,
    'edit_published_blogs'   => true,
  ];

  add_role( 'blog_manager', 'Менеджер блога', $caps );
}

function se186337_deactivation() {
  remove_role( 'blog_manager' );
}

function se186337_init() {
  $labels = [
    'name'          => __( 'Примеры' ),
    'singular_name' => __( 'Пример' ),
  ];
  $args = [
    'labels'          => $labels,
    'public'          => true,
    'has_archive'     => true,
    'capability_type' => 'blog',
    'map_meta_cap'    => true,
  ];
  register_post_type( 'examples', $args );
}
21 февр. 2017 г. 20:22:16
Комментарии

В функции se186337_activation() вы назначили права, однако почему вы не использовали функцию $add->cap внутри другой функции с циклом foreach для добавления прав таким способом? Надеюсь, что это понятно...

Krys Krys
22 мар. 2022 г. 08:08:09
0

Если вас устраивает плагин, вы можете использовать указанный ниже плагин.

https://wordpress.org/plugins/capability-manager-enhanced/

7 авг. 2016 г. 01:02:05