按发布后日期查询帖子,但按自定义元键排序

时间:2012-07-01 作者:Totomobile

我试图在我的博客上显示最受欢迎的(最近的)帖子。我为这个做了一个特殊的配方。我正在查询以下帖子:

$args = array(
\'post_type\'     => \'post\',
\'post_status\'   => \'publish\',
\'meta_key\'      => \'_post_popularity\',
\'meta_query\'  => array(
    array(
        \'key\' => \'post_date\',
        \'value\' => date("Y-m-d H:i:s", strtotime(\'-30 days\')),
        \'compare\' => \'>\',
        \'type\' => \'DATETIME\'
    )
),
\'orderby\'       => \'meta_value_num\',
\'order\'         => \'DSC\');
query_posts( $args ); 
然而,我认为这并不正确,因为WP将“key”解释为meta\\u键,而我想在post表中使用发布日期。

去掉“meta\\u query”效果很好,我可以看到最受欢迎的帖子,但它并不局限于最新的帖子。我查看了文档,但没有提到post\\u date作为“筛选”的方式,只是排序。

这可能吗?谢谢

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

正如您所发现的,元查询只适用于post meta表,它确实在寻找post_date.

您不能用简单的查询进行时间跨度查询,但我们可以通过对元键的查询和posts_where 直接在SQL上进行筛选以获取时间跨度。

首先,过滤器功能(来自WP_Query):

function wpa57065_filter_where( $where = \'\' ) {
    // posts in the last 30 days
    $where .= " AND post_date > \'" . date(\'Y-m-d\', strtotime(\'-30 days\')) . "\'";
    return $where;
}
然后是查询,添加过滤器,然后立即删除过滤器:

$args = array(
    \'meta_key\' => \'_post_popularity\',
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'DSC\'
);

add_filter( \'posts_where\', \'wpa57065_filter_where\' );
$recent_popular = new WP_Query( $args );
remove_filter( \'posts_where\', \'wpa57065_filter_where\' );

if( $recent_popular->have_posts() ):
    while( $recent_popular->have_posts() ):
        $recent_popular->the_post();
        // your loop stuff
    endwhile;
endif;

SO网友:Maju

一点点(?)很晚了,但这对别人的帮助可能和对我的帮助一样多。

如果你想在post_date, 您应该使用date_query 而不是meta_query.

$args = array(
\'post_type\'     => \'post\',
\'post_status\'   => \'publish\',
\'meta_key\'      => \'_post_popularity\',
\'date_query\'  => array(
    array(
        \'after\' => \'-30 days\', // any strtotime() compatible string should work
    )
),
\'orderby\'       => \'meta_value_num\',
\'order\'         => \'DESC\');
希望这会有所帮助。

结束

相关推荐

Creating Custom Query

我在这里碰到了某种绊脚石,我找不到克服它的方法。我正在尝试创建一个自定义的WP查询,它可以按原籍国搜索帖子,同时选择多个国家。我有一个将国家映射到地区的表,因此初始查询将搜索所选地区,并以数组形式返回该地区的所有国家。例如,如果选择非洲,它将返回非洲境内的一系列国家。if(!empty($_REQUEST[\'region\'])){ $region = $_REQUEST[\'region\']; $regionresult = mysql_query(\"S