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

WP Rest API自定义端点返回NULL问题求助

这种情况我碰过好多次,大概率是回调函数里的字段获取逻辑有问题,或是路由注册的细节没做到位。咱们一步步排查修复:

1. 先确认路由注册的正确性

首先要保证register_rest_route的参数完全合规,尤其是命名空间、请求方法和权限回调这几个关键点:

add_action('rest_api_init', function () {
    register_rest_route(
        'custom/v1', // 自定义命名空间,避免和默认API冲突
        '/trimmed-posts/', // 端点路径
        array(
            'methods' => WP_REST_Server::READABLE, // 等价于'GET',更规范的写法
            'callback' => 'get_trimmed_posts',
            'permission_callback' => '__return_true', // 临时开放权限排查问题,上线后要替换成合适的权限逻辑(比如'is_user_logged_in')
        )
    );
});

注意:如果省略permission_callback,WordPress会默认要求用户登录,可能导致返回权限错误或者空数据,先暂时用__return_true排除权限问题。

2. 修复回调函数的字段获取逻辑

返回NULL最常见的原因是直接访问Post对象的原始属性(比如$post->title),而没有用WordPress的官方函数来获取数据。下面是一个标准的回调示例,假设你需要标题、特色图URL、文章链接三个字段:

function get_trimmed_posts($request) {
    // 处理请求参数(比如每页数量)
    $per_page = $request->get_param('per_page') ?: 10;
    
    // 查询已发布的文章
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => $per_page,
        'post_status' => 'publish',
        'orderby' => 'date',
        'order' => 'DESC'
    );
    $posts = get_posts($args);
    
    $trimmed_data = array();
    foreach ($posts as $post) {
        // 初始化Post数据,确保后续函数能正确获取字段
        setup_postdata($post);
        
        // 安全获取特色图URL(处理无特色图的情况)
        $featured_img = get_the_post_thumbnail_url($post->ID, 'medium') ?: '';
        
        // 组装需要的字段
        $trimmed_data[] = array(
            'title' => get_the_title($post->ID),
            'featured_image' => $featured_img,
            'permalink' => get_permalink($post->ID)
        );
    }
    // 重置Post数据,避免干扰后续主题/插件逻辑
    wp_reset_postdata();
    
    // 用WordPress官方函数包装返回值,自动处理JSON格式和HTTP头
    return rest_ensure_response($trimmed_data);
}

常见错误点:

  • 直接用$post->title而不是get_the_title():Post对象的原始属性存储的是未过滤的数据库值,可能包含短代码或未解析的内容,且在未初始化Post数据时可能为空
  • 用$post->featured_media直接作为图片URL:这其实是特色图的附件ID,需要用get_the_post_thumbnail_url()转成URL
  • 忘记调用setup_postdata()或wp_reset_postdata():导致后续获取字段的函数无法正常工作
3. 排查错误日志和冲突

如果上面的调整后还是返回NULL,可以开启调试模式找问题:
在wp-config.php中添加以下代码:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

访问你的自定义端点后,查看wp-content/debug.log文件,里面会记录具体的错误(比如未定义的函数、数据库查询错误等)。

另外,暂时禁用所有插件、切换到默认主题(比如Twenty Twenty-Four)测试,排查是否有其他代码干扰了REST API的返回值。

内容的提问来源于stack exchange,提问作者Dirty Bird Design

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:28:24