Intereting Posts
Как я могу исключить категорию из основного цикла с именем категории, а не идентификатором? Элемент меню WordPress (значок) перемещается на страницу! Разрешить постоянные ссылки для работы с дефисами и без них Предупреждения в навигационном меню при посещении страниц запроса Наилучший подход к вызову API для API при поступлении действия «Добавить в корзину» Как вставить путь изображения в базу данных для отображения изображения продукта в wp-admin? Показать окно обрезки изображения при загрузке изображения CDN + WP Admin Query – перенаправление .htaccess Различные способы запроса пользовательских типов сообщений? Как требовать от пользователей входа в систему, если вы не вошли в систему Как интегрировать слайд видео с использованием пользовательских типов сообщений? Включение плагина не удалось, потому что у пользователя MySQL нет разрешений CREATE Когда запускается действие admin_init? Meta Query не работает как ожидаемый Измените формулировку стандартного метаконтакта эскиза

Пусть новая роль пользователя в «edit_others_posts» другой роли пользователя, а не своего собственного типа

В моей системе я делаю две новые роли:

  • Третья сторона ( TP ) (меньшие привилегии)
  • Оператор ввода данных ( DEO ) (мощный над третьей стороной – но не его собственной группы)

Мой параметр CPT «возможности» обновляется с помощью 'map_meta_cap' => true например:

 ... 'capabilities' => array ( 'read' => 'read_cpt', 'edit_posts' => 'edit_cpt' ), 'map_meta_cap' => true ... 

Сценарий: TP может свободно добавлять свое содержимое, но не может публиковать. DEO могут также свободно добавлять их содержимое, а также DEO могут редактировать / изменять содержимое TP и, наконец, публиковать их. Но они ( DEO ) не могут касаться сообщений друг друга о своей собственной роли. Предположим, что «X как DEO » добавила статью «Y как DEO », которая не может касаться ее. Но X и Y могут индивидуально касаться сообщений «Z как TP ».

Добавляя новую роль, я делаю:

 $tp = add_role( 'third_party', __('Third Party'), array( 'read_cpt' => true, 'edit_cpt' => true, //'edit_others_cpt => false //by default not assigned ) ); $deo = add_role( 'data_entry_operator', __('Data Entry Operator'), array( 'read_cpt' => true, 'edit_cpt' => true, 'edit_others_cpt => true ) ); 

Вы знаете, edit_others_cpt получит доступ к ним, редактируя сообщения TP , но не ограничивает их редактированием сообщений своей собственной роли пользователя ( DEO ).

Как я могу позволить DEO «edit_others_posts» только роли TP , а не DEO ?

Solutions Collecting From Web of "Пусть новая роль пользователя в «edit_others_posts» другой роли пользователя, а не своего собственного типа"

Сначала добавьте возможности к таким ролям

 add_action( 'after_setup_theme', 'add_caps_to_custom_roles' ); function add_caps_to_custom_roles() { $caps = array( 'read_cpt', 'edit_cpt', 'edit_others_cpt', ); $roles = array( get_role( 'third_party' ), get_role( 'data_entry_operator' ), ); foreach ($roles as $role) { foreach ($caps as $cap) { $role->add_cap( $cap ); } } } 

ТОГДА

 /** * Helper function getting roles that the user is allowed to create/edit/delete 'TP' post. * * @param WP_User $user * @return array */ function allowed_roles_to_edit_TP_post( $user ) { $allowed = array(); if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles post $allowed = array_keys( $GLOBALS['wp_roles']->roles ); } else ( in_array( 'data_entry_operator', $user->roles ) ) { $allowed[] = 'third_party'; } return $allowed; } /** * Remove roles that are not allowed for the current user role. */ function editable_roles( $roles ) { if ( $user = wp_get_current_user() ) { $allowed = allowed_roles_to_edit_TP_post( $user ); foreach ( $roles as $role => $caps ) { if ( ! in_array( $role, $allowed ) ) unset( $roles[ $role ] ); } } return $roles; } add_filter( 'editable_roles', 'editable_roles' ); /** * Prevent users deleting/editing users with a role outside their allowance. */ function controll_map_meta_cap( $caps, $cap, $user_ID, $args ) { if ( ( $cap === 'read_cpt' || $cap === 'edit_cpt' || $cap === 'edit_others_cpt' ) && $args ) { $the_user = get_userdata( $user_ID ); // The user performing the task $user = get_userdata( $args[0] ); // The user being edited/deleted if ( $the_user && $user ) { $allowed = allowed_roles_to_edit_TP_post( $the_user ); if ( array_diff( $user->roles, $allowed ) ) { // Target user has roles outside of our limits $caps[] = 'not_allowed'; } } } return $caps; } add_filter( 'map_meta_cap', 'controll_map_meta_cap', 10, 4 );