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

时间:2018-08-08 14:39:49

标签: wordpress customization

我正在尝试向某些帖子类型(帖子,事件,议程)添加meta_query。

我有一些使用pre_get_posts的经验,我猜想我只是想钩住它,并检查每当post类型在数组中时,我都会添加元。

我无法始终获得您的职位类型,详细情况如下:

正在加载首页(已定义静态页面),其中包含3个查询: 1个帖子(使用query_posts()且仅定义posts_per_page,因为默认帖子类型为“ post”)。 另外2个查询是get_posts(),因为它们不需要分页。

现在我只是迷上了动作并转储提供的对象:

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

发生的是,该操作在针对页面加载执行的每个查询(主查询,我的query_posts和get_posts)上运行 但是在主查询上,我得到了对象内部的所有空值。 在query_posts上,我仅获得我设置的分页值。 在get_posts上,我可以看到帖子类型。

现在我不确定该走哪条路...我可以尝试实施一些复杂的检查来找出我所在的页面的类型,然后假设post_type是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中,而上面已经差不多了。

4 个答案:

答案 0 :(得分:0)

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

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 );

有帮助吗?

答案 1 :(得分:0)

我深入研究了class-wp-query.php,这是pre_get_posts的自然行为。

“默认”查询参数(例如帖子类型,默认items_per_page ...等)均在pre_get_posts操作之后的 中设置为一个非常复杂的“ IF”集合。

因此,在“默认”前端查询中,无论使用哪个钩子,“ post_type”将永远无法用作query_var。需要通过变通办法来找出当前的帖子类型在main_query中是否为“ post”。

明确回答我的问题:

答案 2 :(得分:0)

我不确定我是否真的了解上面的确切问题;但是我想我也遇到了同样的问题,这段代码对我来说很好用。因此,如果在加载它们的页面上使用$ query = new WP_Query($ args)(而不是主查询have_posts()),则可以在主查询之外访问post_type。下面的代码已在最新的Wordpress和WooCommerce上进行了测试,但出于不同的目的。不过应该清楚。

function filter_query($query){

    if (!is_admin()) {
        $post_type = $query->get('post_type');

        if ($post_type === 'stores') {
            //Custom query: Store post items
            $query->set('posts_per_page', '400');

        } elseif (is_array($post_type) && $post_type[0] === 'product_variation') {
            //Custom query: Woo Variations
            $query->set('posts_per_page', '20');

        } elseif ($post_type === ""  && $query->is_main_query()){
            //Main Query
            $query->set('posts_per_page', '5');
            $query->set('orderby', 'title');
            $query->set('order', 'ASC');

        } else{
            //Other
            //$query->set('posts_per_page', '20');
        }
    }
    return $query;
}
add_action('pre_get_posts', 'filter_query');

答案 3 :(得分:0)

我认为这可以帮助您

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 );