我正在尝试向某些帖子类型(帖子,事件,议程)添加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中,而上面已经差不多了。
答案 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 );