¿Estás buscando una manera de rastrear las visitas a las entradas sin un plugin usando post meta? Si bien es probable que haya un plugin para esto, hemos creado un fragmento de código rápido que se puede utilizar para realizar un seguimiento de vistas de post sin un plugin usando post meta en WordPress.
Instrucciones:
Añade este código al archivo functions.php de tu tema o en un plugin específico del sitio:
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);
Opcionalmente, añada también este código a una columna del administrador de WordPress que muestre las vistas de las entradas:
// 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()); } }
Esta parte del código de seguimiento de vistas establecerá las vistas de la entrada. Sólo tiene que colocar este código a continuación dentro del archivo single.php dentro del bucle de WordPress.
<?php setPostViews(get_the_ID()); ?>
Nota sobre el almacenamiento en caché de fragmentos: Si está utilizando un plugin de almacenamiento en caché como W3 Total Cache, el método anterior para establecer vistas no funcionará, ya que la función setPostViews()
nunca se ejecutaría. Sin embargo, W3 Total Cache tiene una función llamada fragment caching. En lugar del método anterior, utilice el siguiente para que la función set
PostViews() se ejecute correctamente y rastree todas las vistas de sus entradas incluso cuando tenga habilitado el almacenamiento en caché.
<!-- mfunc setPostViews(get_the_ID()); --><!-- /mfunc -->
El siguiente código es opcional. Utilice este código si desea mostrar el número de visitas dentro de sus mensajes. Coloque este código dentro del Bucle.
<?php echo getPostViews(get_the_ID()); ?>
Nota: Si es la primera vez que añade fragmentos de código en WordPress, consulte nuestra guía sobre cómo copiar / pegar correctamente fragmentos de código en WordPress, para no romper accidentalmente su sitio.
Si te ha gustado este fragmento de código, por favor considere revisar nuestros otros artículos en el sitio como: 10 mejores plugins de testimonios para WordPress y cómo configurar el seguimiento de autores en WordPress con 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!