Как внести изменения в роль пользователя WordPress

Роли пользователя

Роли пользователя


Каждому владельцу блога WordPress версии 2.8 и выше известны стандартные пользовательские роли: Администратор (Administrator), Редактор (Editor), Автор (Author), Участник (Contributor), Подписчик (Subscriber).
В чем разница между ними? Что “Автор” может такого, чего не может “Участник”? Исчерпывающую информацию об это можно найти здесь, на WordPress.org (правда на английском языке).
Где же все эти данные о пользовательских ролях WordPress хранятся? Как изменить роль, когда это действительно необходимо? Заинтересовались? Прочтите эту статью и вы найдете ответы на эти вопросы. Я столкнулся с такой проблемой на блоге с несколькими авторами:
Пользователь с ролью “Автор” может загружать изображения на сервер блога, но не может использовать их в своих статьях. Любые тэги HTML немедленно удаляются из текста сразу после сохранения изменений. Тот же пользователь, но уже с ролью “Редактор” преспокойно сохраняет текст статьи с любыми тэгами HTML.
Проблема заключается в том, что WordPress автоматически применяет HTML-фильтры ко всем текстам пользователя, если в его роль не включена возможность/разрешение “unfiltered_html”. Роль “Автор” по-умолчанию не включает разрешение “unfiltered_html”. Таким образом, если вы желаете дать вашим авторам возможность включать изображения или видео в их статьи, вам нужно изменить пользовательскую роль, и вы – на верном пути.
Прежде всего запомните – содержимое пользовательских ролей хранится в таблице базы данных MySQL с названием по-умолчанию “wp_options”. Префикс названия таблицы “wp_” может отличаться в зависимости от того, какой префикс был указан при установке WordPress, далее по тексту я использую префикс “wp_”.
Для продолжения данного исследования вам нужен один из клиентов MySQL (MyPHPAdmin, MySQLyog и т.д.). Подсоединитесь с его помощью к базе данных MySQL вашего блога и продолжайте далее вместе с чтением данной статьи.
Эта SQL-команда поможет вам найти запись, содержащую данные о ролях пользователей WordPress:

SELECT * FROM wp_options WHERE option_name="wp_user_roles"

Получив результат исполнения этой команды, вы увидите, что данные пользовательских ролей хранятся в поле option_value в виде текстовой строки специального формата. Этот формат используется для чтения/записи массивов в языке PHP.

a:5:{
s:13:"administrator";a:2:{s:4:"name";s:13:"Administrator";s:12:"capabilities";a:54:{s:13:"switch_themes";b:1;s:11:"edit_themes";b:1;s:16:"activate_plugins";b:1;s:12:"edit_plugins";b:1;s:10:"edit_users";b:1;s:10:"edit_files";b:1;s:14:"manage_options";b:1;s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:6:"import";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:8:"level_10";b:1;s:7:"level_9";b:1;s:7:"level_8";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;s:12:"delete_users";b:1;s:12:"create_users";b:1;s:17:"unfiltered_upload";b:1;s:14:"edit_dashboard";b:1;s:14:"update_plugins";b:1;s:14:"delete_plugins";b:1;s:15:"install_plugins";b:1;s:13:"update_themes";b:1;s:14:"install_themes";b:1;}}
s:6:"editor";a:2:{s:4:"name";s:6:"Editor";s:12:"capabilities";a:34:{s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;}}
s:6:"author";a:2:{s:4:"name";s:6:"Author";s:12:"capabilities";a:10:{s:12:"upload_files";b:1;s:10:"edit_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:4:"read";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;s:22:"delete_published_posts";b:1;}}
s:11:"contributor";a:2:{s:4:"name";s:11:"Contributor";s:12:"capabilities";a:5:{s:10:"edit_posts";b:1;s:4:"read";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;}}
s:10:"subscriber";a:2:{s:4:"name";s:10:"Subscriber";s:12:"capabilities";a:2:{s:4:"read";b:1;s:7:"level_0";b:1;}}}

Разберем, что мы видим:

  • a:N:{ это начало массива, где “N” – количество элементов массива. Например, “a:5:{” в начале строки означает, что массив ролей состоит из пяти элементов. Вспомните, что WordPress включает как раз 5 ролей.
  • s:N:"строка"; – “s” это строковый тип, N – количество символов в строке. Например, s:6:"author";
  • b:1; – означает логический (Boolean) тип со значением “1” or “True” (Истина)
  • Вот почти и все. Мы узнали, что разрешения хранятся внутри ролей в формате “Наименование-Логическое значение”. Теперь нужно найти разрешение “unfiltered_html” в роли “Editor” (Редактор), скопировать последовательность s:15:"unfiltered_html";b:1; от туда и вставить её в роль “Author” (Автор), сразу после разрешения s:12:"upload_files";b:1;. Чтобы завершить изменение роли, нужно увеличить на 1 количество элементов в массиве “Author” (Автор). По-умолчанию в роль “Author” включено 10 разрешений или в особом формате a:10:{s:12:"upload_files". Таким образом, нам осталось заменить 10 на 11, и в итоге получить этот код a:11:{s:12:"upload_files" внутри роли “Author”.
    Что осталось сделать? Всего лишь внести изменения в таблицу wp_options базы данных MySQL. Для этого используйте такую SQL-команду:

     UPDATE `wp_options` 
    SET option_value='измененное значение для ролей' WHERE option_id=NN;

    Не забудьте заменить ‘измененное значение для ролей’ на откоректированные данные пользовательских ролей, полученные как результат предыдущего запроса, а ‘NN’ – заменить на Id записи таблицы wp_options из того же запроса.
    Внимание! Создайте резервную копию данных из таблицы wp_options до внесения в нее каких-либо изменений. Только после этого экспериментируйте с SQL-командой update.

    Поздравляю, мы внесли изменения в состав разрешений роли пользователя WordPress, не изменив ни строчки PHP кода.

    Я получил информацию о том, как хранятся данные о пользовательских ролях WordPress из этого файла wp-admin\includes\schema.php
    If you wish to change user role capabilities for the WordPress MU blog please read “How to change WordPress MU user role capabilities” post.

    Если изложенный выше материал трудноват для вас либо идея изменить что-либо в пользовательских ролях WordPress посещает вас чаще одного раза в год, то возможно вам будет полезен разработанный мной плагин для WordPress “Редактор ролей пользователей”.
    Он предлагает удобный и простой в использовании интерфейс для редактирования ролей пользователей WordPress.
    Спасибо.

    Tags: ,

  • Юрий

    А вы не могли бы, описать как изменить роль подписчика на автора. У меня после переноса сайта с лок сайта на хостинг, пользователи админы становятся почему то подписчиками (

    • Данные о роли пользователя хранятся в таблице wp_usermeta, например, роль пользователя с ID=1 (встроенного администратора WordPress) можно увидеть, выполнив такой запрос:
      SELECT * FROM wp_usermeta where user_id=1 and meta_key=’wp_capabilities’;
      Поле meta_value в этом случае равно
      a:1:{s:13:”administrator”;s:1:”1″;}
      Следовательно для возвращения утерянной роли администратора вам нужно сначала вычислить ID этих пользователей, а затем выполнить такой запрос:
      update wp_usermeta set meta_value=’a:1:{s:13:”administrator”;s:1:”1″;}’ where user_id in (N1, N2, N3, …);

      Если же таких пользователей немного, то для смены роли пользователя лучше и безопаснее воспользоваться функционалом WordPress – войти в профайл каждого и изменить его роль выбором из списка доступных ролей.

  • Павед

    Чувак, ты что, ненормальный? Вот этот весь хлам (a:5:{s:13:”administrator”) если сделать unserialize в php, ты получишь обычный, нормальный массив в удобочитаемом виде.

    • Не все пользователи WordPress – программисты PHP. На них и ориентирована эта статья, в первую очередь. Программист не будет править эти данные руками. Мне известно об этой технике, я использую её в плагине “Редактор ролей пользователей”.

  • Эрик

    Здравствуйте. А какой командой php можно изменить роль пользователя? Просто мне надо, чтобы пользователь, когда проходит тест автоматом поменял свою роль на другую. Но при перезагрузке тест ему уже будет не доступен. Дурацкий плагин тестов не поддержывает настройку количества прохождений теста определенным зарегистрированным пользователем. =(

    • Добрый вечер.
      В качестве справочника можно использовать функцию edit_user() из wp-admin/includes/user.php
      Код может быть таким:
      $user = wp_get_current_user();
      if (0 !== $user->ID) {
      $user->role = ‘new_role_name’;
      wp_update_user($user);
      }
      Попробуйте. Написал с листа, сам не тестировал.

      • Эрик

        А вместо new_role_name прям так и писать: Участник или Подписчик ?

        • В коде нужно использовать оригинальные английские идентификаторы ролей: contributor, subscriber.

          • Эрик

            ой блин, что делать я не туда код поставил! Он рабочий… Он меня Админа участником сделал… аххаха

          • Посмотрите, в комментариях к этому же посту есть рекомендация, как восстановить роль администратора, если у пользователя она слетела.
            Нужно прямое подключение к базе данных для выполнения SQL-команды.

          • Эрик

            А где он лежит wp_usermeta? Я его найти не могу… И какое у него расширение?

          • wp_usermeta – это не файл, а таблица в базе данных MySQL. Данные о роли пользователя можно изменить SQL-командой, используя phpMyAdmin, например.

          • Эрик

            “Если же таких пользователей немного, то для смены роли пользователя лучше и безопаснее воспользоваться функционалом WordPress – войти в профайл каждого и изменить его роль выбором из списка доступных ролей.”

            Я вот нахожусь в phpMyAdmin (народу зарегистрированного у меня мало) тока не понятно как в профайл попасть…

          • В профайл пользователя WordPress попасть можно только через меню WordPress. Но чтобы его менять нужны права администратора в WordPress. Если у вас есть 2-й пользователь с ролью “Администратор”, то можете воспользоваться этим путём, чтобы вернуть роль администратора своему пользователю.
            phpMyAdmin предлагался для прямого редактирования значений в базе данных. Подумайте о создании резервной копии базы данных прежде чем что-то менять. Это может сэкономить много времени и нервов, если вдруг что-то пойдёт не так.

  • Асмодей Александрович

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

    • Открываете список пользователей. Выбираете вкладку с подписчикми. Отмечаете галками нужных пользователей. Выбираете в верхней части таблицы из выпадающего списка целевую роль. Жмете кнопку рядом для выполнения операции изменения роли.

      • Асмодей Александрович

        Пользователей много, а галки отваливаются при навигации по страницам в списке пользователей. Т.е. зачастую нескольких не выбрать.

  • odejda

    Подскажите, можно например автору ограничить видимые рубрики при создании записи?

  • Дима

    Подскажите, как изменить имена ролей, что бы выпадающем окне было “Учитель, Ученик, Автор…” и т.д.

    • Плагин этого не позволяет. Есть вариант использовать phpMyAdmin и внести изменения на прямую в базу данных
      http://ru.shinephp.com/%D0%BA%D0%B0%D0%BA-%D0%B2%D0%BD%D0%B5%D1%81%D1%82%D0%B8-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-%D1%80%D0%BE%D0%BB%D1%8C-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82/

      • Дима

        Дело в том, что например когда я меняю с {s:4:”name”;s:10:”Subscriber”; на {s:4:”name”;s:10:”Student”; то с учетом того что у меня 1 аккаунт администратора, меня не пускает в админ панель, и пишет что нету прав..

        • В выражении “s:10:” 10 – это количество букв в следующей за ним строке “Subscriber”. Если меняете на “Student”, то и количество букв нужно менять соответственно. Если оставить прежним, структура ломается, поэтому не можете авторизоваться.
          Далее идет “subscriber” – идентификатор роли. Его менять не следует, иначе все пользователи потеряют свою роль. Если поменяете, придётся присваивать роль заново.

  • Игорь Флянку

    Подскажите, как сделать так, чтобы изменение роли, происходило после оплаты, так сказать бесплатного товара.