Are you looking for a way to track post views without a plugin using post meta? While there’s probably a plugin for this, we have created a quick code snippet that you can use to track post views without a plugin using post meta in WordPress.
Instructions:
Add this code to your theme’s functions.php file or in a site-specific plugin:
function getPostViews($postID){ $count_key = 'post_views_count'; $count = get_post_meta($postID, $count_key, true); if($count==''){ delete_post_meta($postID, $count_key); add_post_meta($postID, $count_key, '0'); return "0 View"; } return $count.' Views'; } function setPostViews($postID) { $count_key = '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); } } // Remove issues with prefetching adding extra views remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
Optionally add this code as well to a column in the WordPress admin that displays the post views:
// Add to a column in WP-Admin add_filter('manage_posts_columns', 'posts_column_views'); add_action('manage_posts_custom_column', 'posts_custom_column_views',5,2); function posts_column_views($defaults){ $defaults['post_views'] = __('Views'); return $defaults; } function posts_custom_column_views($column_name, $id){ if($column_name === 'post_views'){ echo getPostViews(get_the_ID()); } }
This part of the tracking views code will set the post views. Just place this code below within the single.php file inside the WordPress Loop.
<?php setPostViews(get_the_ID()); ?>
Note about fragment caching: If you are using a caching plugin like W3 Total Cache, the method above to set views will not work as the setPostViews()
function would never run. However, W3 Total Cache has a feature called fragment caching. Instead of the above, use the following so the setPostViews()
will run just fine and will track all your post views even when you have caching enabled.
<!-- mfunc setPostViews(get_the_ID()); --><!-- /mfunc -->
The code below is optional. Use this code if you would like to display the number of views within your posts. Place this code within the Loop.
<?php echo getPostViews(get_the_ID()); ?>
Note: If this is your first time adding code snippets in WordPress, then please refer to our guide on how to properly copy / paste code snippets in WordPress, so you don’t accidentally break your site.
If you liked this code snippet, please consider checking out our other articles on the site like: 10 best WordPress testimonial plugins and how to Set Up Author Tracking in WordPress with Google Analytics.
thanks
I added the remove_action() , but still it adds 1 count to the recent post when i open any of the post. Please help .
Hey thanks man! But i dont get the image with views as you show here. Can you help me on this to get the image also.
I’ve found that this code snippet doesn’t match with what I see with my Jetpack stats. Anybody else having the same problem?
it counts only unique views, how to change it to counts every single view (every refresh)
Awesome tips ! Thanks a lot.
Awesome tips ! Thanks for sharing. I’d need a little more help though.
I would like to display the most popular posts for only the last week or month ? Anybody can help ? Thx
Great snippet. Works awesome.
Do you know if it is possible to now have a “Most Popular Categories” list, based on the categories of the most viewed posts?
I have tried this code it is inserting count but displaying same count for all post even I have added
remove_action( ‘wp_head’, ‘adjacent_posts_rel_link_wp_head’, 10, 0);
Any idea?
This looks like it works but I see an issue in my particular case…I am using this code within a sidebar widget (adding read count to a latest posts query):
$args = array( ‘numberposts’ => 3, ‘order’=> ‘ASC’, ‘orderby’ => ‘title’ );
$postslist = get_posts( $args );
foreach ($postslist as $post) : setup_postdata($post);
setPostViews(get_the_ID()); ?>
I see two things:
– The three posts listed always show an incremental count compared to one another (post 1 = 0 views, 2 = 1 view, 3 = 2 views). I’m not sure that is accurate.
– When I refresh the page, these all have 3 added to the count (0, 1, and 2 now show 3, 4 and 5). I did add the remove_action code to functions.php but it looks like it had no effect.
Not sure what could be the cause for this….
when i create a new tab in firefox, and it increments by 1, but i refresh the page, it increments by 2.
Anyone has the same problem? why it happens? becauseof browser?
hmmmmmm, how can I decrease by one after, say 24 hours ir incrementing?
Let me just see if I understand correctly you want to minus one from each view every 24 hours ?
Yep, for each hit, subtract a hit 24 hours later. Get it? Ended up using a cron job. If you have an easier solution. I’m all ears.
a cron is about the best way, another way would rely on people viewing a page to decrement and could easily get way behind.
[…] Track post views using post meta […]
thank you man for your work.. it’s great
awesome work
can i get code
to show the most viewed posts in widget or page
Kevin,
Can this script be used for custom post types?
Hi Rafa, should be able to use this without any problems.
Ok, I will give it a shot. How do we get the view counts to display on the CPT admin post columns?
Thanks!
Figured out my issue, I had to add “post_type=any” to the query and I now see all my custom post types.
Awesome! Thanks for the code, seems to be working great.
Thanks a lot dear…A great piece of work….
Yesterday I said it works…but somehow when we click on post it calculates fine but when we go to second newest post and then go to newest post the count for newest post is incremented by 2. Similar pattern can be seen with three.
In case of three posts if we go to third newest post it will be incremented by 1 but when we go to second newest post it gets incremented by 2 and then go to newest post it is also incremented by 2.
It we great if anyone can help on this issue.
me too, every post is incremented by 2. why???
it works on chrome, firefox, but in safari, when refresh page the view number increase by 2, it there a fix, does anyone tested on safari
find the problem, a line of jquery code makes it count twice when refresh, no idea why, but fixed it.
Hello, I have the same problem. Can you help me how did u fix it please? For me it counts twice in all of browsers
Hi everybody !!
Great tips ! Thank you very much.
I was wondering if we can add a “time” data ?
Because I would like to show the view of yesterday/ 2 days ago / 2 days ago etc… ?
wp_get_archives lets you define a short time period something like this I think would be useful.
http://codex.wordpress.org/Function_Reference/wp_get_archives
Ok I know what you mean but this is not exactly what I want.
I would like to make a kind of graph.
To make a function which show if the post has positive or negative views. So I want to compare the view from yesterday and from today.
Well that is much more complex, I would suggest something more simple grab a plugin like this.
http://wordpress.org/extend/plugins/official-statcounter-plugin-for-wordpress/
Hi Kevin – Great stuff 😉 Quick question: Its works smooth for me but the counting starts from 0. Is possible to retrieve the views that I already had on the posts? thx
Hi Hugo,
Well the snippet saves to post meta, so if you had removed the snippet then added it again should continue from last values. However you can always edit the custom fields to change the values.
Hello
Kevin Chard , i come from Viet Nam, my english is not good 🙁
I want to ask you one question 🙂 : how to display post view for only admin (only admin can see the post view ) 😀
You can send the code via my email 😀
this snippet will display the post views within the post column within the admin. However if you want to display within the site but only for admins you can just do this.
if(is_admin()){
echo getPostViews(get_the_ID());
}
Kevin how can I configure it so that it only counts visitors who aren’t admin? This is not a display issue but a counting one. Im sure !is_admin() comes into it but not sure where? Thanks for great snippets btw.
This should work for you, just replace step one code with the following.
if(!current_user_can(‘administrator’)){
echo setPostViews(get_the_ID());
}
How can we display the post views only in the admin page where all posts are displayed. I mean the edit.php page
I posted a snippet to do just that.
http://wpsnipp.com/index.php/functions-php/display-post-views-within-admin-post-columns/
how to remove the “Views” word ?
Edit Line 9
Thanks, I am using it on a NEW site and it is working brilliantly….
I am learning PHP on the GO, so your code taught me a couple of things.. THANKS AGAIN…
Cool Zaid, glad to hear you like the site and hope that you enjoy the snippets!