修改分页和元键的主循环查询

时间:2011-01-28 作者:Maor Barazany

我试图以这样的方式更改主循环:我有一个显示特色项目的元键,它应该只显示在博客的主页上。我将它们拉入与主循环分离的代码中,类似于-

$leading = get_posts(\'showposts=5&meta_key=_pull_leading3&meta_value=on\');      
    foreach ($leading as $post) : 
        setup_postdata($post);
        //some code to show posts data
    endforeach;
然后在主循环中,我只想显示未指定为特色的帖子,所以我用query\\u posts更改了主循环:

query_posts(\'posts_per_page=7&paged=\'.$paged.\'&meta_key=_pull_leading3&meta_value=off\');
直到这里一切都很好。但是,我也希望,如果我转到任何其他较旧的页面,我将再次获得特色帖子,如果它们应该通过常规顺序自然存在的话。在这种情况下,由于我使用了meta值,所以我没有得到它们。如果我尝试这样的事情-

if (is_home() && $paged == \'0\') {  //$paged value is 0 on 1st page and not 1 !          
        query_posts(\'posts_per_page=7&paged=\'.$paged.\'&meta_key=_pull_leading3&meta_value=off\');                         
      }
      else {
        query_posts(\'posts_per_page=7&paged=\'.$paged);          
      } 
然后在第#2页上,我确实根据需要获得了帖子,但我重复了第#1页(主页)上的部分帖子(因为在主页循环中,我只显示了没有特色的帖子,所以因为该部分帖子已经显示在那里,现在应该从第#2页中排除)。

我如何改变主循环,使主页显示没有特色的帖子,而其他$页面将以本地方式显示帖子,无论它们是否有特色,并且不重复上一页的帖子?

我真的希望我能成功地解释我的问题。。。

非常感谢Maor

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

我想这会满足你的要求。但我仍然想知道粘贴帖子是否会更好。。。

if (is_home() && $paged == \'0\') {  //$paged value is 0 on 1st page and not 1 !          
        query_posts(\'posts_per_page=7&paged=\'.$paged.\'&meta_key=_pull_leading3&meta_value=off\');                         
      }
      else {
        // recreate the home page "loop" to figure out which posts to exclude
        $excluded = array_map(
            create_function(\'$post\', \'return $post->ID;\' ),
            get_posts(\'numberposts=7&meta_key=_pull_leading3&meta_value=off\')
            );
        query_posts( array(
            \'posts_per_page\' => 7,
            \'paged\' => $paged-1, // since we already excluded the first page
            \'post__not_in\' => $excluded) );          
      } 

SO网友:Maor Barazany

@正如我之前评论的那样,goldenapples,您的代码提供了一个良好的开端,但在上一页提供了一些不必要的帖子。我添加了一个函数来过滤posts\\u where,它计算第一页中最后一篇帖子的日期,并过滤出比它早的帖子。它似乎做到了这一点,但我不完全确定其中是否有bug。你能看看这个函数并说出你的观点吗:

add_filter( \'posts_where\' , \'tc_special_posts_where\' );
function tc_special_posts_where( $where ) { 
    global $wpdb, $paged, $post;
    $paged = get_query_var(\'paged\');
    $g = get_posts(\'numberposts=7&meta_key=_pull_leading3&meta_value=off&paged=0\');
    foreach ($g as $p) { $i = $p->post_date; } 

    if (is_home() && $paged > 0) {
     $where .= " AND post_date < \'" . $i . "\'";
    }   
return $where; }
更重要的是,由于我们更改了$pagednext_posts_link() 在这种情况下,将当前页显示为下一页,因此我必须进行一些替换-

$uri = $_SERVER["REQUEST_URI"];
$x = preg_match(\'/(\\d){1,}/\', $uri, $matches); //catch the digit of page number     
$nextlink = get_next_posts_link(\'Next Page »\', 0);
if ($matches) {   //on the first page not needed to replace, only from page 2 and on
    $nextlink = preg_replace(\'/(\\d){1,}/e\', \'"$1"+1\'  ,$nextlink);  
}
<span class="alignleft"><?php echo $nextlink;?></span>

结束

相关推荐

Paging in a sidebar mini loop

我切换到了另一个主题,并决定用其中的一些默认代码制作一个小部件,在自定义循环中显示我的美味帖子、推特帖子、su帖子和youtube视频(不包括主循环中的这些类别)。但是现在。。。分页不再工作。我制作了这个小部件:// =============================== EDL Sidebar Posts Widget ====================================== class SidebarPosts extends WP_Widget { &#x