WooCommerce REST API仅开产品权限后,后台被拦截问题求助
问题分析与解决方案
原函数的核心问题有两个:
- 未区分后台登录用户与外部API请求,导致后台自身调用REST接口时也被拦截,引发空白页面和403错误。
- 错误地将包含密钥的完整URL作为匹配条件,而实际请求中密钥是动态查询参数,导致合法的产品API请求也无法通过匹配,最终所有请求都被拦截。
以下是修复后的代码:
function restrict_woocommerce_rest_api_endpoints() { // 允许后台登录用户访问所有REST接口,避免后台功能失效 if (is_admin() || current_user_can('manage_options')) { return; } // 提取当前请求的REST路径(去除查询参数) $current_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // 定义允许访问的产品相关端点,可根据需求调整 $allowed_endpoints = array( '/wp-json/wc/v3/products', '/wp-json/wc/v3/products/', // 处理带尾部斜杠的情况 '/wp-json/wc/v3/product/categories', '/wp-json/wc/v3/product/tags' ); // 检查当前路径是否匹配允许的端点(支持单个产品的动态ID) $allowed = false; foreach ($allowed_endpoints as $endpoint) { // 匹配单个产品路径(如 /wp-json/wc/v3/products/123) if ($endpoint === '/wp-json/wc/v3/products/' && str_starts_with($current_path, '/wp-json/wc/v3/products/')) { $allowed = true; break; } // 匹配其他精确路径 if ($current_path === $endpoint) { $allowed = true; break; } } // 不允许的请求返回403 if (!$allowed) { status_header(403); echo "Access Forbidden"; exit; } } add_action('rest_api_init', 'restrict_woocommerce_rest_api_endpoints');
关键改进说明:
- 后台用户豁免:通过
is_admin()和current_user_can('manage_options')判断,确保后台操作不受限制,解决后台无法访问的问题。 - 路径正确提取:使用
parse_url()获取纯路径部分,忽略查询参数(如consumer_key和consumer_secret),避免因动态参数导致匹配失败。 - 灵活的端点匹配:支持产品列表、单个产品(动态ID)、产品分类和标签等常见产品相关端点,可根据实际需求增减。
- 尾部斜杠兼容:同时匹配带或不带尾部斜杠的路径,避免因URL格式差异导致拦截。
内容的提问来源于stack exchange,提问作者sevoug
相关产品推荐
相关产品推荐

