sandywp / plugins / wp-postviews
WP-PostViews
Enables you to display how many times a post/page had been viewed.
Ready in seconds.
v2.0.1 100,000+ installs WP 6.8+ PHP 8.2+

What you get inside
4 screens-
Settings -> WP-PostViews, which chooses whose views are counted and how they are recorded
-
The Templates tab, holding the wording the count is written into
-
The count in a post, placed with the shortcode
-
The Most Viewed widget
About this plugin
WP-PostViews counts how many times each post, page or custom post type has been read and gives you somewhere to show the number. The count is kept as post meta, so it sorts, queries and exports like anything else WordPress stores about a post.
Features
- A view count on any post, page or custom post type, printed by a template tag or by the
[views]shortcode. - Two templates you edit yourself, with tokens for the count, the title, the date, the excerpt, the thumbnail, the author and more.
- Choose who is counted — everyone, guests only or logged in users only — and leave known robots out.
- Template tags and a widget for the most and least viewed posts, optionally within a category or a tag.
- A sortable Views column on the post and page list tables.
- The count on the REST API as a
viewsfield, and an AJAX counting path for sites behind a page cache. - A section on the WP-Stats page when that plugin is installed.
Donations
I spent most of my free time creating, updating, maintaining and supporting these plugins, if you really love my plugins and could spare me a couple of bucks, I will really appreciate it. If not feel free to use it without any obligations.
Usage
The simplest way, and the only one that works in a block theme without editing template files, is the shortcode. Put it in the post or page whose count you want shown:
[views]shows the count for the post it appears in.[views id="1"]shows the count for post 1, wherever you put it.
To show the count on every post automatically, a classic theme calls the template tag from index.php, archive.php, single.php or page.php, anywhere inside the loop:
<?php if ( function_exists( 'the_views' ) ) { the_views(); } ?>
The settings live at WP-Admin -> Settings -> WP-PostViews, on two tabs. Settings is where you choose who gets counted and whether WP-Stats is offered a Views section; Templates is where you edit the markup a count is rendered with.
Where the count appears is decided by where your theme calls the_views() or where you put the shortcode. To hide it somewhere in particular, answer the wp_postviews_should_display filter:
add_filter( 'wp_postviews_should_display', function ( $show ) {
return ! is_archive() && ! is_search();
} );
Showing The View Count In A Block
One block is available in the editor, under Widgets:
- Post Views — the view count, rendered with the template from the Templates tab. Leave Post ID at zero to show the count of the post the block is in, which is what an empty
[views]does, or set it to another post’s ID to show that post’s count instead.
It renders on the server, so the block preview in the editor is the real number rather than an approximation, and the count keeps rising in every post showing it without anything being re-saved. Previewing the block in the editor does not count a view.
The shortcode still works and is not going anywhere. [views] and [views id="1"] behave exactly as they always have, and a post already containing one needs no change. The block calls the same code the shortcode calls, so the two render identically — use whichever suits the post.
WP-CLI
wp postviews list
wp postviews list --limit=50 --format=json
wp postviews get 42
The command reads and never writes. No screen in this plugin edits a view count, so the command does not offer one either — wp post meta update <id> views <n> is still there for whoever genuinely needs it, and says plainly that it is reaching past the plugin.
REST API
POST /wp-json/postviews/v1/post/<id>/view
Reading a count needs no route of its own. The count is already published as a read-only views field on the core post resource, so /wp-json/wp/v2/posts/<id> answers with the post and its count together, and a list of posts carries every count in one response.
What the core field cannot do is write, which is what this route is for: it counts a view, and it exists for sites serving cached pages, where the view has to be reported after the page is delivered. It takes the same wp_postviews_nonce the counting script is given, as a nonce parameter.
It is refused unless the site defers counting — that is, unless it has a page cache and has turned the AJAX counting path on. Otherwise the view has already been counted while the page rendered, and counting again here would record every view twice.
A refusal answers 403 — a bad nonce, or a site that counts views while the page renders. A post that does not exist is 404.
This route is an addition. The admin-ajax.php wp_postviews action is unchanged and still supported.
Questions
- How To View Stats With Widgets?
- Go to
WP-Admin -> Appearance -> Widgets - The widget name is Views.
- Go to
- To Display Least Viewed Posts
<?php if (function_exists('get_least_viewed')): ?> <ul> <?php get_least_viewed(); ?> </ul> <?php endif; ?>- The first value you pass in is the post type that you want. If you want to get every post types, just use ‘both’. It also supports PHP array: example
array('post', 'page'). - The second value you pass in is the maximum number of post you want to get.
- Default: get_least_viewed(‘both’, 10);
- The first value you pass in is the post type that you want. If you want to get every post types, just use ‘both’. It also supports PHP array: example
- To Display Most Viewed Posts
<?php if (function_exists('get_most_viewed')): ?> <ul> <?php get_most_viewed(); ?> </ul> <?php endif; ?>- The first value you pass in is the post type that you want. If you want to get every post types, just use ‘both’. It also supports PHP array: example
array('post', 'page'). - The second value you pass in is the maximum number of post you want to get.
- Default: get_most_viewed(‘both’, 10);
- The first value you pass in is the post type that you want. If you want to get every post types, just use ‘both’. It also supports PHP array: example
- To Display Least Viewed Posts By Tag
<?php if (function_exists('get_least_viewed_tag')): ?> <ul> <?php get_least_viewed_tag(); ?> </ul> <?php endif; ?>- The first value you pass in is the tag id.
- The second value you pass in is the post type that you want. If you want to get every post types, just use ‘both’. It also supports PHP array: example
array('post', 'page'). - The third value you pass in is the maximum number of post you want to get.
- Default: get_least_viewed_tag(1, ‘both’, 10);
- To Display Most Viewed Posts By Tag
<?php if (function_exists('get_most_viewed_tag')): ?> <ul> <?php get_most_viewed_tag(); ?> </ul> <?php endif; ?>- The first value you pass in is the tag id.
- The second value you pass in is the post type that you want. If you want to get every post types, just use ‘both’. It also supports PHP array: example
array('post', 'page'). - The third value you pass in is the maximum number of post you want to get.
- Default: get_most_viewed_tag(1, ‘both’, 10);
- To Display Least Viewed Posts For A Category
<?php if (function_exists('get_least_viewed_category')): ?> <ul> <?php get_least_viewed_category(); ?> </ul> <?php endif; ?>- The first value you pass in is the category id.
- The second value you pass in is the post type that you want. If you want to get every post types, just use ‘both’. It also supports PHP array: example
array('post', 'page'). - The third value you pass in is the maximum number of post you want to get.
- Default: get_least_viewed_category(1, ‘both’, 10);
- To Display Most Viewed Posts For A Category
<?php if (function_exists('get_most_viewed_category')): ?> <ul> <?php get_most_viewed_category(); ?> </ul> <?php endif; ?>- The first value you pass in is the category id.
- The second value you pass in is the post type that you want. If you want to get every post types, just use ‘both’. It also supports PHP array: example
array('post', 'page'). - The third value you pass in is the maximum number of post you want to get.
- Default: get_most_viewed_category(1, ‘both’, 10);
- To Sort Most/Least Viewed Posts
- You can use:
<?php query_posts( array( 'meta_key' => 'views', 'orderby' => 'meta_value_num', 'order' => 'DESC' ) ); ?> - Or pass in the variables to the URL:
https://yoursite.com/?v_sortby=views&v_orderby=desc - You can replace DESC with ASC if you want the least viewed posts.
- You can use:
sandywp / also on the shelf
Try another plugin
4.9 · 200K+ installs
Post Views Counter allows you to collect and display how many times a post, page, or other content has been viewed in a simple,…
4.7 · 20K+ installs
Easily manage downloadable files and monitor downloads of your digital files from your WordPress site.
Counter Number Showcase, Fun Facts – WordPress Animated Counter Plugin
4.6 · 10K+ installs
Counter Number WordPress Plugin brings you all the powerful Stats Counter features to your wordpress website
Spin up a real WordPress site in seconds.
Test plugins, build a demo, hand a client a link — then squash it and start again. No local setup, no Docker.