pre_get_posts 主查询和 post 查询转发对象中的空值

pre_get_posts main query and post query forwarding empty values in object

我正在尝试将 meta_query 添加到我的某些 post 类型(post、事件、议程)。

我有一些使用 pre_get_posts 的经验,我想我会挂钩它并检查数组中是否有 post 类型,我会添加元数据。

我不是总能得到post类型的你,具体情况:

正在加载首页(定义为静态页面),其中包含 3 个查询: 1 用于 posts(使用 query_posts() 且仅定义 posts_per_page,因为 post 类型 "post" 是默认值)。 其他 2 个查询是 get_posts(),因为它们不需要分页。

现在我只是挂钩到动作中并转储提供的对象:

function my_pre_get($query) {
    var_dump($query);
}
add_action( 'pre_get_posts', 'my_pre_get'); 

发生的情况是,在为页面加载执行的每个查询(主查询,我的 query_posts 和 get_posts)中执行的操作 运行s 但是在主查询中,我得到了对象内的所有空值。 在 query_posts 上,我只获得我设置的分页值。 在 get_posts 上,我得到了 post 类型。

现在我不确定该走哪条路...我可以尝试执行一些复杂的检查以找出我所在的页面类型,然后假设 post_type 是 post, 但这似乎是一个非常低效和麻烦的想法。

当查询即将 运行 并修改它时,是否有替代方法始终获取 post 类型?

我也试过挂钩 parse_query,但结果相同。 :/

----编辑 正如所要求的那样,首页模板代码(我认为这对主题根本没有帮助):

<?php /*** Template Name: Front Page */ ?>
<!doctype html>
<html <?php language_attributes(); ?> >

<head>
    <?php wp_head(); ?>
</head>

<body>

    <?php wp_footer(); ?>

</body> 

该动作已添加到 functions.php 中,这与上面的内容差不多。

这是我最近使用的查询,用于检查 post 类型

function faq_query($query){

    if(isset($query->query['post_type'])) {
        if($query->query['post_type'] === 'faqs') {
            $query->set('posts_per_page',-1);
            $query->set('orderby', 'menu_order');
        }
    }

}
add_action('pre_get_posts', 'faq_query', 1 );

这有帮助吗?

我对 class-wp-query.php 进行了深入循环,这是 pre_get_posts 的自然行为。

"Default"查询参数,像post类型,默认items_per_page...等,都设置在一个非常复杂的"IF"集合中。, pre_get_posts 次操作之后。

因此,在 'default' 前端查询中,"post_type" 永远不会作为 query_var 使用,无论使用哪个钩子。需要通过解决方法来确定当前 post 类型是否为 main_query.

中的 'post'

明确回答我的问题:

我认为这可以帮助:

function faq_query($query){

    if(isset($query->query['post_type'])) {
        if($query->query['post_type'] === 'faqs') {
            $meta_key = 'your_meta_key';
            $meta_query = array(
                            'relation' => 'OR',
                            'meta_value_num' => array(
                                'key'     => $meta_key,
                                'compare' => 'EXISTS ',
                            ),
                            array(
                                'key'     => $meta_key,
                                'compare' => 'NOT EXISTS',
                            ),
                        );
                        $query->set( 'orderby', 'meta_value_num' );
                        $query->set( 'meta_query', $meta_query );
        }
    }

}
add_action('pre_get_posts', 'faq_query', 1 );