Разрешения роли пользователя на основе таксономий

Мне было интересно, можно ли настраивать роли пользователей таким образом, чтобы пользователи в определенных группах могли ТОЛЬКО редактировать сообщения, которые имеют определенную таксономию, назначенные им, например:

Properties (Post Type) Taxonomy One Taxonomy Two Taxonomy Three User Roles Group One - Can only edit properties with 'Taxonomy One' assigned. Group Two - Can only edit properties with 'Taxonomy Two' assigned. Group Three - Can only edit properties with 'Taxonomy Three' assigned. 

Я использую плагин Members для управления ролью на данный момент, и я использую пользовательские типы сообщений / таксономии.

Из того, что я видел до сих пор, не похоже, что вы можете ограничить доступ к POSTS на основе TAXONOMIES.

ОБНОВИТЬ

Теперь у меня есть разрешения для работы с сообщениями, используя следующий код:

 register_post_type( 'properties', array( 'labels' => array( 'name' => __( 'Properties' ), 'singular_name' => __( 'Property' ) ), 'public' => true, 'capability_type' => 'property', 'map_meta_cap' => true, 'capabilities' => array( 'publish_posts' => 'publish_properties', // This allows a user to publish a property. 'edit_posts' => 'edit_properties', // Allows editing of the user's own properties but does not grant publishing permission. 'edit_others_posts' => 'edit_others_properties', // Allows the user to edit everyone else's properties but not publish. 'delete_posts' => 'delete_properties', // Grants the ability to delete properties written by that user but not others' properties. 'delete_others_posts' => 'delete_others_properties', // Capability to edit properties written by other users. 'read_private_posts' => 'read_private_properties', // Allows users to read private properties. 'edit_post' => 'edit_property', // Meta capability assigned by WordPress. Do not give to any role. 'delete_post' => 'delete_property', // Meta capability assigned by WordPress. Do not give to any role. 'read_post' => 'read_property', // Meta capability assigned by WordPress. Do not give to any role. ) ) ); 

Раздел «Свойства» теперь появляется при редактировании ролей в плагине «Члены», который позволяет мне ограничивать / разрешать доступ. Просто нужно выяснить, возможно ли это для каждой таксономии сейчас 🙂

Я действительно выкопал этот блог разработчиков плагинов, и это то, что он предлагает, как прозрение.

Возможности Meta – это возможности, предоставляемые пользователем для каждой должности. Мы имеем дело с тремя:

edit_post delete_post read_post

Для регулярных сообщений в блоге WordPress «сопоставляет» их с конкретными возможностями, предоставляемыми ролям пользователей. Например, пользователю может быть предоставлена ​​возможность edit_post для сообщения 100, если они являются авторами сообщения или имеют возможность edit_others_posts.

При использовании пользовательских типов сообщений это сопоставление происходит не автоматически, если вы настраиваете пользовательские возможности. Мы должны придумать собственное решение.

В этом уроке …

http://justintadlock.com/archives/2010/07/10/meta-capabilities-for-custom-post-types

* Я не могу прокомментировать, поэтому я опубликовал в качестве ответа.

Возможно, вы сможете использовать фильтр user_has_cap который используется при проверке определенной возможности (находится в /wp-includes/class-wp-user.php в has_cap ):

  /** * Dynamically filter a user's capabilities. * * @since 2.0.0 * @since 3.7.0 Added the user object. * * @param array $allcaps An array of all the user's capabilities. * @param array $caps Actual capabilities for meta capability. * @param array $args Optional parameters passed to has_cap(), typically object ID. * @param WP_User $user The user object. */ $capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this ); 

Так что это будет что-то вроде:

 add_filter('user_has_cap','check_post_taxonomy',10,4); function check_post_taxonomy($allcaps,$caps,$args,$user) { global $post; if (!isset($post)) {return $allcaps;} $group = get_user_meta($user->ID,'special_edit_group',true); $taxonomy = 'taxonomy_'.$group; // maybe set to a, b or c? $terms = get_the_terms($post->ID,$taxonomy); // if there are no terms, remove the user capability(s) for this check // you may have to experiment to remove all the ones you want to if (!$terms) { unset($allcaps['edit_properties']); } return $allcaps; } не add_filter('user_has_cap','check_post_taxonomy',10,4); function check_post_taxonomy($allcaps,$caps,$args,$user) { global $post; if (!isset($post)) {return $allcaps;} $group = get_user_meta($user->ID,'special_edit_group',true); $taxonomy = 'taxonomy_'.$group; // maybe set to a, b or c? $terms = get_the_terms($post->ID,$taxonomy); // if there are no terms, remove the user capability(s) for this check // you may have to experiment to remove all the ones you want to if (!$terms) { unset($allcaps['edit_properties']); } return $allcaps; } 

Я сделал это так, потому что понял, что логика вопроса не совсем правильная. Если тип сообщения имеет таксономию A, B и C, назначаемую ему, даже если вы установите эти фильтры возможностей для групп ролей, как вы говорите, все три группы ролей смогут в любом случае редактировать что-либо в этом типе сообщений. Другими словами, нет случая, когда таксономия A, B или C фактически не назначена.

Вместо этого, я думаю, вы действительно имеете в виду «проверить, имеет ли этот конкретный пост какие-либо термины, назначенные ему в таксономии A» … и если это так, то группа A для его редактирования и так далее. (Примечание: я понятия не имею, будет ли приведенный выше код действительно работать для этого случая, может потребоваться еще одна работа. Например, в настоящее время это проверка мета-ключа пользователя для группы, а не фактическая роль / группа.)