Разрешить участнику иметь доступ только к пользовательскому типу записей. Разрешение на редактирование только своих записей

12 апр. 2011 г., 13:08:21
Просмотры: 68.2K
Голосов: 35

Хорошо, я ищу лучший способ решения этой задачи.

Я хорошо знаком с PHP и созданием пользовательских типов записей с настраиваемыми мета-полями в WordPress.

Вот что я хочу сделать:

  1. Пользователь регистрируется и по умолчанию получает роль подписчика.
  2. Пользователь запрашивает у администратора разрешение на доступ к пользовательскому типу записей.
  3. Администратор назначает пользователю другую роль, например "Shop Owner".
  4. Теперь пользователь может видеть пользовательский тип записей и создавать записи этого типа.
  5. Пользователь может видеть и редактировать только свои записи.

Мне нужна помощь в следующем:

  1. Как создать новую роль "Shop Owner",
  2. Как предоставить этой роли правильные разрешения для просмотра и доступа только к пользовательскому типу записей.
  3. Разрешить пользователю видеть и редактировать только свои записи этого пользовательского типа.

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

Буду благодарен за любую помощь.

С уважением

0
Все ответы на вопрос 5
3
22

Используйте плагин Джастина Тэдлока "Members". Он предоставляет возможность создавать новые роли и редактировать существующие, а также добавлять пользовательские возможности. Вся работа, которую вам пришлось бы делать вручную, сводится к нескольким кликам.

Я знаю, что вы упомянули в комментарии к ответу ZaMoose, что хотите "написать функциональность самостоятельно, чтобы иметь полный контроль над всем". Это упускает всю суть программного обеспечения с открытым исходным кодом. Джастин Тэдлок выпустил свой плагин именно для того, чтобы вы МОГЛИ иметь полный контроль над всем.

Если вы действительно очень хотите изобретать велосипед, потенциально тратя сотни часов своего времени, я не могу вас остановить, но вы могли бы хотя бы сэкономить себе время и использовать плагин Тэдлока, чтобы изучить, как сделать то, что вам нужно.

Как только у вас будет плагин с нужной функциональностью, вам нужно изменить флаг 'map_meta_cap' на true и флаг 'capability_type' в функции регистрации типа записи, чтобы он указывал что-то отличное от 'post', 'page' или любого другого 'зарезервированного' типа. Затем продублируйте все возможности, связанные с записями (например, edit_posts, edit_others_posts, publish_posts и т.д.), используя ваш тип возможностей вместо posts. Убедитесь, что все эти разрешения назначены администраторам (вы не сможете увидеть тип записи, пока не сделаете это), затем создайте свою роль, имитируя возможности роли 'contributor' для вашего типа записи.

Например, если ваш тип возможностей был foobars, вы бы хотели дать 'владельцам магазинов' возможности edit_foobars, delete_foobars и read. Таким образом, они смогут создавать свои черновики foobars и удалять эти черновики, но поскольку у них нет возможности publish_foobars, они должны отправлять их на утверждение. Так как у них нет edit_published_foobars, все изменения к утверждённому foobar должны быть одобрены.

12 апр. 2011 г. 17:49:40
Комментарии

ОК, я сейчас использую плагин Members, чтобы разобраться, как работают разрешения для участников. Я установил 'map_meta_cap' => true и 'capability_type' => 'shopowner' для своего пользовательского типа записи. Создал новую роль под названием ShopOwner и дал ей права read, edit_shopowner, delete_shopowner. Назначил пользователю роль ShopOwner и вошел под этим пользователем. Этот пользователь не видит пользовательский тип записи. Я что-то упустил?

Scott Scott
12 апр. 2011 г. 19:33:56

измените их на edit_shopowners и delete_shopowners. edit_shopowner и delete_shopowner — это мета-права, которые на самом деле никогда не проверяются. Они проверяются, когда кто-то пытается редактировать или удалить конкретный элемент, и в конечном итоге проверяют такие вещи, как "Может ли этот пользователь удалять элементы этого типа? Может ли он удалять только свои или чужие тоже? Может ли он удалять опубликованные элементы?" и т. д.

John P Bloch John P Bloch
12 апр. 2011 г. 19:43:26

Я не смог разобраться в этом... но получил нужную функциональность, установив права в моем пользовательском типе записи и создав эти права в плагине Members. Я отметил ваш ответ как решение, так как он был наиболее полезным для меня, чтобы собрать решение воедино. Спасибо.

Scott Scott
12 апр. 2011 г. 20:03:46
7
21

Функция register_post_type имеет параметр "capabilities", который позволяет указать права доступа, например:

'capability' => 'organize_shop',

http://codex.wordpress.org/Function_Reference/register_post_type

Для создания нового пользователя/роли/права можно использовать add_role и add_cap. Простой пример для начала:

// Добавляем роль в список ролей WordPress
// Затем добавляем право 'organize_shop' для роли 'shop_owner'
$role = add_role( 'shop_owner', 'Владелец магазина', ['edit_posts' => true]));
$role->add_cap( 'organize_shop' );


// Если роль 'shop_owner' уже существует, делаем `$wp_roles` доступной,
// затем добавляем право 'organize_shop' для роли 'Владелец магазина'
public $wp_roles;
$wp_roles->add_cap( 'shop_owner', 'organize_shop' );

12 апр. 2011 г. 18:06:32
Комментарии

Хм... Я немного запутался, в чем разница между 2 и 3 строками? :S Разве они не добавляют одинаковые возможности для роли 'Shop Owner'?

dashaluna dashaluna
13 сент. 2011 г. 14:36:02

Да, они одинаковые, но демонстрируют разные способы сделать это: в первом случае роль передается первым параметром (Shop Owner), во втором - только capability, так как используется $role.

Wyck Wyck
13 сент. 2011 г. 14:43:09

Должны ли вы переводить capability/права доступа? Это __('');

Svetoslav Marinov Svetoslav Marinov
4 нояб. 2015 г. 18:55:41

@SvetoslavMarinov Я отредактировал ответ, чтобы убрать перевод.

MikeSchinkel MikeSchinkel
24 февр. 2019 г. 05:41:43

@dashaluna Я отредактировал ответ, чтобы сделать его понятнее.

MikeSchinkel MikeSchinkel
24 февр. 2019 г. 05:51:50

@MikeSchinkel круто

Svetoslav Marinov Svetoslav Marinov
24 февр. 2019 г. 10:52:05

У функции register_post_type нет аргумента capability, только capabilities и capability_type

Flimm Flimm
13 июл. 2022 г. 14:09:15
Показать остальные 2 комментариев
1

Вы рассматривали возможность использования Gravity Forms или TDO Mini Forms для обработки отправки контента? Каждый из них обладает функционалом, который значительно упростит работу с пользовательским контентом.

12 апр. 2011 г. 16:37:10
Комментарии

Спасибо за ответ, но это не совсем то, что я ищу. Основная причина в том, что это плагины. Я хочу самостоятельно реализовать функционал, чтобы иметь полный контроль над всем.

Scott Scott
12 апр. 2011 г. 17:09:07
0

Более простой и эффективный способ достижения этого — установка плагина под названием "Advanced Access Manager". Вам не придётся писать функциональность самостоятельно, при этом вы получите достойный уровень контроля над пользователями, ролями и их возможностями. Большинство необходимых функций можно реализовать с помощью этого плагина.

24 февр. 2019 г. 10:54:01
0

Я понимаю, что это довольно специфичный случай, но он занял у меня час, чтобы разобраться.

У меня был включён плагин: WP Custom Admin Interface, с помощью которого можно настраивать административное меню для конкретных пользователей. Если вы регистрируете пользовательский тип записи после включения и настройки меню, то в 'Custom Admin Interface' >> 'Admin Menu' есть кнопка под названием 'Add newly added menu items'. Затем нажмите 'Save', и если пункт меню доступен для этого типа пользователя, то после этого он заработает.

19 авг. 2021 г. 10:44:42