You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义勾选框禁用WooCommerce API失效问题求助

问题

我给用户做了个自定义勾选框,勾选后应该禁止这个用户使用WooCommerce API,但现在勾了之后用户还是能正常调用API。

用到的过滤器代码如下:

add_filter('woocommerce_rest_pre_dispatch', 'restrict_api_access_based_on_user_meta', 10, 3);

function restrict_api_access_based_on_user_meta($result, $server, $request) {
    // Check if the request is for the WooCommerce products endpoint
    if (strpos($request->get_route(), '/wc/v3/products') !== false) {
        // Retrieve user ID from the authentication information
        $user_id = apply_filters('determine_current_user', null);
        
        // Check if the user is authenticated and retrieve the 'disable_account_api' meta value
        if ($user_id) {
            $disable_account_api = get_user_meta($user_id, 'disable_account_api', true);

            // If 'disable_account_api' is set to "yes", deny access
            if ($disable_account_api === 'yes') {
                return new WP_Error(
                    'api_disabled',
                    __('API access has been disabled for this account.', 'woocommerce'),
                    array('status' => 403)
                );
            }
        }
    }
    return $result;
}

我在edit-user.php页面添加了自定义勾选框,勾选后应将用户的meta值设为yes。

排查与解决办法

几个可能的问题原因

  1. 勾选框的meta值未正确保存:点击勾选保存后,disable_account_api这个用户元数据可能根本没写入数据库。
  2. API限制范围过窄:当前代码只拦截了/wc/v3/products这一个端点,用户调用其他WooCommerce API仍能正常访问。
  3. 用户ID获取方式不可靠:用apply_filters('determine_current_user', null)获取用户ID,可能无法正确拿到API请求中的认证用户ID。

具体修复步骤

1. 确保勾选框设置能正确保存

添加以下代码处理用户资料保存逻辑,保证勾选后meta值能存入数据库:

add_action('edit_user_profile_update', 'save_disable_account_api_meta');
add_action('personal_options_update', 'save_disable_account_api_meta');

function save_disable_account_api_meta($user_id) {
    // 检查当前用户是否有权限编辑目标用户
    if (!current_user_can('edit_user', $user_id)) {
        return;
    }
    // 勾选则保存值为'yes',未勾选则删除该meta
    if (isset($_POST['disable_account_api'])) {
        update_user_meta($user_id, 'disable_account_api', 'yes');
    } else {
        delete_user_meta($user_id, 'disable_account_api');
    }
}

同时要保证勾选框的HTML代码正确(name属性必须为disable_account_api):

<label for="disable_account_api">
    <input type="checkbox" name="disable_account_api" id="disable_account_api" value="yes" <?php checked(get_user_meta($user_id, 'disable_account_api', true), 'yes'); ?>>
    禁用该用户的WooCommerce API访问
</label>

2. 扩大API限制范围(按需选择)

如果需要限制所有WooCommerce API端点,将路由判断改为匹配所有/wc/v开头的路径:

if (strpos($request->get_route(), '/wc/v') !== false) {
    // 后续逻辑保持不变
}

3. 更换更可靠的用户ID获取方式

使用WP_REST_Request自带的get_user_id()方法,比原方式更准确:

$user_id = $request->get_user_id();

修复后的完整代码

// 保存用户的API禁用设置
add_action('edit_user_profile_update', 'save_disable_account_api_meta');
add_action('personal_options_update', 'save_disable_account_api_meta');

function save_disable_account_api_meta($user_id) {
    if (!current_user_can('edit_user', $user_id)) {
        return;
    }
    if (isset($_POST['disable_account_api'])) {
        update_user_meta($user_id, 'disable_account_api', 'yes');
    } else {
        delete_user_meta($user_id, 'disable_account_api');
    }
}

// 拦截WooCommerce API请求
add_filter('woocommerce_rest_pre_dispatch', 'restrict_api_access_based_on_user_meta', 10, 3);

function restrict_api_access_based_on_user_meta($result, $server, $request) {
    // 匹配所有WooCommerce API端点
    if (strpos($request->get_route(), '/wc/v') !== false) {
        // 获取当前认证的用户ID
        $user_id = $request->get_user_id();
        
        if ($user_id) {
            $disable_account_api = get_user_meta($user_id, 'disable_account_api', true);
            if ($disable_account_api === 'yes') {
                return new WP_Error(
                    'api_disabled',
                    __('API access has been disabled for this account.', 'woocommerce'),
                    array('status' => 403)
                );
            }
        }
    }
    return $result;
}

验证方法

  1. 编辑用户资料,勾选禁用API的选项并保存。
  2. 使用该用户的凭证调用任意WooCommerce API(比如/wc/v3/products),应返回403错误。
  3. 查看数据库wp_usermeta表,确认该用户存在disable_account_api键,且值为yes。

内容的提问来源于stack exchange,提问作者Asher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:41:00