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 );
我正在尝试将 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 );