Directory / plugin
Init View Count – AI-Powered, Trending, REST API
v2.0.5 · by Init HTML
Count post views accurately via REST API with customizable display. Lightweight, fast, and extensible. Includes shortcode with multiple layouts.
About this plugin
Init View Count is a fast, clean plugin to track post views without clutter. It:
- Uses REST API and JS to count real views
- Prevents duplicate counts with session/local storage
- Stores counts in meta keys like
_init_view_count,_init_view_day_count, etc. - Provides
[init_view_count]and[init_view_list]shortcodes - Includes
[init_view_ranking]shortcode with tabbed ranking by time range - Supports template overrides (like WooCommerce)
- Lightweight. No tracking, no admin bloat.
- Includes REST API to query most viewed posts
- Supports pagination in
[init_view_list]via thepageattribute - Batch view tracking support to reduce REST requests on busy sites
- Optional strict IP-based filtering to block fake view requests posted directly to the REST endpoint
- Includes a Dashboard widget to monitor top viewed posts directly in wp-admin
- Learns site-wide traffic shape (hourly & weekday) via AI-powered smoothing
- Shapes cached and updated efficiently with minimal overhead
- Safe reset action to rebuild patterns automatically
- Fully integrated with Trending Engine v3 for uplift-based scoring
- Native Block Editor (Gutenberg) support with 3 dedicated blocks, no build step required
- Abilities API support (WordPress 6.9+) — read-only abilities for AI agents and automation tools
- Optional “Reduce view count cache refreshes” mode for busy sites running a persistent object cache (Redis, Memcached)
- Optional “Buffer view writes in the object cache” mode for very busy sites: views are collected in Redis/Memcached and written to the database in batches, with zero database writes per view
This plugin is part of the Init Plugin Suite — a collection of minimalist, fast, and developer-focused tools for WordPress.
GitHub repository: https://github.com/brokensmile2103/init-view-count
Highlights
- REST-first design — no jQuery or legacy Ajax
- View tracking powered by time + scroll detection
- Realtime display with optional animated counters
- Fully theme-compatible with overrideable templates
- Developer-friendly with rich filter support
- Optional
[init_view_ranking]shortcode for tabbed view by day/week/month/total - Assets are only loaded when needed – perfect for performance-conscious themes
- Fully compatible with headless and SPA frameworks (REST-first + lazy)
- Supports batch mode: delay view requests and send in groups (configurable in settings)
- Includes optional Dashboard widget for quick admin overview of top viewed posts
- AI-powered Traffic Shape Learner – understands your site’s hourly & weekly rhythm
- Auto-integrated with Trending Engine v3 for seasonality-aware uplift detection
- Smart fallbacks (day week month total) ensure rankings never run empty
- Ultra-light: only 1 write per increment + 1 rollup per day, cache-first design
Shortcodes
[init_view_count]
Shows the view count of the current post, or of any post via the id attribute.
Attributes:
– id: Post ID to display (default: the current post)
– field: total (default), day, week, month – which counter to display
– format: formatted (default), raw, or short – controls number formatting
– time: true to show time diff from post date (e.g. “3 days ago”)
– icon: true to display a small SVG icon before the count
– schema: true to output schema.org microdata (InteractionCounter)
– class: add a custom CSS class to the outer wrapper
[init_view_list]
Show list of most viewed posts.
Attributes:
– number: Number of posts to show (default: 10)
– page: Show a specific page of results (default: 1)
– post_type: Type of post (default: post)
– template: sidebar (default), full, grid, details (can be overridden)
– title: Title above list. Set to empty (title="") to hide
– class: Custom class added to wrapper
– orderby: Sort field (default: meta_value_num)
– order: ASC or DESC (default: DESC)
– range: total, day, week, month, trending
– category: Filter by category slug
– tag: Filter by tag slug
– empty: Message to show if no posts found
[init_view_ranking]
Show tabbed ranking of most viewed posts. Uses REST API and JavaScript for dynamic loading. Optimized for SPA/headless usage.
Attributes:
– tabs: Comma-separated list of ranges. Available: total, day, week, month, yesterday, last_week, last_month (default: total,day,week,month)
– number: Number of posts per tab (default: 5)
– post_type: Comma-separated post type(s) to rank (default: post and page)
– class: Custom class for outer wrapper
This shortcode automatically enqueues required JS and uses skeleton loaders while fetching data.
REST API
This plugin exposes two REST endpoints to interact with view counts: one for recording views and another for retrieving top posts.
POST /wp-json/initvico/v1/count
Record one or more views. Accepts a single post ID or an array of post IDs.
Parameters:
– post_id — (int|array) Required. One or more post IDs to increment view count for.
This endpoint checks if the post is published, belongs to a supported post type, and applies delay/scroll config (via JavaScript). It updates total and optionally day/week/month view counters.
Note: The number of post IDs processed per request is limited based on the batch setting in plugin options.
Optional: if “Require REST nonce verification?” is enabled in plugin settings, this endpoint also requires a valid X-WP-Nonce header (action wp_rest). This is off by default — see the FAQ below before turning it on.
GET /wp-json/initvico/v1/top
Retrieve the most viewed posts, ranked by view count.
Parameters:
– range — (string) total, day, week, month, yesterday, last_week, last_month, trending. Defaults to total.
– post_type — (string) Comma-separated post type(s) to query. Only existing, publicly viewable post types are accepted. Defaults to post and page.
– number — (int) Number of posts to return. Default: 5, maximum 100 (filterable via init_plugin_suite_view_count_api_top_max_number).
– page — (int) Page number. Default: 1.
– fields — (string) minimal (id, title, link) or full (includes excerpt, thumbnail, type, date, etc.)
– tax — (string) Optional. Taxonomy slug (e.g. category).
– terms — (string) Comma-separated term slugs or IDs.
– no_cache — (bool) If 1, disables transient caching.
This endpoint supports filtering and caching, and can be extended to support custom output formats.
Filters for Developers
This plugin provides multiple filters to help developers customize behavior and output in both REST API and shortcode use cases.
init_plugin_suite_view_count_should_count
Allow or prevent counting views for a specific post.
Applies to: REST /count
Params: bool $should_count, int $post_id, WP_REST_Request $request
init_plugin_suite_view_count_meta_key
Change the meta key used to read or write view counts.
Applies to: REST & Shortcodes
Params: string $meta_key, int|null $post_id
init_plugin_suite_view_count_after_counted
Run custom logic after view count has been incremented. Fires once per counted view in every mode. With Buffer view writes in the object cache on, the values in $updated (total, day, week, month) are “stored in the database + still buffered”, so they keep increasing by one per view exactly as before.
Applies to: REST /count
Params: int $post_id, array $updated, WP_REST_Request $request
init_plugin_suite_view_count_increment_keys
Change which counters are incremented for a post on each view, as a field => meta key map (default: total, plus day/week/month when enabled). Remove fields you don’t need for a post type, or add custom field => meta key pairs to have them incremented in the same write. total is always kept. Only total, day, week and month appear in the response and in $updated.
Applies to: REST /count
Params: array $fields, int $post_id, WP_REST_Request $request
init_plugin_suite_view_count_api_top_args
Customize WP_Query arguments used for /top endpoint.
Applies to: REST /top
Params: array $args, WP_REST_Request $request
init_plugin_suite_view_count_api_top_item
Modify each item before it’s returned in the /top response.
Applies to: REST /top
Params: array $item, WP_Post $post, WP_REST_Request $request
init_plugin_suite_view_count_api_top_cache_time
Adjust cache time (in seconds) for /top results.
Applies to: REST /top
Params: int $ttl, WP_REST_Request $request
init_plugin_suite_view_count_api_top_max_number
Maximum number of items /top returns per request (default 100).
Applies to: REST /top
Params: int $max, WP_REST_Request $request
init_plugin_suite_view_count_ip_headers
List of $_SERVER keys checked, in order, to detect the visitor IP for Strict IP check.
Applies to: REST /count (Strict IP check)
Params: array $headers
init_plugin_suite_view_count_meta_flush_interval
Minimum number of seconds between two refreshes of a post’s meta cache after counting views, when Reduce view count cache refreshes is enabled and a persistent object cache is active. Return 0 to refresh after every view.
Applies to: REST /count
Params: int $interval (already clamped to the 10–600 range of the setting)
init_plugin_suite_view_count_buffer_enabled
Turn off Buffer view writes in the object cache for the current request (return false). It cannot force buffering on when the setting is off or no working persistent object cache is available.
Applies to: View counting
Params: bool $enabled
init_plugin_suite_view_count_buffer_backend_status
Status of the object cache for buffering: ok, no_object_cache, unavailable (e.g. Redis is down), non_atomic (e.g. Redis Object Cache with igbinary) or non_persistent (the plugin’s cache group is ignored/non-persistent). Anything other than ok makes views go straight to the database. Useful if your drop-in has its own way of reporting a lost connection.
Applies to: View counting
Params: string $status
init_plugin_suite_view_count_buffer_flush_interval
Seconds between two writes of buffered views to the database.
Applies to: Buffer flush job
Params: int $interval (already clamped to the 30–600 range of the setting)
init_plugin_suite_view_count_buffer_flush_time_limit
Maximum seconds one buffer write may run (default 20, capped at 240). Anything left is written on the next run.
Applies to: Buffer flush job
Params: int $time_limit, string $context
init_plugin_suite_view_count_buffer_flushed (action)
Runs after each write of buffered views to the database.
Applies to: Buffer flush job
Params: array $summary (context, items, views, post_ids, increments as meta_key => [ post_id => views ], requeued, remaining, cleaned, duration)
init_plugin_suite_view_count_top_post_types
Customize the list of post types returned by the /top endpoint.
Applies to: REST /top
Params: array $post_types, WP_REST_Request $request
init_plugin_suite_view_count_query_args
Filter WP_Query args for [init_view_list] shortcode.
Applies to: [init_view_list]
Params: array $args, array $atts
init_plugin_suite_view_count_empty_output
Customize the HTML output when no posts are found.
Applies to: [init_view_list]
Params: string $output, array $atts
init_plugin_suite_view_count_view_list_atts
Modify shortcode attributes before WP_Query is run.
Applies to: [init_view_list]
Params: array $atts
init_plugin_suite_view_count_default_shortcode
Customize the default shortcode used when auto-inserting view count into post content.
Applies to: [init_view_count] auto-insert
Params: string $shortcode
init_plugin_suite_view_count_auto_insert_enabled
Control whether auto-insert is enabled for a given context.
Applies to: [init_view_count] auto-insert
Params: bool $enabled, string $position, string $post_type
init_plugin_suite_view_count_engagement_meta_keys
Change the meta keys used to retrieve like and share counts when calculating engagement quality.
Applies to: Engagement algorithm
Params: array $meta_keys (likes, shares), int $post_id
init_plugin_suite_view_count_trending_post_types
Override the list of post types used by the Trending cron calculation.
Applies to: Cron Trending
Params: array $post_types
init_plugin_suite_view_count_trending_component_weights
Adjust weights for Trending score components.
Applies to: Trending algorithm
Params: array $weights (velocity, engagement, freshness, momentum, uplift, ewma, fatigue, explore, mmr)
init_plugin_suite_view_count_shape_sample_rate
Sample rate N used when Sample Traffic Shape writes is enabled: traffic shape data is recorded from 1 in N view requests, each sample weighted N times. Return 1 to record every request.
Applies to: Traffic Shape Learner
Params: int $rate (already clamped to the 2–100 range of the setting)
Functions for Developers
init_plugin_suite_view_count_increment_meta( $post_id, $meta_keys )
Add one view to several counters of a post. Uses the object cache buffer when Buffer view writes in the object cache is active, otherwise one atomic database UPDATE (exactly like the built-in counter). Use it when your theme or plugin counts views for a related post (e.g. a chapter also counting toward its series), so that it benefits from buffering too. Returns array( 'buffered' => bool, 'pending' => array( meta_key => views still buffered ) ).
init_plugin_suite_view_count_get_pending_views( $post_id, $meta_key = '_init_view_count' )
Views of a post/counter still waiting in the buffer (0 when buffering is off). get_post_meta() + this value gives the live number.
init_plugin_suite_view_count_buffer_flush( $args = array() )
Write all buffered views to the database now. Safe to call at any time; returns a summary array, or false when there is nothing it can do (no persistent object cache, or another write is running).
Template Override
To customize output layout, copy any template file into your theme:
Example: your-theme/init-view-count/view-list-grid.php
License
This plugin is licensed under the GPLv2 or later.
You are free to use, modify, and distribute it under the same license.