Разрешить участнику иметь доступ только к пользовательскому типу записей. Разрешение на редактирование только своих записей
Хорошо, я ищу лучший способ решения этой задачи.
Я хорошо знаком с PHP и созданием пользовательских типов записей с настраиваемыми мета-полями в WordPress.
Вот что я хочу сделать:
- Пользователь регистрируется и по умолчанию получает роль подписчика.
- Пользователь запрашивает у администратора разрешение на доступ к пользовательскому типу записей.
- Администратор назначает пользователю другую роль, например "Shop Owner".
- Теперь пользователь может видеть пользовательский тип записей и создавать записи этого типа.
- Пользователь может видеть и редактировать только свои записи.
Мне нужна помощь в следующем:
- Как создать новую роль "Shop Owner",
- Как предоставить этой роли правильные разрешения для просмотра и доступа только к пользовательскому типу записей.
- Разрешить пользователю видеть и редактировать только свои записи этого пользовательского типа.
В идеале я бы предпочел, чтобы все это делалось из wp-admin, но я предполагаю, что мне может понадобиться создать фронтенд для получения того точного контроля, который я ищу.
Буду благодарен за любую помощь.
С уважением
Используйте плагин Джастина Тэдлока "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 должны быть одобрены.

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

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

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

Функция 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' );

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

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

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

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

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

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

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

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