X

How To Track Post Views Without a Plugin Using Post Meta

Snippets by IsItWP

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.

Comments  Leave a Reply

  1. Hi,

    Thanks for the code, it works like a charm without cache enabled…

    But, how can I make it work with wp rocket?

    Please…

  2. Anyone know how to format or truncate the numbers? So instead of 4445 views, it’s 4,445 or 4.5K ?

    1. You may want to use PHP functions like round() and number_format() for this use case.

  3. Hi, somehow my code runs fine but it is doing +2 increment each time, the views go 0, 2, 4, 6. Which has been annoying please help. I placed the code as well as the show post views portion both in a function that has a action after content. The counter works, just that its in multiples of 2.

    1. You may want to check to make sure that this function, setPostViews(get_the_ID()), is only added once. Which hook are you using?

  4. wil the work in lightspeed cache?

  5. Military_blogger June 30, 2019 at 6:17 am

    Code appearing on home page

  6. Opps sorry, please disregard my previous comment. I realized I was calling the setPostViews function multiple times. My bad….

    After fixing this, I am only seeing the view count go up +2 anytime I refresh the single blog post.

    Does anyone have a fix for this? I don’t imagine this will be much of a problem considering that most users wont actually be refreshing the page, though it would be nice to have an actual count number to display..

    Thanks for the code 🙂

  7. How to making a random views count to (600,900)

    please help..

  8. how do i stop auto increase count on page refresh?

  9. Munna Hossain July 3, 2017 at 12:38 am

    Hey, really great tips. Thanks for sharing with us. I am using plugin and google analytics to track my page views.

  10. Hi,

    I want to show the count inside meta class, my meta code is:

    how to print the counter between the meta like author, date, catagories?

  11. Risk Management Guru December 1, 2016 at 2:24 pm

    Hi,

    Do you what is the standard PHP/wp field name for the post views? I only want to display that, simple.
    Thanks.

    Risk Manager

  12. try but don`t work for me.

  13. If I only need 5 I would have to change?

  14. Where will the post views appear?

    1. In the location you place the code within your template from step 2.
      echo getPostViews(get_the_ID()); you can put this within some html and style it if you wish. But the data is saved at post meta you should be able to see that when you edit a post within the custom fields section.

      1. w3t cache make fragment cache available just in pro version $$$

  15. Good afternoon,

    The snippet work great, but I need to reset the value.

    Could someone help me, please.

    I try this but doesn’t work – UPDATE wp_postmeta SET meta_value = ‘0’ WHERE wp_postmeta.meta_key =’post_views_count’

    Thank’s

    1. you can reset by going to your website database look for postmeta, click on it and search for post_view_count and delete all of them

      1. Sorry but i can’t find this field in my database, please explain how to reset counters to 0. Thx

        1. The post meta is found under the wp_postmeta table. If none of the rows in the meta_key column have post_views_count as the value, then it’s possible that the count has not been stored in the database yet.

  16. Hi guys, If someone look for count visits by ip adress, to count only one visit for each visitor this is the right code to do that, I hope is working fine to you, this is my modifications on “setPostViews” function :

    function setPostViews($postID) {
    session_start();
    $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{
    if(!isset($_SESSION[‘post_views_count-‘. $postID])){
    $_SESSION[‘post_views_count-‘. $postID]=”si”;
    $count++;
    update_post_meta($postID, $count_key, $count);
    }
    }
    }

    Just replace this function with old function and Well Done!!

    1. not working

      1. Lokendra Malviya October 16, 2017 at 1:04 am

        Thank you so much. The code is working for me:)

  17. Hey
    I am using it and it’s great But facing an annoying problem
    It counts twice in custom post type.

    Don’t know what to do to fix it any Help?

    1. Have you place the setPostViews() function within the single.php template or another template ?

      1. patrick1991groot August 27, 2016 at 6:28 am

        I have the exact same problem! Yes i placed it in only the single.php file… i use this icm wp car manager plugin… Also counting by 2 4 6 by every visit.

  18. This is a useful snippet. Thanks for sharing!

  19. Modifiqué la función y le agregué para que comprobace si había una sesión activa de la visita del póst y pues.. aca está;

    function wpb_set_post_views($postID) {
    session_start();
    $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{
    if(!isset($_SESSION[”post_views_count-‘. $postID])){
    $_SESSION[”post_views_count-‘. $postID]=”si”;
    $count++;
    update_post_meta($postID, $count_key, $count);
    }
    }
    }

    1. y para qué serviría eso? algo en especial?

  20. I’m getting double count each view. When viewed the post add two views instead of one.

    1. I have the same problem. Does anyone have any idea what’s the issue?

      1. what template file are you putting the setPostViews() function ?

        1. single.php
          I’ve tried putting setPostViews() both inside and ouside the loop, but couldn’t fix the issue.

          1. patrick1991groot August 27, 2016 at 6:29 am

            Also having the same issue…

          2. This works by calling the set views function adding post meta, so unless its called twice you would only get 1 view. I would check your theme to make sure nothing like multiple loops or anything is involved. However unless I was to see your themes single.php I could not be sure what the exact issue is.

  21. I can’t get this to work with W3 Total Cache. Is there any way it can work with it or is it absolutely impossible?

  22. Anybody else having issues getting the counter to work? I’m using WordPress 4.2 and have W3 Total Cache installed. The count remains at 0 no matter what (logged in user, logged out user, page refresh, cleared the cache).

    1. I’m only looking at getting the count to function via the backend. Any ideas would be greatly appreciated.

      1. me too!

        1. Did you solved this?. I think i can help you.

  23. fantastic, how do i get it to count post views only today
    thanks

  24. Works great in single.php, but how about in category.php. If you refresh the page all posts add one view, it should retrieve the real number of the post views.

    1. Have you figured this out yet? I’m using WP 5.2.2 and I’m getting +2 count on refresh… Other than that it looks like its working….

  25. works great, exactly what I wanted. thnx for sharing bro.

Add a Comment Cancel reply

We're glad you have chosen to leave a comment. Please keep in mind that all comments are moderated according to our privacy policy, and all links are nofollow. Do NOT use keywords in the name field. Let's have a personal and meaningful conversation.

WordPress Launch Checklist

The Ultimate WordPress Launch Checklist

We've compiled all the essential checklist items for your next WordPress website launch into one handy ebook.
Yes, Send Me the Free eBook!
[60% OFF Today!]
[60% OFF Today!]
[10% OFF Today!]
[10% OFF Today!]
[50% OFF Today!]
[50% OFF Today!]