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

29

Хорошо, я ищу лучший способ атаковать это.

Мне очень удобно работать с PHP и создавать собственные типы записей с настраиваемыми метаполями в WordPress.

Вот что я смотрю на это:

  1. Пользователь регистрируется и устанавливается на подписчика по умолчанию.
  2. Пользователь просит администратора получить разрешение на пользовательский тип записи.
  3. Администратор назначает пользователю другое имя разрешения, например «Владелец магазина».
  4. Пользователь теперь может видеть пользовательский тип сообщения и может сделать запись в этом типе сообщения.
  5. Пользователь может видеть и редактировать только свой пост.

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

  1. Как создать новую «Роль» под названием «Владелец магазина»,
  2. Как дать правильное разрешение указанной роли, чтобы видеть и иметь доступ только к пользовательскому типу записи.
  3. Разрешить только пользователю просматривать и редактировать свои собственные сообщения для этого пользовательского типа сообщения.

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

Любой вклад с благодарностью.

С уважением

Brady
источник

Ответы:

21

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

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

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

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

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

Джон П Блох
источник
Хорошо, теперь я использую плагин Members, чтобы узнать, как работают разрешения для участников. Я установил 'map_meta_cap' => trueи 'capability_type' => 'shopowner'на мой пользовательский тип сообщения. Я создал новую роль с именем ShopOwnerи дал ей возможности read, edit_shopowner, delete_shopowner. Установите пользователя на роль ShopOwner и войдите в систему с этим пользователем. Этот пользователь не может видеть пользовательский тип сообщения. Я что-то пропустил?
Брэди,
2
измените их на edit_shopownersи delete_shopowners. edit_shopownerи delete_shopownerмета-возможности, которые никогда не проверяются. Они проверяются, когда кто-то пытается редактировать или удалять определенный элемент, и заканчивают проверкой таких вещей, как «Может ли этот пользователь удалять эти типы элементов? Может ли он удалять только свои или другие? Может ли он удалять опубликованные элементы?» и т. д.
Джон П Блох
Я не мог понять этого ... но я получил нужную мне функциональность, настроив возможности в своем пользовательском типе поста и создав эти возможности в плагине членов. Я наградил вас ответами, поскольку ваш пост был для меня наиболее полезным, чтобы найти решение вместе. Спасибо
Брэди,
19

Тип записи в реестре имеет параметр, называемый «способности», так что вы можете иметь, например,

'capability' => 'organize_shop',

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

Чтобы создать нового пользователя / роль / возможность, вы можете использовать add_role, add_cap, для простого примера, чтобы вы начали:

// Add the role to WordPress list of roles
// Then add the capability 'organize_shop' to the 'shop_owner' role
$role = add_role( 'shop_owner', 'Shop Owner', ['edit_posts' => true]));
$role->add_cap( 'organize_shop' );


// If 'shop_owner' already exists make `$wp_roles` visible then 
// add the capability 'organize_shop' to the 'Show Owner' role
public $wp_roles;
$wp_roles->add_cap( 'shop_owner', 'organize_shop' );

Уик
источник
хм ... я немного запутался в чем разница между 2 и 3 линиями? : S Разве это не добавляет ту же возможность роли «Владелец магазина»?
Дашалуна
Да, они одинаковы, но они показывают разные способы сделать это, первый включает роль в качестве первого параметра (владелец магазина), второй - только ограничение, поскольку он использует $ role.
Вик
3
Вы должны перевести возможность / разрешение? это __('');
Святослав Маринов
@SvetoslavMarinov Я отредактировал ответ, чтобы удалить перевод.
MikeSchinkel
@dashaluna Я отредактировал ответ, чтобы уточнить его.
MikeSchinkel
1

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

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

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

sillyghost
источник