Intereting Posts
the_category () не работает в цикле wp_query Как удалить сломанную тему из WordPress Admin (без FTP или Cpanel) Хорошо ли переименовать папку тем, загруженную с WordPress.org? функция, инициированная фильтром «manage_users_custom_column», не работает Получать вложения для сообщений, относящихся к определенной категории Фильтр поиска и сортировка по пользовательскому типу сообщения Несколько кодов Google Analytics для отдельных страниц WordPress – администратор управляет сообщениями – несколько фильтров по родительской категории В чем смысл рекомендуемых WordPress классов css и где они применяются? Чрезмерная память, используемая update_option () Как создать ВРЕМЕННОЕ Загрузка ссылок в WordPress POST? Пользовательский идентификатор для определенного пункта меню? Отключить wp_is_mobile () Показывать сообщения Loop для каждого родителя и для каждого ребенка post_parent в настраиваемом типе сообщений

Только пользователь роли пользователя может комментировать не другие

Я отметил вариант: «Пользователи должны быть зарегистрированы и войти в систему, чтобы комментировать» в разделе «Настройки администратора» -> «Обсуждение», но я хочу, чтобы только пользователь роли пользователя мог комментировать не другие роли типа пользователя.

Благодаря,

Solutions Collecting From Web of "Только пользователь роли пользователя может комментировать не другие"

Я предлагаю добавить фрагмент к файлу темы, в который загружается форма комментариев, которая проверяет, есть ли зарегистрированный пользователь, а затем, если этот пользователь Абонент, затем покажет форму комментариев. В приведенных ниже примерах используется тема «Двадцать шестнадцать»:

В комментариях.php:

// First, get the current user and check their role $user = wp_get_current_user(); if ( in_array( 'subscriber', (array) $user->roles ) ) { // The current user has the subscriber role, show the form comment_form( array( 'title_reply_before' => '<h2 id="reply-title" class="comment-reply-title">', 'title_reply_after' => '</h2>', ) ); } 

Таким образом, только те пользователи с ролью подписчика будут видеть форму комментариев.

Похоже, в первый раз, когда основной wp_get_current_user() находится внутри метода WP::init() .

Чтобы лучше понять контекст, мы видим, что он сразу после крюка after_setup_theme и непосредственно перед after_setup_theme init src :

 do_action( 'after_setup_theme' ); // Set up current user. $GLOBALS['wp']->init(); do_action( 'init' ); 

где WP::init() определяется как src :

 public function init() { wp_get_current_user(); } 

wp_get_current_user() является оберткой для _wp_get_current_user() которая содержит вызовы wp_set_current_user() различными способами, например, с помощью wp_set_current_user(0) для wp_set_current_user(0) из системы пользователей.

Вот одно предложение, set_current_user действие set_current_user в wp_set_current_user() :

 /** * Comments only open for users with the 'subscriber' role */ add_action( 'set_current_user', function() use ( &$current_user ) { if( $current_user instanceof \WP_User && $current_user->exists() && in_array( 'subscriber', (array) $current_user->roles, true ) ) return; add_filter( 'comments_open', '__return_false' ); } ); 

Если текущий пользователь имеет роль подписчика , ничего не делайте. Для всех других пользователей или посетителей комментарии принудительно закрыты.

Возможно, я слишком осторожен, проверяя экземпляр объекта \WP_User , но все равно сохраняю его, так как можно комбинировать с $current_user , как и многие другие вещи в WordPress 😉

Причина использования $current_user здесь вместо вызова wp_get_current_user() заключается в том, чтобы избежать возможного бесконечного цикла, но есть способы справиться с этим, если это необходимо. Также возникает соблазн играть с фильтром define_current_user.

Для посетителей (не вошедших в систему) wp_get_current_user() вернет объект \WP_User с идентификатором 0 и ролями в качестве пустого массива. Это из-за упомянутых выше вызовов wp_set_current_user(0) .

Здесь $current_user->exists() – это оболочка для ! empty( $current_user->ID) ! empty( $current_user->ID) .

Я согласен с @TammyShipps относительно массива кастинг ролей, но, как заметил @cybmeta, только скрытие формы комментария не остановит других пользователей от комментариев.

Другой подход – немного переписать мой недавний ответ здесь :

 /** * Comments only open for users with the 'subscriber' role */ add_action( 'init', function() { $u = wp_get_current_user(); if( $u->exists() && in_array( 'subscriber', (array) $u->roles, true ) ) return; add_filter( 'comments_open', '__return_false' ); } ); 

Оба этих метода должны останавливать прямые запросы POST в файле wp-comments-post.php из-за проверки comments_open() . Я не проверял, но думаю, что он также будет работать с xml-rpc.

Мы могли бы также попробовать pre_comment_on_post чтобы остановить обработку комментариев, например, бросив \WP_Error .

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

  add_filter( 'init', 'manage_comment'); function manage_comment() { global $current_user; $user_roles = $current_user->roles; $user_role = array_shift($user_roles); if ($user_role!='subscriber') { add_filter( 'comments_open', '__return_false' ); } }