хотя я думаю, что понимаю иерархию ролей в WordPress, я никогда не беспокоился о создании собственных пользовательских ролей или пользовательских возможностей.
То, что мне нужно достичь, – это присвоить несколько возможностей определенным пользователям (которые могут принадлежать к разным ролям: авторам, подписчикам, вкладчикам …). Я планирую использовать эти возможности, чтобы назначать некоторые значки в моем сообществе, основанном на BuddyPress, или запускать некоторые действия / события в других контекстах (например, скидки в магазине WooCommerce). На данный момент я не планирую использовать их для ограничения доступа к контенту.
Я понимаю, что WordPress не позволяет пользователям иметь несколько ролей (и это немного расстраивает). Но я не знаю, как обратиться к моему делу. Возможно, мне захочется иметь подписчика с новой возможностью «x», а также вкладчика с новой возможностью «x», а также некоторых абонентов с возможностью «y», но не «x». Мне нецелесообразно создавать несколько новых пользовательских ролей только для соответствия всем комбинациям.
Альтернативный подход будет аналогичен bbPress. Я заметил, что bbPress имеет свои собственные роли пользователя, которые могут быть назначены пользователям, у которых могут быть роли WordPress. Как соприкасаться со своими собственными ролями? (и возможность редактировать такие роли для пользователей из панелей администратора пользователя?)
Или же в качестве альтернативы я должен забыть о ролях / возможностях пользователей и вместо этого использовать user_meta?
Спасибо
В WordPress довольно просто создавать пользовательские роли, а также назначать определенные возможности для определенных пользовательских ролей (независимо от того, из основного или пользовательского).
В моих плагинах я часто создаю роль пользователя, у которой есть все возможности, необходимые моему плагину, а затем я прикрепляю некоторые из этих возможностей к существующим ролям.
Я приведу вам пример, который, я думаю, поможет вам справиться с этими проблемами.
Предполагая, что вы создаете плагин, которому нужны 3 возможности:
Вы можете создать настраиваемую роль, которая имеет все три возможности, а затем
Следуя простой функции, все предыдущие вещи:
function my_plugin_custom_caps() { $caps = array('do_foo' => true, 'do_bar' => true, 'do_baz' => true); // First of all create the new user role, add all custom caps + 'read' add_role( 'myrole', 'My Role', array_merge( $caps, array( 'read' => true ) ) ); // Set specific caps to specific roles. // 1. prepare the roles array $all_roles = array('administrator', 'editor', 'author', 'constributor', 'subscriber'); // 2. get WP_Roles object to do the work $roles_obj = new WP_Roles(); // 3. Loop roles and assign caps foreach ( $all_roles as $role ) { // 4. cycle the caps and assign them one by one using some logic to assign right caps foreach ( $assign as $cap ) { if( $role === 'subscriber' && $cap !== 'do_baz' ) continue; if( $role !== 'administrator' && $cap === 'do_foo' ) continue; $roles_obj->add_cap( $role, $cap ); } } }
После того, как WordPress сохраняет возможности в базе данных, хорошая идея выполнить эту задачу при активации плагина, поэтому она запускается только один раз:
register_activation_hook( __FILE__, 'my_plugin_custom_caps' );
Также хорошая привычка удаляет добавленные возможности и настраиваемые роли, когда плагин деактивирован, поэтому вы можете создать функцию my_plugin_custom_caps_undo
и использовать ее с register_deactivation_hook
.
Эта функция будет почти идентична my_plugin_custom_caps()
, но вместо add_role
remove_cap
вместо remove_cap
вместо add_cap
:
function my_custom_caps_undo() { remove_role( 'myrole' ); $caps = array('do_foo' => true, 'do_bar' => true, 'do_baz' => true ); $all_roles = array('administrator', 'editor', 'author', 'constributor', 'subscriber'); $roles_obj = new WP_Roles(); foreach ( $all_roles as $role ) { foreach ( $caps as $cap ) { if( $role === 'subscriber' && $cap !== 'do_baz' ) continue; if( $role !== 'administrator' && $cap === 'do_foo' ) continue; $roles_obj->remove_cap( $role, $cap ); } } } register_deactivation_hook( __FILE__, 'my_custom_caps_undo' );