Мы искали, как создать простую систему CRM в WordPress. В последней части этой серии мы рассмотрели, как использовать роли для ограничения доступа пользователей к частям интерфейса администрирования WordPress.
Сегодня мы расскажем, как ограничить доступ только к пользовательскому типу постов контактов с помощью пользовательских возможностей.
Пользовательские возможности
Хотя ранее мы снижали уровень доступа наших пользователей WordPress, назначив их на роль редактора или автора, пользователи по-прежнему могут управлять сообщениями и комментариями. Ни одна из этих функций не является полезной для нас, поэтому нам необходимо дополнительно ограничить доступ, позволяя назначенным пользователям иметь доступ только к пользовательскому типу публикации «Контакты».
Мы можем сделать это:
- регистрация пользовательских возможностей в нашем типе пользовательских сообщений
- создание новой роли пользователя WordPress, назначение этой роли только нашим новым пользовательским возможностям
- создание / редактирование пользователей WordPress, назначение их новой роли контактов
Регистрация пользовательских возможностей в нашем типе пользовательских сообщений
Регистрация пользовательских возможностей позволяет нам позже определить, какие роли WordPress имеют доступ к этим возможностям, например, может ли Автор создать новый контакт.
Давайте отредактируем вызов функции register_post_type()
нашего плагина, capability_type => 'post'
следующим:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
‘capabilities’ => array(
‘edit_others_posts’ => ‘edit_others_contacts’,
‘delete_others_posts’ => ‘delete_others_contacts’,
‘delete_private_posts’ => ‘delete_private_contacts’,
‘edit_private_posts’ => ‘edit_private_contacts’,
‘read_private_posts’ => ‘read_private_contacts’,
‘edit_published_posts’ => ‘edit_published_contacts’,
‘publish_posts’ => ‘publish_contacts’,
‘delete_published_posts’=> ‘delete_published_contacts’,
‘edit_posts’ => ‘edit_contacts’ ,
‘delete_posts’ => ‘delete_contacts’,
‘edit_post’ => ‘edit_contact’,
‘read_post’ => ‘read_contact’,
‘delete_post’ => ‘delete_contact’,
),
‘map_meta_cap’ => true,
|
Наша функция register_post_type()
теперь должна выглядеть так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
/**
* Registers a Custom Post Type called contact
*/
function register_custom_post_type() {
register_post_type( ‘contact’, array(
‘labels’ => array(
‘name’ => _x( ‘Contacts’, ‘post type general name’, ‘tuts-crm’ ),
‘singular_name’ => _x( ‘Contact’, ‘post type singular name’, ‘tuts-crm’ ),
‘menu_name’ => _x( ‘Contacts’, ‘admin menu’, ‘tuts-crm’ ),
‘name_admin_bar’ => _x( ‘Contact’, ‘add new on admin bar’, ‘tuts-crm’ ),
‘add_new’ => _x( ‘Add New’, ‘contact’, ‘tuts-crm’ ),
‘add_new_item’ => __( ‘Add New Contact’, ‘tuts-crm’ ),
‘new_item’ => __( ‘New Contact’, ‘tuts-crm’ ),
‘edit_item’ => __( ‘Edit Contact’, ‘tuts-crm’ ),
‘view_item’ => __( ‘View Contact’, ‘tuts-crm’ ),
‘all_items’ => __( ‘All Contacts’, ‘tuts-crm’ ),
‘search_items’ => __( ‘Search Contacts’, ‘tuts-crm’ ),
‘parent_item_colon’ => __( ‘Parent Contacts:’, ‘tuts-crm’ ),
‘not_found’ => __( ‘No contacts found.’, ‘tuts-crm’ ),
‘not_found_in_trash’ => __( ‘No contacts found in Trash.’, ‘tuts-crm’ ),
),
// Frontend
‘has_archive’ => false,
‘public’ => false,
‘publicly_queryable’ => false,
// Admin
‘capabilities’ => array(
‘edit_others_posts’ => ‘edit_others_contacts’,
‘delete_others_posts’ => ‘delete_others_contacts’,
‘delete_private_posts’ => ‘delete_private_contacts’,
‘edit_private_posts’ => ‘edit_private_contacts’,
‘read_private_posts’ => ‘read_private_contacts’,
‘edit_published_posts’ => ‘edit_published_contacts’,
‘publish_posts’ => ‘publish_contacts’,
‘delete_published_posts’=> ‘delete_published_contacts’,
‘edit_posts’ => ‘edit_contacts’ ,
‘delete_posts’ => ‘delete_contacts’,
‘edit_post’ => ‘edit_contact’,
‘read_post’ => ‘read_contact’,
‘delete_post’ => ‘delete_contact’,
),
‘map_meta_cap’ => true,
‘menu_icon’ => ‘dashicons-businessman’,
‘menu_position’ => 10,
‘query_var’ => true,
‘show_in_menu’ => true,
‘show_ui’ => true,
‘supports’ => array(
‘title’,
‘author’,
‘comments’,
),
) );
}
|
Здесь происходят две вещи:
- Мы определили наши собственные возможности с помощью аргумента
capabilities
, сопоставив их с их эквивалентами Post. Это гарантирует, что WordPress точно понимает, что означают возможности (т.edit_contact
ведет себя так же, как и возможностьedit_post
, за исключением того, что это относится к нашему типу пользовательской записи контактов). - Мы сказали WordPress сопоставить вышеуказанные возможности с примитивными возможностями WordPress, используя
map_meta_cap
, чтобы они применялись.
Перезагрузите администрацию WordPress от имени любого пользователя, и вы увидите, что наш пользовательский тип поста «Контакты» исчез из меню администрирования WordPress:
Это произошло потому, что теперь нам нужно сообщить WordPress, какие роли имеют наши новые возможности контактов ( edit_contact
, edit_contacts
и т. Д.).
Создание новой роли пользователя WordPress, присвоение ей только наших новых пользовательских возможностей
Используя add_role()
, мы можем создать новую роль пользователя WordPress и назначить ей наши возможности контактов. Роль хранится в данных WordPress Options, поэтому нам нужно сделать этот вызов функции только один раз.
Для этого добавьте следующую функцию ниже конца функции __construct()
в нашем плагине:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/**
* Activation hook to register a new Role and assign it our Contact Capabilities
*/
function plugin_activation() {
// Define our custom capabilities
$customCaps = array(
‘edit_others_contacts’ => true,
‘delete_others_contacts’ => true,
‘delete_private_contacts’ => true,
‘edit_private_contacts’ => true,
‘read_private_contacts’ => true,
‘edit_published_contacts’ => true,
‘publish_contacts’ => true,
‘delete_published_contacts’ => true,
‘edit_contacts’ => true,
‘delete_contacts’ => true,
‘edit_contact’ => true,
‘read_contact’ => true,
‘delete_contact’ => true,
‘read’ => true,
);
// Create our CRM role and assign the custom capabilities to it
add_role( ‘crm’, __( ‘CRM’, ‘tuts-crm’), $customCaps );
}
|
Эта функция добавит новую роль CRM в WordPress. Пользователи, назначенные для этой роли, будут иметь доступ только к возможностям контактов. Таким образом, они будут иметь доступ только к пользовательскому типу публикации контактов.
Обратите внимание, что мы также назначаем возможность read
этой роли. Это необходимо для того, чтобы пользователи могли редактировать свой профиль (имя, пароль и т. Д.). Мы должны разрешить пользователям делать это, потому что, когда они входят в систему, WordPress автоматически перенаправляет их на экран профиля.
Если мы не назначим возможность read
, это произойдет, когда пользователь войдет в систему:
Чтобы запустить нашу plugin_activation()
один раз, давайте добавим следующий код в конец файла нашего плагина:
1
|
register_activation_hook( __FILE__, array( &$wpTutsCRM, ‘plugin_activation’ ) );
|
Это говорит WordPress, что при активации плагина необходимо вызвать plugin_activation()
внутри нашего класса WPTutsCRM
.
Создание / редактирование пользователей WordPress, назначение их новой роли контактов
Затем деактивируйте и повторно активируйте свой плагин, а затем перейдите к « Пользователи»> «Добавить новый» в интерфейсе администрирования WordPress.
Если все прошло успешно, вы увидите новую роль CRM в выпадающем списке:
Давайте создадим нового пользователя с именем crm и войдем в систему под этим новым пользователем. Теперь мы должны увидеть наши контакты с Dashboard и Profile в качестве единственных других опций меню:
Назначение пользовательских возможностей другим ролям
Если мы выйдем из системы и снова войдем в систему как администратор, редактор или автор WordPress, вы заметите, что в меню администрирования WordPress по-прежнему отсутствует пользовательский тип публикации контактов:
Это связано с тем, что мы назначили только роль CRM
нашим контактным пользовательским типам сообщений. Поэтому все другие роли пользователей по-прежнему не имеют доступа к этому типу сообщений.
Чтобы это исправить, давайте назначим пользовательские возможности ролям администратора и редактора, добавив следующий код в конец функции plugin_activation()
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
// Add custom capabilities to Admin and Editor Roles
$roles = array( ‘administrator’, ‘editor’ );
foreach ( $roles as $roleName ) {
// Get role
$role = get_role( $roleName );
// Check role exists
if ( is_null( $role) ) {
continue;
}
// Iterate through our custom capabilities, adding them
// to this role if they are enabled
foreach ( $customCaps as $capability => $enabled ) {
if ( $enabled ) {
// Add capability
$role->add_cap( $capability );
}
}
}
|
Здесь мы перебираем роли, которым мы хотим назначить пользовательские возможности, проверяя, существует ли роль. Если это так, мы затем выполняем итерацию пользовательских возможностей, которые мы определили ранее, добавляя их в роль.
Вы заметите, что мы не добавили никаких пользовательских возможностей в роль автора; это потому, что мы не хотим назначать все возможности, так как роль автора традиционно разрешает доступ только на запись к собственным сообщениям этого пользователя.
Давайте продолжим создание нашей функции plugin_activation()
, добавив несколько возможностей для роли автора:
1
2
3
4
5
6
7
8
|
// Add some of our custom capabilities to the Author Role
$role = get_role( ‘author’ );
$role->add_cap( ‘edit_contact’ );
$role->add_cap( ‘edit_contacts’ );
$role->add_cap( ‘publish_contacts’ );
$role->add_cap( ‘read_contact’ );
$role->add_cap( ‘delete_contact’ );
unset( $role );
|
Вся наша функция теперь должна выглядеть так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
/**
* Activation hook to register a new Role and assign it our Contact Capabilities
*/
function plugin_activation() {
// Define our custom capabilities
$customCaps = array(
‘edit_others_contacts’ => true,
‘delete_others_contacts’ => true,
‘delete_private_contacts’ => true,
‘edit_private_contacts’ => true,
‘read_private_contacts’ => true,
‘edit_published_contacts’ => true,
‘publish_contacts’ => true,
‘delete_published_contacts’ => true,
‘edit_contacts’ => true,
‘delete_contacts’ => true,
‘edit_contact’ => true,
‘read_contact’ => true,
‘delete_contact’ => true,
‘read’ => true,
);
// Create our CRM role and assign the custom capabilities to it
add_role( ‘crm’, __( ‘CRM’, ‘tuts-crm’), $customCaps );
// Add custom capabilities to Admin and Editor Roles
$roles = array( ‘administrator’, ‘editor’ );
foreach ( $roles as $roleName ) {
// Get role
$role = get_role( $roleName );
// Check role exists
if ( is_null( $role) ) {
continue;
}
// Iterate through our custom capabilities, adding them
// to this role if they are enabled
foreach ( $customCaps as $capability => $enabled ) {
if ( $enabled ) {
// Add capability
$role->add_cap( $capability );
}
}
}
// Add some of our custom capabilities to the Author Role
$role = get_role( ‘author’ );
$role->add_cap( ‘edit_contact’ );
$role->add_cap( ‘edit_contacts’ );
$role->add_cap( ‘publish_contacts’ );
$role->add_cap( ‘read_contact’ );
$role->add_cap( ‘delete_contact’ );
unset( $role );
}
|
При входе в систему в качестве администратора, редактора или автора теперь будет отображаться опция «Контакты» в меню администрирования WordPress:
Очистка наших ролей
Если администратор WordPress деактивирует наш плагин, роль CRM
останется в WordPress. Однако, учитывая, что никакой другой плагин или часть WordPress не использует эту роль, она избыточна — поэтому мы должны убедиться, что роль CRM
удалена, когда наш плагин деактивирован.
Для этого добавьте следующую функцию ниже функции plugin_activation()
:
1
2
3
4
5
6
7
8
|
/**
* Deactivation hook to unregister our existing Contacts Role
*/
function plugin_deactivation() {
remove_role( ‘crm’ );
}
|
Таким же образом мы использовали функцию register_activation_hook()
когда наш плагин активирован, мы можем использовать register_deactivation_hook()
когда наш плагин деактивируется. Давайте добавим следующее ниже вызов register_activation_hook
:
1
|
register_deactivation_hook( __FILE__, array( &$wpTutsCRM, ‘plugin_deactivation’ ) );
|
Когда наш плагин деактивирован, наша роль CRM
больше не будет доступна.
Резюме
Мы успешно создали простую CRM-систему в WordPress, исследуя использование пользовательских типов постов, пост-мета-полей и интеграции сторонних плагинов для хранения информации о наших клиентах и перспективах.
В этом руководстве также рассматриваются некоторые более сложные аспекты WordPress: отображение данных расширенных настраиваемых полей через столбцы WP_List_Table, фильтрация нашего пост-запроса для поиска в данных расширенных настраиваемых полей и управление доступом пользователей через роли и возможности, чтобы ограничить доступ только нашими CRM система.