WooCommerceWordpress密技
WooCommerce 商品權限管理終極教學:精準控制商店經理(Shop Manager)只能看到自己的商品

大家好,我是豬油先生!
情境
在 WooCommerce 中,預設的權限管理並不支持商店經理(Shop Manager)之間彼此看不到或無法編輯對方上架商品的功能,而管理員(Administrator)預設可以查看所有商品。那如果要實現商店經理之間互相不可見的需求,需要調整使用者角色權限來限制商品的可見性和編輯權限,該怎麼辦呢?
以下是具體的使用程式碼實現方法:
程式代碼
WooCommerce 的商店經理預設可以看到並編輯所有商品。要讓他們只能看到自己上架的商品,將以下程式碼加入到主題的 functions.php 文件中(建議使用子主題,以避免主題更新時覆蓋):
請注意 !!! 如果你的 functions.php 裡面本來就有資料 切記!!!
<?php
不要重複囉唷! 不然無法存檔。
<?php
// 阻止商店經理編輯非自己的商品
function restrict_shop_manager_product_editing($allcaps, $cap, $args) {
// 檢查是否為編輯商品的操作
if (isset($args[0]) && $args[1] && $cap[0] === 'edit_post') {
$current_user = wp_get_current_user();
// 只針對商店經理角色
if (in_array('shop_manager', $current_user->roles)) {
$post = get_post($args[1]);
// 如果商品不是自己的,禁止編輯
if ($post && $post->post_author != $current_user->ID) {
$allcaps[$cap[0]] = false;
}
}
}
return $allcaps;
}
add_filter('user_has_cap', 'restrict_shop_manager_product_editing', 10, 3);
// 移除非自己商品的編輯連結
function hide_edit_links_for_shop_managers() {
$current_user = wp_get_current_user();
// 只針對商店經理
if (in_array('shop_manager', $current_user->roles)) {
$post = get_post();
// 如果商品不是自己的,移除編輯連結
if ($post && get_post_type($post) === 'product' && $post->post_author != $current_user->ID) {
// 移除前台編輯連結
add_filter('edit_post_link', '__return_false');
// 移除管理列編輯連結
add_action('wp_before_admin_bar_render', function() {
global $wp_admin_bar;
$wp_admin_bar->remove_node('edit');
});
}
}
}
add_action('wp', 'hide_edit_links_for_shop_managers');
// 限制商店經理只能看到自己的商品
function restrict_shop_manager_product_query($query) {
$current_user = wp_get_current_user();
// 只在管理後台且是商品查詢時生效
if (is_admin() && $query->is_main_query() && $query->get('post_type') === 'product') {
if (in_array('shop_manager', $current_user->roles)) {
$query->set('author', $current_user->ID);
}
}
return $query;
}
add_filter('pre_get_posts', 'restrict_shop_manager_product_query');
程式碼解釋
這個程式碼提供了多層面的權限控制:
- 阻止編輯非自己的商品
- 隱藏非自己商品的編輯連結(前台和管理列)
- 限制商店經理只能看到自己的商品列表

後台介面
管理者看到的商品 數量

商店經理看到的數量 雖然有系統有四筆,但只能看到自己建立的那一筆資料。

前台介面
前往到自己的商品上時,是可以看到管理列編輯連結 「編輯商品」這個按鈕,可以直接快速前往後台編輯商品。

如果不是自己的商品時,上面管理列編輯連結就會消失。

注意事項
管理員角色不會受到影響,因為程式碼中檢查了角色並保留了管理員的完整權限。
