WP REST API中is_main_query()始终返回false的解决方法求助
解决WP REST API中
is_main_query()返回false的问题 我太懂这个坑了——当初第一次对接WP REST API时也踩过同样的雷。核心问题在于REST API的查询逻辑和前端归档页完全不同,下面给你两种靠谱的解决方案:
为什么is_main_query()在这里失效?
WordPress的REST API请求不会触发传统意义上的"主查询"(也就是对应$wp_query的全局主查询对象),它会单独创建一个WP_Query实例来处理接口请求,所以is_main_query()在REST环境下永远返回false,你之前基于这个条件写的排序逻辑自然不会生效。
方案一:调整pre_get_posts的判断条件
你可以在原有的pre_get_posts钩子中,补充对REST请求的判断,替代或配合is_main_query()的检查。首先先写一个辅助函数来识别REST请求:
function is_rest_request() { return defined('REST_REQUEST') && REST_REQUEST; }
然后修改你的pre_get_posts回调代码:
add_action('pre_get_posts', 'custom_sort_events'); function custom_sort_events($query) { // 同时满足:是events文章类型 + (主查询 OR REST请求) if ( $query->get('post_type') === 'events' && ( $query->is_main_query() || is_rest_request() ) ) { // 应用你的时间戳排序规则 $query->set('meta_key', '你的时间戳元数据键名'); $query->set('orderby', 'meta_value_num'); $query->set('order', 'ASC'); // 按需求换成DESC也可以 } }
这样不管是前端归档页的主查询,还是REST API的查询,都会执行你的排序逻辑。
方案二:使用REST API专属过滤器(更推荐)
WP REST API为每个自定义文章类型提供了专属的查询过滤器:rest_{post_type}_query,针对你的events类型就是rest_events_query。用这个过滤器可以精准修改REST请求的查询参数,完全不会影响前端的查询逻辑:
add_filter('rest_events_query', 'rest_sort_events_query'); function rest_sort_events_query($args, $request) { // 给REST查询添加排序规则 $args['meta_key'] = '你的时间戳元数据键名'; $args['orderby'] = 'meta_value_num'; $args['order'] = 'ASC'; return $args; }
这种方式更贴合REST API的设计逻辑,也能避免前后端查询逻辑互相干扰。
额外小提示
如果你的APP需要直接获取这个时间戳元数据,别忘了把它注册到REST API的响应里:
add_action('rest_api_init', 'register_events_meta_rest'); function register_events_meta_rest() { register_rest_field('events', '你的时间戳元数据键名', array( 'get_callback' => function($post) { return get_post_meta($post['id'], '你的时间戳元数据键名', true); }, 'schema' => array( 'type' => 'integer', 'description' => '活动的时间戳' ), )); }
这样APP端就能直接拿到这个时间戳,方便后续的展示和处理。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

