我們一直在研究如何在 WordPress 中建立一個簡單的 CRM 系統。在本系列的最後一部分中,我們探討如何使用角色來限制使用者對 WordPress 管理介面部分內容的存取。
今天我們將介紹如何使用自訂功能僅限制對聯絡人自訂貼文類型的存取。
雖然我們之前降低了 WordPress 用戶的訪問級別,但透過將他們指派給編輯或作者角色,用戶仍然可以管理貼文和評論。這些功能對我們來說都沒有用,因此我們需要進一步限制訪問,允許指定的用戶只能訪問聯絡人自訂貼文類型。
我們可以透過以下方式做到這一點:
註冊自訂功能可讓我們稍後定義哪些 WordPress 角色可以存取這些功能,例如,作者是否可以建立新的聯絡人。
讓我們編輯外掛程式檔案的 register_post_type()
函數調用,將 capability_type => 'post'
替換為以下內容:
'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()
函數現在應該如下所示:
/** * 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', ), ) ); }
這裡發生了兩件事:
capability
參數定義了自己的功能,並將它們對應到其 Post 等效項。這可確保 WordPress 準確理解這些功能的含義(即 edit_contact
的行為方式與 edit_post
功能相同,只不過它適用於我們的聯絡人自訂貼文類型)。 map_meta_cap
將上述功能對應到 WordPress 的原始功能,以便強制執行。 以任何使用者身分重新載入 WordPress 管理,您將看到我們的聯絡人自訂貼文類型已從 WordPress 管理功能表中消失:
#發生這種情況是因為我們現在需要告訴 WordPress 哪些角色具有新的聯絡人功能(edit_contact
、edit_contacts
等)。
使用 add_role()
,我們可以建立一個新的 WordPress 使用者角色並向其指派我們的聯絡人功能。該角色儲存在 WordPress 選項資料中,因此我們只需呼叫該函數一次。
為此,請在我們的插件中的 __construct()
函數末尾添加以下函數:
/** * 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 ); }
此功能將向 WordPress 新增一個名為 CRM 的新角色。指派給此角色的使用者只能存取聯絡人功能。因此,他們只能訪問聯絡人自訂貼文類型。
請注意,我們也為此角色指派了 read
功能。這是允許使用者編輯其個人資料(姓名、密碼等)所必需的。我們需要允許用戶執行此操作,因為當他們登入時,WordPress 會自動將他們重新導向到個人資料畫面。
如果我們沒有指派 read
功能,使用者登入時會發生以下情況:
要執行我們的 plugin_activation()
函數一次,我們將以下程式碼加入到外掛程式檔案的末尾:
register_activation_hook( __FILE__, array( &$wpTutsCRM, 'plugin_activation' ) );
這告訴 WordPress,在啟動外掛時,它需要呼叫 WPTutsCRM
類別中的 plugin_activation()
函數。
接下來,停用並重新啟用您的插件,然後導覽至 WordPress 管理介面中的使用者 > 新增的。
如果一切順利,您將看到新的 CRM 角色出現在下拉清單中:
讓我們繼續建立一個名為 crm 的新用戶,並以該新用戶身分登入。我們現在應該看到我們的聯絡人,其中儀表板和個人資料是唯一的其他選單選項:
#如果我们注销并以 WordPress 管理员、编辑或作者身份重新登录,您会发现 WordPress 管理菜单中仍然缺少联系人自定义帖子类型:
这个是因为我们只分配了 CRM
角色我们的联系人自定义帖子类型的功能。因此,所有其他用户角色仍然无权访问此帖子类型。
To fix this, let’s assign the Custom Capabilities to the Administrator and Editor Roles by adding the following code to the end of the plugin_activation()
function:
// 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()
函数:
// 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 );
我们的整个函数现在应该如下所示:
/** * 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()
函数下方添加以下函数:
/** * Deactivation hook to unregister our existing Contacts Role */ function plugin_deactivation() { remove_role( 'crm' ); }
与我们在插件激活时使用 register_activation_hook()
函数的方式相同,当我们的插件停用时,我们可以使用 register_deactivation_hook()
函数。让我们在 register_activation_hook
调用下面添加以下内容:
register_deactivation_hook( __FILE__, array( &$wpTutsCRM, 'plugin_deactivation' ) );
停用我们的插件后,我们的 CRM
角色将不再可用。
我们已经在 WordPress 中成功创建了一个简单的 CRM 系统,探索使用自定义帖子类型、帖子元字段和第三方插件集成来存储有关我们的客户和潜在客户的信息。
本教程还涵盖了 WordPress 的一些更高级的方面,包括通过 WP_List_Table 列显示高级自定义字段数据、过滤我们的帖子查询以搜索我们的高级自定义字段数据,以及通过角色和功能管理用户访问以限制访问仅限我们的 CRM 系统。
以上是在 WordPress 中建立基本 CRM:利用自訂功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!