Как изменить права доступа к настройкам плагина?

28 июл. 2014 г., 14:02:43
Просмотры: 19.4K
Голосов: 5

У меня есть 3 разные роли: Администратор, Редактор и SEO. Я установил плагин WordPress SEO от Yoast и хочу добиться следующего:

  • Я не хочу, чтобы редакторы видели SEO-настройки, так как они только пишут статьи и не разбираются в SEO. Есть человек с ролью SEO, который будет заниматься оптимизацией.
  • Я не хочу, чтобы SEO-специалист видел настройки других плагинов. Мне нужно, чтобы у него были те же права, что у редакторов, но с доступом к SEO-функциям.

Я пробовал использовать различные сниппеты с этого сайта и смог скрыть метабокс для Редакторов, но не смог убрать маленький 'рейтинговый блок' над кнопкой Опубликовать.

Также я не знаю, как решить вторую проблему, потому что все плагины используют одну и ту же capability manage_options, поэтому я не могу назначить эту capability роли SEO. И я не знаю, как изменить требуемую capability без изменения файлов плагина (что будет потеряно при обновлении).

Заранее спасибо.

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

используйте manage_options для SEO, затем установите правила для роли SEO в файле functions.php вашей темы, чтобы запретить доступ к другим страницам админки плагинов. Вы можете перенаправлять эти страницы на 404.

тнє Sufi тнє Sufi
28 июл. 2014 г. 15:45:12

Может быть решением, @тнєSufi. Я исследовал возможность скрытия пунктов меню с помощью remove_menu_page и получил некоторые результаты. Я знаю, что это не предотвращает доступ, но на этот раз речь идет о визуальном аспекте.

Elías Gómez Elías Gómez
29 июл. 2014 г. 16:58:24

да, это не предотвращает. но вы можете перенаправить эти страницы на 404, поэтому любой с ролью SEO, пытающийся получить доступ к этим страницам по прямой ссылке, увидит страницу 404.

тнє Sufi тнє Sufi
29 июл. 2014 г. 21:19:13
Все ответы на вопрос 3
2

Возможно, это не самый лучший метод, поскольку он предоставляет редактору доступ к Настройкам и Опциям, но он дает конкретному редактору (на основе ID пользователя) разрешение на редактирование опций. Затем мы проверяем, загружаем ли мы один из шаблонов опций — если да И ID пользователя совпадает с тем, которому мы дали права, прерываем процесс и выводим сообщение.

1) Первым делом создайте пользователя для SEO и назначьте ему роль Редактора.

2) Далее нам нужно дать этому пользователю возможность manage_options. Вы можете найти это, отредактировав пользователя и посмотрев URL — он должен быть одним из последних параметров в адресе.

/** Даем нашему SEO-специалисту права **/
function give_seo_yoastToast() {
    $user = new WP_User( $seo_user_id );
    $user->add_cap( 'manage_options');
}
add_action( 'admin_init', 'give_seo_yoastToast');

3) Теперь нужно убедиться, что наш SEO-специалист не сможет получить доступ к критически важным настройкам. Насколько мне известно, страницы ниже — единственный способ, которым этот пользователь может редактировать важную информацию. ЕСЛИ он попытается открыть эти страницы, мы прерываем процесс и выводим сообщение — можете изменить текст сообщения на свой вкус.

/** Запрещаем доступ к определенным страницам **/
add_action( 'load-options-general.php', 'prevent_seoguy_access' );
add_action( 'load-options-writing.php', 'prevent_seoguy_access' );
add_action( 'load-options-reading.php', 'prevent_seoguy_access' );
add_action( 'load-options-discussion.php', 'prevent_seoguy_access' );
add_action( 'load-options-media.php', 'prevent_seoguy_access' );
add_action( 'load-options-permalink.php', 'prevent_seoguy_access' );
add_action( 'load-options.php', 'prevent_seoguy_access' );
function prevent_seoguy_access(){
    $currID = is_user_logged_in() ? get_current_user_id() : 0;

    if($currID == $seo_user_id ){
        wp_die("Здесь когда-то была дыра, но теперь её нет.");
        exit();
    }
}

4) Сейчас он может видеть страницы в меню, но при попытке доступа к ним увидит сообщение выше. В качестве дополнительного шага давайте полностью удалим эти страницы из меню. Обратите внимание, что если вы просто удалите страницу из меню без функции выше, технически подкованный пользователь сможет перейти к любой из страниц настроек напрямую через URL.

/** Удаляем страницу настроек из меню для SEO-специалиста **/
function seo_guy_menu() {
    if(!current_user_can('administrator')){
        remove_menu_page('options-general.php');
    }
}
add_action('admin_menu', 'seo_guy_menu');

5) Готово!

К сожалению, как вы отметили в своем вопросе, Yoast, похоже, не имеет возможности дать пользователю специфические права на все SEO-настройки без предоставления лишних разрешений, что довольно печально. И еще одно замечание: вместо статичного $seo_user_id вы можете создать роль "SEO-специалист", дать этой роли права редактора вместе с указанными выше. Это потребует немного больше работы (но не слишком много), но если у вас всегда будет только один человек, занимающийся SEO, то приведенный выше метод вполне подойдет.

28 июл. 2014 г. 18:10:48
Комментарии

Спасибо за третий пункт. Сейчас это мне не нужно, но может пригодиться в будущем. Мне удалось скрыть 'рейтинг бокс' с помощью условной функции и CSS. Это чисто визуальная проблема, так что решение работает.

Elías Gómez Elías Gómez
29 июл. 2014 г. 17:04:38

Обратите внимание, что WP_User->add_cap будет записывать в базу данных, поэтому подключение этого к admin_init в: add_action( 'admin_init', 'give_seo_yoastToast'); создает ненужную нагрузку.

Вместо этого Кодекс рекомендует выполнять это при активации темы/плагина. Например:

add_action("after_switch_theme", "your_add_cap_function");

и

add_action('switch_theme', 'your_remove_cap_function');

Или выполнить один раз и отключить код.

Pim Schaaf Pim Schaaf
4 дек. 2015 г. 15:57:24
3

Лучший способ изменить требуемые права пользователей для доступа к страницам настроек Yoast SEO — использовать фильтр wpseo_manage_options_capability.

Вот пример использования (добавьте в файл functions.php):

/**
 * Возвращает права, необходимые пользователям для доступа к страницам настроек Yoast SEO.
 *
 * @return mixed|void
 */
function my_custom_wpseo_manage_options_capability() {

    $manage_options_cap = 'edit_others_posts';

    return $manage_options_cap;
}
add_filter( 'wpseo_manage_options_capability', 'my_custom_wpseo_manage_options_capability' );

В приведенном примере используется право edit_others_posts, чтобы (в стандартной установке WordPress) и редакторы, и администраторы могли получать доступ к настройкам Yoast SEO.

Если вы не хотите, чтобы обычные редакторы имели доступ, вам нужно создать новую роль (например, 'SEO') с такими же правами, как у редактора, но с дополнительным кастомным правом (например, manage_wpseo_options), которое можно использовать в функции выше вместо edit_others_posts.

Плагин Members от Justin Tadlock позволяет легко создавать новые роли и права для этого.

Примечание: На Multisite это может не работать из-за этой проблемы.


Обновление: В Yoast SEO v5.5+ фильтр wpseo_manage_options_capability был переименован в wpseo_manage_options.

13 сент. 2016 г. 17:35:07
Комментарии

что означает часть @return mixed|void ??

Mau Mau
14 авг. 2017 г. 05:12:34

Тег @return используется для документирования возвращаемого значения функций или методов при использовании phpDocumentor. @return mixed|void означает, что возвращаемое функцией значение может быть любого типа, или void (т.е. функция может не возвращать значение).

Matt Sims Matt Sims
14 авг. 2017 г. 11:53:02

Этот ответ должен быть выбран как правильный.

Matthew Clark Matthew Clark
14 сент. 2017 г. 16:53:07
0

Я только что нашел очень простое решение. Если вы еще этого не сделали — установите какой-нибудь плагин для управления правами. Затем создайте новое право через этот плагин — назовите его "CUSTOM_CAPABILITY_NAME" или как вам угодно. После этого назначьте его конкретной роли или пользователю.

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

Затем на самом сервере перейдите в каталог wp-content/plugins/ и с помощью grep найдите все файлы, содержащие 'manage_options'.

Пример: grep 'manage_options' */*

Сложность в том, что вам нужно найти главную функцию, которая добавляет меню или подменю в админ-панель. Вот два моих примера для доступа к Yoast SEO.

// Применяем фильтр для изменения требуемого права доступа к настройкам
$manage_options_cap = apply_filters( 'wpseo_manage_options_capability', 'CUSTOM_CAPABILITY_NAME' );

// Добавляем подменю с указанием нашего кастомного права доступа
add_submenu_page( 'wpseo_dashboard', __( 'Настройки WooCommerce SEO', 'yoast-woo-seo' ), __( 'WooCommerce SEO', 'yoast-woo-seo' ), 'CUSTOM_CAPABILITY_NAME', $this->short_name, array(

P.S. — не изменяйте ничего, что начинается с '$' — это переменные. :)

9 апр. 2016 г. 01:57:15