WordPress自定义REST API端点获取主题返回结果异常求助
排查自定义REST主题列表端点的JSON返回问题
我来帮你搞定这个问题——你的API返回结果不符合预期,核心原因是直接返回了wp_get_themes()生成的WP_Theme对象数组。WordPress的REST API在序列化对象时,只能处理公共属性,而WP_Theme里的大部分关键数据都是受保护/私有属性,没法直接转成JSON,所以返回的结果会缺失信息或者格式混乱。
修复方案:提取可序列化的主题数据
我们需要遍历每个主题对象,用WP_Theme提供的公共方法提取需要的信息,转换成普通数组后再返回。修改后的完整代码如下:
add_action( 'rest_api_init', function () { // 注册REST端点 register_rest_route( 'theme/v1', '/get_theme_list/', array( 'methods' => 'GET', 'callback' => 'theme_list_function' ) ); } ); // 获取并处理主题列表的回调函数 function theme_list_function(){ // 获取所有主题的WP_Theme对象集合 $raw_themes = wp_get_themes(); $processed_themes = array(); // 遍历每个主题,提取可序列化的关键数据 foreach($raw_themes as $slug => $theme){ $processed_themes[] = array( 'slug' => $slug, 'name' => $theme->get('Name'), 'version' => $theme->get('Version'), 'author' => $theme->get('Author'), 'description' => $theme->get('Description'), 'screenshot_url' => $theme->get_screenshot(), 'theme_url' => $theme->get('ThemeURI'), 'author_url' => $theme->get('AuthorURI') ); } // 返回符合REST规范的响应 return rest_ensure_response($processed_themes); }
关键改进点说明
- 提取对象数据:用
$theme->get()方法获取主题元数据(比如名称、版本),这些方法会返回可直接序列化的字符串/数值,避免了直接访问对象私有属性的问题。 - 使用
rest_ensure_response():这个函数会把普通数组包装成标准的WP_REST_Response对象,确保WordPress能正确生成符合规范的JSON响应。 - 可选:添加权限控制:如果不想让所有人都访问这个端点,可以给路由添加权限回调,比如只允许管理员查看:
register_rest_route( 'theme/v1', '/get_theme_list/', array( 'methods' => 'GET', 'callback' => 'theme_list_function', 'permission_callback' => function(){ return current_user_can('manage_options'); } ) );
原代码的问题根源
wp_get_themes()返回的是WP_Theme类的实例集合,这些对象内部的核心属性(比如主题名称、版本)都是受保护的,JSON序列化器无法读取这些属性,所以返回的结果会是空对象或者缺失关键信息。通过提取公共方法返回的数值,就能得到结构清晰、符合预期的JSON数据了。
内容的提问来源于stack exchange,提问作者Krishna Ballabh Gupta
相关产品推荐
相关产品推荐

