Está procurando uma maneira de rastrear as visualizações de posts sem um plug-in usando post meta? Embora provavelmente haja um plug-in para isso, criamos um trecho de código rápido que você pode usar para rastrear visualizações de posts sem um plug-in usando post meta no WordPress.
Instruções:
Adicione esse código ao arquivo functions.php do seu tema ou em um plug-in específico do site:
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, adicione esse código também a uma coluna no administrador do WordPress que exibe as visualizações de post:
// 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()); } }
Essa parte do código de rastreamento de visualizações definirá as visualizações de posts. Basta colocar esse código abaixo no arquivo single.php dentro do Loop do WordPress.
<?php setPostViews(get_the_ID()); ?>
Observação sobre o cache de fragmentos: Se você estiver usando um plug-in de cache como o W3 Total Cache, o método acima para definir visualizações não funcionará, pois a função setPostViews()
nunca seria executada. No entanto, o W3 Total Cache tem um recurso chamado cache de fragmentos. Em vez do método acima, use o seguinte para que a função setPostViews()
seja executada sem problemas e rastreie todas as visualizações de posts mesmo quando o cache estiver ativado.
<!-- mfunc setPostViews(get_the_ID()); --><!-- /mfunc -->
O código abaixo é opcional. Use esse código se quiser exibir o número de visualizações em suas postagens. Coloque esse código dentro do Loop.
<?php echo getPostViews(get_the_ID()); ?>
Observação: Se esta é a primeira vez que você adiciona trechos de código no WordPress, consulte nosso guia sobre como copiar/colar corretamente trechos de código no WordPress, para não danificar acidentalmente seu site.
Se você gostou desse snippet de código, considere dar uma olhada em nossos outros artigos no site, como: 10 melhores plug-ins de depoimento do WordPress e como configurar o rastreamento de autores no WordPress com o 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!