使用WordPress REST API获取指定分类文章内容缺失求助
问题排查与解决方案
让我们一步步拆解并解决你的问题:
1. 核心问题:get_posts 参数使用不规范
你当前用的 'category' => $data['id'] 参数已经被 WordPress 弃用,虽然偶尔能工作,但容易引发不可预期的问题(比如获取到错误的文章、字段缺失)。官方推荐用 'cat' 参数来指定分类 ID,这是最稳妥的写法。
2. 内容字段为空的关键原因
直接调用 $post->post_content 可能拿到的是未渲染的原始内容(比如未解析的短代码、原始格式标签),甚至在某些上下文场景下会返回空值。正确的做法是用 WordPress 内置的内容过滤器 apply_filters('the_content', $post->post_content),它会帮你完成短代码解析、格式渲染等工作,输出最终可展示的文章内容。
3. Secret 验证逻辑存在漏洞
你通过解析 $_SERVER['QUERY_STRING'] 获取密钥的方式非常脆弱——如果请求里的查询参数顺序变化(比如新增其他参数),验证直接失效。应该利用 REST API 自带的参数验证机制来安全获取密钥。
修正后的完整代码
/* Register Route http://dev.mpblogg.se/wp-json/api/v1/feedposts/id */ add_action( 'rest_api_init', function () { register_rest_route( 'api/v1', '/feedposts/(?P<id>\d+)', array( 'methods' => 'GET', 'callback' => 'getAllPostsfromCategory', 'args' => array( 'secret' => array( 'required' => true, 'type' => 'string', 'description' => '验证密钥' ), ), )); }); /* Get all posts from the specific Category */ function getAllPostsfromCategory( $data ) { $secret = '2lpMh5EHaEiavhMONpWD'; // 改用REST API参数获取密钥,逻辑更可靠 if ( $data['secret'] !== $secret ) { return new WP_Error( 'invalid_secret', '无效的验证密钥', array( 'status' => 403 ) ); } // 使用规范参数获取分类下所有已发布文章 $posts = get_posts( array( 'cat' => $data['id'], 'posts_per_page' => -1, // 获取该分类下全部文章(默认只返回5篇) 'post_status' => 'publish' )); $returnArray = array(); foreach( $posts as $post ) { array_push( $returnArray, array( 'id' => $post->ID, 'title' => get_the_title( $post ), // 用官方函数获取标题更稳定 'content' => apply_filters( 'the_content', $post->post_content ) // 渲染后的完整文章内容 )); } return empty( $returnArray ) ? null : $returnArray; }
额外优化建议
- 别直接操作
$_SERVER变量,REST API 的$data参数已经帮你安全封装了所有请求参数。 - 返回
WP_Error对象替代简单的false,客户端能拿到明确的错误状态码(比如403)和提示信息,便于调试。 - 用
posts_per_page => -1确保获取分类下所有文章,避免默认只返回5篇的限制。
内容的提问来源于stack exchange,提问作者Jonas Alvarson
相关产品推荐
相关产品推荐

