设置偏移量时如何选择具体查询?

时间:2015-11-02 作者:Noob17

在wordpress中,我添加了一个设置偏移量的函数,如下所示:

add_action(\'pre_get_posts\', \'myprefix_query_offset\', 1 );
function myprefix_query_offset(&$query) {

    if ( ! $query->is_home() ) {
        return;
    }

    $offset = 1;
    $ppp = 3;

    if ( $query->is_paged ) {
        $page_offset = $offset + ( ($query->query_vars[\'paged\']-1) * $ppp );
        $query->set(\'offset\', $page_offset );
    }
    else {
        $query->set(\'offset\',$offset);
    }
}
此函数的作用是添加1的偏移量,以便不显示第一篇文章。很好,很完美。

但当然是用“!query->is\\u home“它会从我网站上的每个查询中略微删除第一篇帖子。

我需要做的是将此函数仅应用于一个查询。

所以我的问题是:我如何选择一个特定的查询,是否可能,甚至可能,我是否需要以其他方式进行选择?

______________________对我有效的解决方案__________________________

我可以在我的模板页面“页面博客”的循环中设置“offset”参数。php“像这样而不破坏分页(在functions.php中):

add_action(\'pre_get_posts\', \'myprefix_query_offset\', 1 );
function myprefix_query_offset(&$query) {

        if ( !is_page_template( \'page-blog.php\' )  ) {
        return ;
    }

    $offset = 1;
    $ppp = 3;

    if ( $query->is_paged() ) {
        $page_offset = $offset + ( ($query->query_vars[\'paged\']-1) * $ppp );
        $query->set(\'offset\', $page_offset );
    }
    else {
        $query->set(\'offset\',$offset);
    }
}
因此,现在它将offset参数应用于该页上已分页的所有循环。为了使其仅适用于已分页的查询,我必须将参数“posts\\u per\\u page”=>-1添加到未分页且不需要偏移量的查询中。因此,在我的情况下,这是:

$featured_item = array(
    \'post_type\'=> \'post\',
    \'status\' => \'publish\',
    \'posts_per_page\'=> -1
);

get_posts($featured_item);
这个解决方案允许单独显示最新的帖子,当然也允许使用分页和偏移量显示所有帖子。也许有人会用到它。

非常感谢s\\U h\\U dum,我永远感谢你的帮助!

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

如果您只希望实现一个查询,那么只需通过offset 参数数组中的参数。

$offset = 1;
$ppp = 3;

if ( $query->is_paged ) {
    $page_offset = $offset + ( ($query->query_vars[\'paged\']-1) * $ppp );
}

blog_items = array(
    \'post_type\'=> \'post\',
    \'paged\' => $paged,
    \'posts_per_page\'=> $ppp,
    \'status\' => \'publish\',
    \'offset\' => $offset
);

$blogposts = get_posts($blog_items);
但是,由于您正在尝试分页,因此可能仍有问题。让所有的论点都通过可能会更好pre_get_posts 不仅仅是其中的一些:

// in functions.php
add_action(\'pre_get_posts\', \'myprefix_query_offset\', 1 );
function myprefix_query_offset(&$query) {

    if (is_main_query() || is_page_template( \'page-blog.php\' ) ) {

      $offset = 1;
      $ppp = 3;

      if ( $query->is_paged ) {
          $page_offset = $offset + ( ($query->query_vars[\'paged\']-1) * $ppp );
          $query->set(\'offset\', $page_offset );
      }
      else {
          $query->set(\'offset\',$offset);
      }

      $query->set(\'post_type\',\'post\');
      $query->set(\'paged\',$paged);
      $query->set(\'posts_per_page\',3);
      $query->set(\'status\',\'publish\');

    }
}
那么页面模板中的正常循环应该可以工作:

if(have_posts()) {
  while(have_posts()) {
    the_post();

  }
}
使用remove_action(\'pre_get_posts\', \'myprefix_query_offset\', 1 ); 删除操作。

相关推荐

如何读取WordPress$Query关联数组(散列)键的值

WordPress编程新手(来自更为传统的环境),并试图了解其一些“独特”特性。我们的网站上有一个目录页,此代码驻留在functions.php, 如果条件为true,则调整结果。if( $query->is_post_type_archive( \'directory\' ) ){ ...//do stuff } 我想知道如何获取is_post_type_archive 这就是“目录”当我对值使用测试时。。。var_dumb($query->is_post