是否从主页中排除标签的前‘n’个帖子数?

时间:2013-11-24 作者:its_me

Use case (example): 使用单独的自定义查询,我的网站主页显示了5篇特色文章,标记为“亮点(Highlights)”,然后是来自主查询的最新文章。

我不想在最新的帖子中出现5篇特色帖子,即前5篇标记为“亮点”的帖子。

换言之,最新的帖子应该包括所有最新的帖子,但这样做时,如果发现一篇帖子被标记为“亮点”,并且是前5篇中的一篇,那么应该将其排除在外。

所有这些都不会破坏分页。

我该怎么做?

我不知道该怎么做:

function itsme_filtered_latest_posts( $query ) {

    if( $query->is_home() && $query->is_main_query() ) {

        $query->set( ... );

        $query->set( \'offset\', ... );

    }

}
add_action( \'pre_get_posts\', \'itsme_filtered_latest_posts\' );
就像我说的,我只有一个模糊的想法,这就像没有一样好。

2 个回复
SO网友:user9

A在您的示例中,您可以访问所有WP\\u Query Object Query\\u vars(请参见[此处])1, 您可以使用post__not_in 查询中的query\\u var。它将ID数组作为参数。因此,首先您要查询标记为“突出显示”的帖子。在显示它们时,您可以将它们的所有ID添加到一个数组中,如下所示

<?php
$do_not_duplicate = array(); // set befor loop variable as an array

while ( have_posts() ) : the_post();
    $do_not_duplicate[] = $post->ID; // remember ID\'s of \'highlighted\' posts

    //display posts

endwhile;
?>
然后像这样开始另一个查询。

<?php
// another loop without duplicates
query_posts( array(
    \'post__not_in\' => $do_not_duplicate
    )
);
while ( have_posts() ) : the_post();
    // display your posts without the highlighted
endwhile;
?>

SO网友:s_ha_dum

执行以下操作:

function get_custom_posts_wpse_124312() {
  static $post_qry;
  if (!empty($post_qry)) {
    return $post_qry;
  } else {
    $post_qry = new WP_Query(array(\'post_type\'=>\'post\',\'posts_per_page\'=>2)); // whatever arguments you need
  }
  return $post_qry;
}

function filter_featured_special_wpse_124312($qry) {
  if ($qry->is_main_query()) { // whatever conditions you need
    remove_action(\'pre_get_posts\',\'filter_featured_special_wpse_124312\');
    $fs = get_custom_posts_wpse_124312();
    if (!empty($fs)) {
      $ids = wp_list_pluck($fs->posts,\'ID\');
      $qry->set(\'posts__not_in\',$ids);
    }
  }
}
add_action(\'pre_get_posts\',\'filter_featured_special_wpse_124312\');
Theget_custom_posts_wpse_124312() 应该使用您需要的任何参数来检索您的“5篇特色文章,标记为‘亮点(Highlights)””。我假设tax_query? 然后使用该数据排除从主查询返回的帖子。然后您可以使用get_custom_posts() 在模板中检索要显示的post对象。您需要在模板文件中为其创建一个循环。因为$post_qry 是静态的“特色”查询只能运行一次。

结束