自定义勾选框禁用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。
排查与解决办法
几个可能的问题原因
- 勾选框的meta值未正确保存:点击勾选保存后,
disable_account_api这个用户元数据可能根本没写入数据库。 - API限制范围过窄:当前代码只拦截了
/wc/v3/products这一个端点,用户调用其他WooCommerce API仍能正常访问。 - 用户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; }
验证方法
- 编辑用户资料,勾选禁用API的选项并保存。
- 使用该用户的凭证调用任意WooCommerce API(比如
/wc/v3/products),应返回403错误。 - 查看数据库
wp_usermeta表,确认该用户存在disable_account_api键,且值为yes。
内容的提问来源于stack exchange,提问作者Asher
相关产品推荐
相关产品推荐

