1

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(
    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.

1
  • This works perfectly though if you save additional date information on a post in the post_meta table. Sep 26, 2016 at 13:44

2 Answers 2

1

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() ):
        $recent_popular->the_post();
        // your loop stuff
    endwhile;
endif;
1
  • 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, 2012 at 5:29
2

A little(?) late, but this might help others as much as it helped me.

If you are going to get posts by post_date, you should use date_query instead of 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');

Hope this will help.

1
  • I wanted to filter comments posted after specific date, and this date_query worked as charm! Feb 6, 2023 at 13:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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