Статьи

Создание простой CRM в WordPress: использование пользовательских возможностей

Мы искали, как создать простую систему CRM в WordPress. В последней части этой серии мы рассмотрели, как использовать роли для ограничения доступа пользователей к частям интерфейса администрирования WordPress.

Сегодня мы расскажем, как ограничить доступ только к пользовательскому типу постов контактов с помощью пользовательских возможностей.

Хотя ранее мы снижали уровень доступа наших пользователей WordPress, назначив их на роль редактора или автора, пользователи по-прежнему могут управлять сообщениями и комментариями. Ни одна из этих функций не является полезной для нас, поэтому нам необходимо дополнительно ограничить доступ, позволяя назначенным пользователям иметь доступ только к пользовательскому типу публикации «Контакты».

Мы можем сделать это:

  1. регистрация пользовательских возможностей в нашем типе пользовательских сообщений
  2. создание новой роли пользователя WordPress, назначение этой роли только нашим новым пользовательским возможностям
  3. создание / редактирование пользователей 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’,
        ),
    ) );
}

Здесь происходят две вещи:

  1. Мы определили наши собственные возможности с помощью аргумента capabilities , сопоставив их с их эквивалентами Post. Это гарантирует, что WordPress точно понимает, что означают возможности (т. edit_contact ведет себя так же, как и возможность edit_post , за исключением того, что это относится к нашему типу пользовательской записи контактов).
  2. Мы сказали WordPress сопоставить вышеуказанные возможности с примитивными возможностями WordPress, используя map_meta_cap , чтобы они применялись.

Перезагрузите администрацию WordPress от имени любого пользователя, и вы увидите, что наш пользовательский тип поста «Контакты» исчез из меню администрирования WordPress:

Контакты Пользовательский тип сообщения отсутствует

Это произошло потому, что теперь нам нужно сообщить WordPress, какие роли имеют наши новые возможности контактов ( edit_contact , edit_contacts и т. Д.).

Используя 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.

Если все прошло успешно, вы увидите новую роль CRM в выпадающем списке:

Наша новая роль WordPress

Давайте создадим нового пользователя с именем 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 система.