Show the most popular post per week

The plugin Most Popular Posts doesn’t support WPML and therefore I have tried creating my own.

I have found this tutorial in creating your own code for showing the most popular posts on my site: How to Display Popular Posts by Views in WordPress without a Plugin

However this doesn’t take in the factor of per week. I would like it to be pointed in the right direction on how to do this.

This code updates the posts actual view-count:

function wpb_set_post_views($postID) {
    $count_key = 'wpb_post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
}
//To keep the count accurate, lets get rid of prefetching
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);

Add these fields to the post:

week_count: integer
current_week: datetime

Check if current_week matches the actual current week, otherwise reset the week_count and add 1 and set the current_week to the actual current week.

Is there another way of doing this in a smarter and more effiecient way?

1
1

Okay, so here is the complete query for displaying popular posts of current week. I am using meta_query to limit query results within current week only.

It will get all posts from current week and then sort them by post views count added by custom field wpb_post_views_count that you used in your question.

// Current week's popular posts

$query_args = array(
    'post_type' => 'post',
    'date_query' => array(
        array(
            'year' => date( 'Y' ),
            'week' => date( 'W' ),
        ),
    ),
    'meta_key' => 'wpb_post_views_count',
    'orderby' => 'meta_value_num',
    'ignore_sticky_posts' => 1,
    'posts_per_page' => '-1',
);

$my_query = new WP_Query( $query_args );

if ( $my_query->have_posts() ) :
    while ( $my_query->have_posts() ) : $my_query->the_post();

        // add your loop content here.

    endwhile;
endif;

wp_reset_postdata();

Leave a Comment