本篇文章更新時間:2024/04/18
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
開發一個 WordPress 網站時常會碰到針對一些使用者角色去控制管理的情境。尤其是 WooCommerce 電商!
我想要多一個角色可以幫我管理 OOO 內容。我想要多一個角色可以幫我管理訂單。我想要多一個角色可以幫我管理使用者...
一般來說,動態調整這些角色與權限的部分我是使用 User Role Editor 與 Adminimize 這兩套處理。
跟使用者有關的勾點開發使用筆記先前有寫過 [WooCommerce] 後台整理術:開放商店管理員(Shop Manager)修改使用者角色(role),這篇是管理建立使用者部分。
使用者的權限是先定義好的,這樣就可以開放讓商店管理員可以自行建立具有一定權限的使用者來協助管理網站。
本篇筆記算是補充一個有趣的案例是:如果這個新的角色要用來管理使用者怎辦?
其中權限還要避免管理到「商店管理員」的角色。所以透過下面方法來處理限制:
// 針對 門市人員 角色,顯示上排除顯示 商店管理員 角色
function mxp_filter_user_counts($result = null, $strategy = 'time', $site_id = null) {
// 避免無限重複執行導致記憶體被吃光的問題
remove_filter('pre_count_users', 'mxp_filter_user_counts', 999, 3);
$result = count_users($strategy, $site_id);
$user = wp_get_current_user();
$allowed_roles = array('store_personnel');
if (array_intersect($allowed_roles, $user->roles)) {
unset($result['avail_roles']['shop_manager']);
return $result;
}
return $result;
}
add_filter('pre_count_users', 'mxp_filter_user_counts', 999, 3);
// 針對 門市人員 角色,管理使用者時,將 商店管理員 與 管理員 排除在搜尋結果外
function mxp_filter_user_query_qrgs($args) {
$users = get_users(array('role__in' => array('shop_manager', 'administrator')));
$display_none_users = array();
foreach ($users as $user) {
$display_none_users[] = $user->ID;
}
if (empty($display_none_users)) {
return $args;
}
$check_user = wp_get_current_user();
$allowed_roles = array('store_personnel');
if (array_intersect($allowed_roles, $check_user->roles)) {
$args['exclude'] = array_merge(
isset($args['exclude']) ? $args['exclude'] : array(),
$display_none_users
);
if (isset($args['include']) && !empty($args['include'])) {
$args['include'] = array_diff($args['include'], $display_none_users);
if (empty($args['include'])) {
unset($args['include']);
}
}
}
return $args;
}
add_filter('users_list_table_query_args', 'mxp_filter_user_query_qrgs', 999, 1);
// 限制只有 商店管理員 與 管理員 可以編輯自己同角色的使用者帳號
function mxp_restrict_user_editing($required_caps, $capability, $this_user_id, $args) {
$edit_user_caps = array('edit_user', 'delete_user', 'promote_user', 'remove_user');
if (!in_array($capability, $edit_user_caps) || !isset($args[0])) {
return $required_caps;
}
$users = get_users(array('role__in' => array('shop_manager', 'administrator')));
$display_none_users = array();
foreach ($users as $user) {
$display_none_users[] = $user->ID;
}
$that_user_id = intval($args[0]);
$this_user_id = intval($this_user_id);
if (in_array($that_user_id, $display_none_users) && !in_array($this_user_id, $display_none_users)) {
return array_merge($required_caps, array('do_not_allow'));
}
return $required_caps;
}
add_filter('map_meta_cap', 'mxp_restrict_user_editing', 999, 4);
基本上透過這三個勾點方法就能對使用者管理使用者的權限做好一些控制。
不過其實在追程式碼找方法的時候,還是覺得如果從源頭的「角色」資料輸出就有可以管理,那就不用這麼繞路了!