WordPress SEO от Yoast: Скрыть мета-боксы в сообщениях для не-администраторов

9

У меня есть веб-сайт с несколькими авторами, и мне не очень удобно позволять всем участникам вводить детали SEO в публикуемые ими сообщения. Хотелось бы, чтобы это было видно только администратору сайта. Любые идеи?

Аудрюс
источник

Ответы:

19

В документации по API на сайте плагинов Yoast не было сказано, что это 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' ) );

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

Вы можете сделать следующее,

add_action('add_meta_boxes', 'yoast_is_toast', 99);
function yoast_is_toast(){
    //capability of 'manage_plugins' equals admin, therefore if NOT administrator
    //hide the meta box from all other roles on the following 'post_type' 
    //such as post, page, custom_post_type, etc
    if (!current_user_can('activate_plugins')) {
        remove_meta_box('wpseo_meta', 'post_type', 'normal');
    }
}

... где тип сообщения - это тип сообщения, к которому вы хотите применить это ограничение, например, postили пользовательский тип сообщения один или несколько!

Должен сделать свое дело.

обновление: manage_pluginsдолжно быть activate_plugins- исправлено.

Адам
источник
16
+1 за yoast_is_toast().
Кайзер
@ Ахмад М спасибо за предложенное редактирование, но $post_typeпараметр аргумента var и action в этом случае не требуется и не выдает уведомление / ошибку. Также, если вы включите $post_typevar, вам нужно определить тип записи в функции где-то еще, чего вы не делали, так что пользователь мог бы запустить ее, чтобы она работала неправильно! В этом случае вполне допустимо передавать имя типа сообщения, то есть 'post'непосредственно в remove_meta_boxфункцию. В любом случае, спасибо за предложение.
Адам
@userabuser: Спасибо за разъяснения, но $post_typeон уже определен и готов к использованию add_meta_boxesфункциями ловушек действий, см. представление Адама Брауна об этой ловушке действий. Использование $post_typeв этом случае сделает код независимым от post_typeэкрана редактирования, а это означает, что он удалит wpseo_metaмета-поле из всех типов сообщений, в которых он найден, и не вернет ничего, если wpseo_metaон не найден.
Ахмад М
@AhmadM Спасибо, приятель. Я знаю, что переменная уже определена, однако это не делает необходимым переход в хук / функцию. В этом случае OP хочет удалить мета-блок из postpost_type, поэтому первоначальное решение позволит получить детальный контроль. Однако в случае, если вы хотите удалить его для всех типов записей, тогда использование уже определенного var $post_typeвполне приемлемо. Что я сделаю, так это отредактирую свой ответ, включив в него ваш дополнительный пример, используя $post_typeпеременную для ситуаций, когда кто-то может захотеть применить это ко всем зарегистрированным типам post_type.
Адам
5

Попробуйте вставить это в плагин или 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');
Майкл Эклунд
источник
4

Вы можете удалить его, используя функцию 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 был подключен.

Малыш стройнее
источник
2

Вы можете использовать плагин Adminimize, чтобы скрыть элементы от пользователей в зависимости от их ролей. Я использовал это сам, чтобы скрыть некоторые вещи Yoast SEO от клиентов и упростить серверную часть.

http://wordpress.org/extend/plugins/adminimize/

Довольно просто использовать, добавив селекторы css для элементов, которые вы хотите скрыть. Использовали его, чтобы скрыть вкладки SEO Page Analysis (#linkdex)

noelmcg
источник
0

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

user36226
источник