使用分页功能按元键过滤帖子

时间:2013-03-25 作者:Milos Matovic

正在尝试从主查询中筛选出具有特定meta\\u键的特定帖子。。。问题是它不适用于分页,这是我在这里的问题。

有人知道怎么解决这个问题吗?

$paged = (end( explode( \'/\', $_SERVER[\'REQUEST_URI\'] ) )) ? end( explode( \'/\', $_SERVER[\'REQUEST_URI\'] ) ) : 1;
$posts_per_page = 10;
$offset = ($paged-1) * $posts_per_page;     
function strip_codes_deals ($where = \'\', $ignore_posts) {
    global $wpdb, $ignore_posts;
    if (count($ignore_posts) > 0) {
        $where .= \' AND \' . $wpdb->posts . \'.ID NOT IN(\' . implode (\',\', $ignore_posts) . \') \';
    }
    //echo $where;
    return $where;
}
$wp_query = new WP_query( \'post_type=deals&orderby=date&order=desc&posts_per_page=\'.$posts_per_page.\'&paged=\'.$paged.\'&meta_key=codes-deal\' );
//          echo \'<pre>\';
//          print_r($wp_query);
//          echo \'</pre>\';
$ignore_posts = array();
if($wp_query) {
    foreach ($wp_query->posts as $post) {
        $codes_deal = get_post_meta($post->ID, "codes-deal", true);
        if($codes_deal == 1) {
            $ignore_posts[] = $post->ID;
        }
    }
    echo \'<pre>\';
    print_r($ignore_posts);
    echo \'</pre>\';              
}               
add_filter( \'posts_where\', \'strip_codes_deals\' );
query_posts( $query_string . \'&post_type=deals&orderby=date&order=desc&posts_per_page=\'.$posts_per_page.\'&paged=\'.$paged );
remove_filter( \'posts_where\', \'strip_codes_deals\' );
这适用于第一个页面,但忽略所有其他页面。有没有办法解决这个问题?

1 个回复
SO网友:s_ha_dum

您在代码中做了一些不同的错误——或者至少是令人费解和怀疑的错误——我确信这会导致您的查询结果与分页不同步。这里有几个问题,包括query_posts 你真的不应该使用它,再加上一些过滤器。老实说,我并不是为了找出到底是什么错,但我相信,主要是what you need is a meta query.

$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
$args = array(
    \'post_type\' => \'deals\',
    \'meta_query\' => array(
        array(
            \'key\' => \'codes-deal\',
            \'compare\' => \'EXISTS\'
        )
    ),
    \'paged\' => $paged 
);
$query = new WP_Query( $args );
其次,您需要清理分页。请参见第一行。我不知道你是否真的想过滤掉你所说的“有特定meta\\u键”的帖子,或者你是否想过滤那些带有\'codes-deals\' = true 但我同意你说的。您可以在其他参数中编辑--orderby, 等。请注意\'compare\' => \'EXISTS\' 仅适用于3.5或更高版本。

That code is almost a copy/paste from the Codex. 我所做的只是编辑了你的一些值。抄本是你的朋友。喜欢它。

现在,将其应用于主查询。为此你需要pre_get_posts, 这比试图操纵WHERE 带的子句post_where 滤器

function exclude_codes_deals_wpse_92268($qry) {
    if (is_main_query()) {
        $qry->set(\'meta_query\', array(array(
             \'key\' => \'codes-deal\',
             \'compare\' => \'EXISTS\'
        )));
        $qry->set(\'post_type\', \'deals\');
    }
}
add_filter(\'pre_get_posts\',\'exclude_codes_deals_wpse_92268\');
未经测试,但我相信我有这个权利。同样,您可以编辑所需的任何其他参数。

那会globally alter your main query, 这就是你说你想做的,但我有我的怀疑。有了这些代码,只有“交易”帖子类型才会显示出来,除非您专门创建查询来获取其他内容。我怀疑除了它是主查询之外,还有其他条件可以更改查询。

结束

相关推荐

WP_Query breaks pagination

我已经研究这个问题一周了。我搜索了无数没有回答这个问题的帖子。我的wp\\u查询似乎破坏了分页。我已经在这里浏览了很多关于wp\\U查询和分页的帖子,但仍然毫无乐趣。据我所知,它的设置是正确的。我有一个实例,它将在一个页面中显示所有帖子,而在另一个页面中,它会重复每个页面上的内容。请参阅下面的代码,以获取带注释的精简版本。有人知道问题出在哪里吗?<?php /* Let\'s asume that this is the search query in the