使用pre_get_posts仅排除Wordpress主循环中类别的最新帖子?

时间:2014-02-07 13:00:55

标签: wordpress

我目前正在使用以下功能排除主页循环中“精选”类别中的所有帖子:

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。

2 个答案:

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

你也可以将一系列类别传递给这个函数。