WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm trying to show the most popular (recent) posts on my blog. I have made a special formula for this. I am querying for these posts like so:

$args = array(
'post_type'     => 'post',
'post_status'   => 'publish',
'meta_key'      => '_post_popularity',
'meta_query'  => 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 ); 

I don't think that is correct however, as WP is interpreting "key" as a meta_key, whereas I want to use the Publish Date in the post table.

Taking out "meta_query" works fine, I can see the most popular posts, but it doesn't restrict it to the most recent ones. I check the documentation but post_date is not mentioned as a way to "filter", only sort.

Is this possible? Thanks.

share|improve this question
up vote 1 down vote accepted

As you've discovered, meta queries only work with the post meta table, it is indeed looking for a meta key of post_date.

You can't do timespan queries with a simple query, but we can accomplish this with a combination of a query for the meta key, and a posts_where filter directly on the SQL to get the time span.

first, the filter function (from 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;

then the query, adding then removing the filter immediately after:

$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() ):
        // your loop stuff
share|improve this answer
Ahh I see. I had noticed people using the posts_where filter, but I assumed that WP would have this capability within the query_posts functionality. It certainly is much easier to write a query to limit within 1 table than multiple so I'm not sure why they don't have this feature yet! Thanks for your help though it worked great! – Totomobile Jul 1 '12 at 5:29

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.