我目前正在使用以下功能排除主页循环中“精选”类别中的所有帖子:
function main_loop_excludes($query){
if($query->is_main_query() && $query->is_home()){
//'featured' cat ID = 531
$query->set('cat','-531');
}
}
add_action('pre_get_posts','main_loop_excludes');
这非常有效,但我只想从“精选”类别中过滤掉最新帖子而不是所有帖子。这可能吗?
我已经看到了使用WP_Query
过滤掉特定帖子的方法,但我正在寻找一种方法在主Wordpress循环中执行此操作。 pre_get_posts
感觉就像是最好的起点。我是在正确的轨道上吗?
修改
我使用以下代码保存了我要排除的特定帖子的ID(保存为变量$post_to_exclude_ID
):
$post_ids = get_posts(array(
'numberposts' => -1, // get all posts.
'category_name' => 'featured',
'fields' => 'ids', // Only get post IDs
));
// post ID = 2162
$post_to_exclude_ID = $post_ids[0]; // Save ID of most recent post
现在我可以使用原始main_loop_excludes
函数来过滤主循环以仅显示 相关帖子,但我似乎无法扭转此过程。在ID之前添加减号只会破坏该功能(循环然后显示所有帖子)。
新功能:
function main_loop_excludes($query){
if($query->is_main_query() && $query->is_home()){
// Make sure the var is accessible
global $post_to_exclude_ID;
// Set the filter
$query->set('p', $post_to_exclude_ID);
}
}
add_action('pre_get_posts','main_loop_excludes');
这不工作:
$query->set('p', '-2162');
但是相同的样式代码 适用于类别:
$query->set('cat','-531');
注意:感谢Valerius建议找到帖子ID并将其注入$query->set...
并使用var。
答案 0 :(得分:1)
您可以使用wp_get_recent_posts()查找特定类别的最新帖子。
有了这个,我们可以做到以下几点:
function main_loop_excludes($query){
$latest_featured = wp_get_recent_posts(array('numberposts' => 1, 'category' => 531));
if($query->is_main_query() && $query->is_home()){
//'featured' cat ID = 531
$query->set('post__not_in',array($latest_featured[0]['ID'])); //exclude queries by post ID
}
}
add_action('pre_get_posts','main_loop_excludes');
答案 1 :(得分:1)
这是一个能够做到这一点的函数:
function get_lastest_post_of_category($cat){
$args = array( 'posts_per_page' => 1, 'order'=> 'DESC', 'orderby' => 'date', 'category__in' => (array)$cat);
$post_is = get_posts( $args );
return $post_is[0]->ID;
}
用法:说我的类别ID是22,然后:
$last_post_ID = get_lastest_post_of_category(22);
你也可以将一系列类别传递给这个函数。