WordPress SEO от Yoast: скрытие метабоксов в записях для неадминистраторов
У меня мультиавторский сайт, и мне не очень комфортно разрешать всем участникам вводить SEO-данные в записи, которые они публикуют. Я хочу, чтобы это было видно только администратору сайта. Есть идеи?
В документации API на сайте плагина Yoast SEO не указано, что такое ID
, и у меня нет доступа к установленной копии Yoast, но согласно файлу yoas-plugin-dir/admin/class-metabox.php
на строке 144, зарегистрированный meta_box выглядит так:
add_meta_box( 'wpseo_meta', ...etc ); ...
Который подключен к хуку add_meta_boxes
на строке 32 того же файла:
add_action( 'add_meta_boxes', array( $this, 'add_meta_box' ) );
Конечно, вы могли бы получить ID из самого meta box на экране редактирования записи... В любом случае.
Вы можете сделать следующее:
add_action('add_meta_boxes', 'yoast_is_toast', 99);
function yoast_is_toast(){
//возможность 'manage_plugins' соответствует администратору, поэтому если НЕ администратор
//скрываем meta box для всех остальных ролей на указанном 'post_type'
//таком как post, page, custom_post_type и т.д.
if (!current_user_can('activate_plugins')) {
remove_meta_box('wpseo_meta', 'post_type', 'normal');
}
}
...где post_type — это тип записи, к которому вы хотите применить это ограничение, например, post
или один или несколько пользовательских типов записей!
Должно сработать.
обновление: manage_plugins
должно было быть activate_plugins
— исправлено.

@Ahmad M, спасибо за предложенное изменение, но переменная $post_type
и параметр аргумента действия не требуются в данном случае и не вызывают уведомлений/ошибок. Кроме того, если вы включаете переменную $post_type
, вам нужно определить тип записи внутри функции в другом месте, чего вы не сделали, поэтому пользователю пришлось бы запускать это, чтобы оно работало неправильно! В данном случае вполне допустимо передать имя типа записи, например 'post'
, напрямую в функцию remove_meta_box
. В любом случае, спасибо за предложение.

@userabuser: Спасибо за разъяснение, но $post_type
уже определена и готова к использованию в функциях хука действия add_meta_boxes
, пожалуйста, смотрите исходный код Adam Brown этого хука действия. Использование $post_type
в данном случае сделает код независимым от экрана редактирования post_type
, что означает, что он удалит метабокс wpseo_meta
со всех типов записей, где он найден, и не вернет ничего, если wpseo_meta
не будет найден.

@AhmadM Спасибо, друг. Я знаю, что переменная уже определена, однако это не делает её обязательной для передачи в хук/функцию. В данном случае автор вопроса хочет удалить метабокс из типа записи post
, поэтому первоначальное решение позволяет точно контролировать этот процесс. Однако, если нужно удалить его для всех типов записей, то использование уже определённой переменной $post_type
вполне приемлемо. Я дополню свой ответ, включив ваш пример с использованием переменной $post_type
для ситуаций, когда это нужно применить ко всем зарегистрированным типам записей.

Попробуйте вставить этот код в файл темы или плагина functions.php
, согласно документации плагина WordPress SEO (API Docs) от Yoast.
if(function_exists('wpseo_use_page_analysis') && !current_user_can('administrator')){
add_filter('wpseo_use_page_analysis', '__return_false');
}
Чтобы избежать ошибок... Этот код проверяет существование функции перед попыткой скрыть элементы, что позволяет деактивировать плагин без возникновения ошибок.
Возможно, вам потребуется подключиться к хуку init
для корректной работы, что можно сделать следующим образом:
function wpse_init(){
if(function_exists('wpseo_use_page_analysis') && !current_user_can('administrator')){
add_filter('wpseo_use_page_analysis', '__return_false');
}
}
add_action('init', 'wpse_init');

Вы можете удалить его с помощью функции remove_meta_box.
if ( ! current_user_can( 'edit_pages' ) ) {
add_action( 'add_meta_boxes', 'my_remove_wp_seo_meta_box', 100000 );
}
function my_remove_wp_seo_meta_box() {
remove_meta_box( 'wpseo_meta', 'post', 'normal' );
}
Обратите внимание на 100000 в add_action — это гарантирует, что действие выполнится после того, как метабокс WP SEO будет подключен.

Вы можете использовать плагин Adminimize, чтобы скрывать элементы от пользователей в зависимости от их ролей. Я сам использовал его, чтобы скрыть некоторые элементы Yoast SEO от клиентов и упростить интерфейс административной панели.
http://wordpress.org/extend/plugins/adminimize/
Довольно просто в использовании: достаточно добавить CSS-селекторы элементов, которые вы хотите скрыть. Я использовал его, чтобы скрыть вкладки анализа SEO страницы (#linkdex).

В WordPress SEO от Yoast есть настройка, позволяющая отключить расширенную часть параметров SEO для пользователей без прав администратора. Если вы хотите полностью отключить этот блок, можно воспользоваться другими плагинами для удаления элементов страницы редактора записей для не-администраторов, например, удаления блока WordPress SEO из редактора записей для пользователей без прав администратора.
