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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:43:28