下面是另一种方法pre_get_posts
.
使用get_posts()
(x2个查询)以获取all 每个岗位类型的岗位ID符合其要求。添加fields
参数(\'fields\' => \'ids\'
) 只获取帖子ID,因为这是我们需要的,其他什么都不需要。这将大大提高性能,对资源也不会太苛刻。因此,您将得到两个post ID数组
现在,您需要将两个数组合并为array_merge()
创建一个“超级”数组,该数组将保存所有post ID
您可能希望将其保存在临时文件中,并在更新、丢弃、删除或发布帖子时刷新临时文件。这将确保不包含您网站的性能。
现在你有了一个符合你需要的ID数组,你可以把这个ID数组传递给post__in
在里面pre_get_posts
示例(未经测试,因为这只是一个示例。很遗憾,我没有时间进行正确的编码)
function get_all_special_posts()
{
/*
* This is here were you would want to introduce your transient
*/
$args1 = [
\'post_type\' => \'post_type_1\',
\'fields\' => \'ids\',
\'nopaging\' => true,
\'meta_query\' => [[ /*Your specific custom fields */ ]]
];
$query1 = get_posts( $args1 );
$args2 = [
\'post_type\' => \'post_type_2\',
\'fields\' => \'ids\',
\'nopaging\' => true,
\'meta_query\' => [[ /*Your specific custom fields */ ]]
];
$query2 = get_posts( $args2 );
$post_ids = array_merge( $query1, $query2 );
/*
* Set your transient here, you would want to store $post_ids in the transient
*/
return $post_ids;
}
记住创建一个函数,在发布、垃圾、取消刷新和更新时刷新瞬态。看看
transition_post_status
为了这个。多功能挂钩。使用
$post->post_type
仅针对您想要的两种职位类型
add_action( \'pre_get_posts\', function ( $q )
{
if ( !is_admin() && $q->is_main_query() && $q->is_home() ) {
$q->set( \'post__in\', get_all_special_posts() );
}
});
请注意,我首先要检查
get_all_special_posts()
实际上有一个有效数组,并且在将其传递给之前它不是空的
post__in