Как изменить права доступа к настройкам плагина?
У меня есть 3 разные роли: Администратор
, Редактор
и SEO
. Я установил плагин WordPress SEO от Yoast и хочу добиться следующего:
- Я не хочу, чтобы редакторы видели SEO-настройки, так как они только пишут статьи и не разбираются в SEO. Есть человек с ролью
SEO
, который будет заниматься оптимизацией. - Я не хочу, чтобы SEO-специалист видел настройки других плагинов. Мне нужно, чтобы у него были те же права, что у редакторов, но с доступом к SEO-функциям.
Я пробовал использовать различные сниппеты с этого сайта и смог скрыть метабокс для Редакторов
, но не смог убрать маленький 'рейтинговый блок' над кнопкой Опубликовать.
Также я не знаю, как решить вторую проблему, потому что все плагины используют одну и ту же capability manage_options
, поэтому я не могу назначить эту capability роли SEO
. И я не знаю, как изменить требуемую capability без изменения файлов плагина (что будет потеряно при обновлении).
Заранее спасибо.

Возможно, это не самый лучший метод, поскольку он предоставляет редактору доступ к Настройкам и Опциям, но он дает конкретному редактору (на основе 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, то приведенный выше метод вполне подойдет.

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

Обратите внимание, что 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');
Или выполнить один раз и отключить код.

Лучший способ изменить требуемые права пользователей для доступа к страницам настроек 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
.

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

Я только что нашел очень простое решение. Если вы еще этого не сделали — установите какой-нибудь плагин для управления правами. Затем создайте новое право через этот плагин — назовите его "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. — не изменяйте ничего, что начинается с '$' — это переменные. :)
