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

如何在不关闭REST API的情况下禁用其页面名称查看功能?

解决方案

1. 过滤REST API页面查询结果

通过rest_post_query钩子,在API查询页面时仅返回当前用户有权访问的内容,彻底屏蔽无权页面的暴露:

add_filter( 'rest_post_query', 'restrict_membership_pages_rest_api', 10, 2 );
function restrict_membership_pages_rest_api( $args, $request ) {
    // 仅对pages端点生效
    if ( $request->get_route() !== '/wp/v2/pages' ) {
        return $args;
    }

    // 未登录用户直接返回空结果
    if ( ! is_user_logged_in() ) {
        $args['post__in'] = array(0);
        return $args;
    }

    $current_user = wp_get_current_user();
    // 获取当前用户可访问的所有页面ID(依赖WooCommerce Memberships内置函数)
    $accessible_pages = wc_memberships_get_user_accessible_post_ids( $current_user->ID, 'page' );

    // 无权限页面则返回空
    if ( empty( $accessible_pages ) ) {
        $args['post__in'] = array(0);
        return $args;
    }

    // 限制查询结果为用户可访问页面
    $args['post__in'] = $accessible_pages;
    return $args;
}

2. 移除敏感字段或返回权限错误

如果仅需阻止link字段泄露,可使用rest_prepare_page钩子,对无权访问的页面移除字段或返回403错误:

add_filter( 'rest_prepare_page', 'remove_link_from_rest_pages', 10, 2 );
function remove_link_from_rest_pages( $response, $post ) {
    // 检查当前用户是否有权访问该页面
    if ( ! wc_memberships_user_can_access_post( get_current_user_id(), $post->ID ) ) {
        // 方式1:移除link字段
        unset( $response->data['link'] );
        
        // 方式2:直接返回权限错误(二选一)
        // return new WP_Error( 'rest_forbidden', '无权访问此内容', array( 'status' => 403 ) );
    }
    return $response;
}

3. 拦截特定恶意请求

针对用户使用_fields=link参数批量获取链接的场景,直接拦截该类型请求:

add_action( 'rest_api_init', 'block_link_fields_request' );
function block_link_fields_request() {
    add_filter( 'rest_request_before_callbacks', function( $response, $handler, $request ) {
        // 匹配pages端点且请求link字段的情况
        if ( $request->get_route() === '/wp/v2/pages' 
             && isset( $request['_fields'] ) 
             && strpos( $request['_fields'], 'link' ) !== false ) {
            
            // 仅允许会员用户访问
            if ( ! is_user_logged_in() || ! wc_memberships_user_has_active_membership( get_current_user_id() ) ) {
                return new WP_Error( 'rest_forbidden', '无权获取此信息', array( 'status' => 403 ) );
            }
        }
        return $response;
    }, 10, 3 );
}

注意事项

  • 将代码添加到主题的functions.php文件或自定义插件中,避免主题更新丢失。
  • 测试时使用非会员账号或退出登录状态,验证API返回是否符合预期。
  • 若自定义了会员权限逻辑,需调整代码中的权限判断条件,确保与你的业务规则匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:55:13