我试图在我的博客上显示最受欢迎的(最近的)帖子。我为这个做了一个特殊的配方。我正在查询以下帖子:
$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作为“筛选”的方式,只是排序。
这可能吗?谢谢
最合适的回答,由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\');
希望这会有所帮助。