{"id":396549,"date":"2026-11-01T13:05:01","date_gmt":"2026-11-01T13:05:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pageresonance\/"},"modified":"2026-11-01T13:09:58","modified_gmt":"2026-11-01T13:09:58","slug":"pageresonance","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/pageresonance\/","author":20815504,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.1.4","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"PageResonance","header_author":"Alex Hedstr\u00f6m","header_description":"Track and display post page views with bot filtering and 24-hour per-visitor deduplication.","assets_banners_color":"","last_updated":"2026-11-01 13:09:58","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/pageresonance.com","header_author_uri":"https:\/\/alexhedstrom.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":31,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"alexhedstrom","date":"2026-11-01 13:09:58","revision":3778061}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[232,3280,5990,521,23753],"plugin_category":[36],"plugin_contributors":[259029],"plugin_business_model":[],"class_list":["post-396549","plugin","type-plugin","status-publish","hentry","plugin_tags-analytics","plugin_tags-page-views","plugin_tags-post-views","plugin_tags-statistics","plugin_tags-view-counter","plugin_category-analytics","plugin_contributors-alexhedstrom","plugin_committers-alexhedstrom"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/pageresonance.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>PageResonance is a lightweight, privacy-focused page view counter for WordPress. It tracks real human visitors while filtering out bots and preventing duplicate counts from the same visitor within a 24-hour window.<\/p>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>Track views for posts, pages, and custom post types<\/li>\n<li>Track views for category, tag, and custom taxonomy archives<\/li>\n<li>Bot and crawler detection (50+ known bot patterns)<\/li>\n<li>Client-side human verification (requires mouse, scroll, touch, or keyboard interaction)<\/li>\n<li>Rolling 24-hour deduplication per visitor<\/li>\n<li>Privacy-focused: visitor identity is hashed with SHA-256 and raw identifiers are never stored<\/li>\n<li>Admin statistics page sorted by highest views<\/li>\n<li>Sortable \"Views\" column in posts, pages, and taxonomy list tables<\/li>\n<li>Shortcodes for displaying view counts on the frontend<\/li>\n<li>Template function for theme developers<\/li>\n<li>Settings page to choose which post types and taxonomies to track<\/li>\n<li>Clean uninstall removes all plugin data<\/li>\n<\/ul>\n\n<h3>Usage<\/h3>\n\n<h4>Shortcodes<\/h4>\n\n<p><strong>Post\/Page Views:<\/strong><\/p>\n\n<ul>\n<li><code>[pageresonance_page_views]<\/code> \u2014 Displays the view count for the current post.<\/li>\n<li><code>[pageresonance_page_views label=\"Views:\"]<\/code> \u2014 Adds a text label before the count.<\/li>\n<li><code>[pageresonance_page_views icon=\"1\"]<\/code> \u2014 Adds an eye icon before the count.<\/li>\n<li><code>[pageresonance_page_views id=\"123\"]<\/code> \u2014 Displays the view count for a specific post by ID.<\/li>\n<\/ul>\n\n<p><strong>Total Site Views:<\/strong><\/p>\n\n<ul>\n<li><code>[pageresonance_total_views]<\/code> \u2014 Displays the total view count across all posts.<\/li>\n<li><code>[pageresonance_total_views label=\"Total Views:\"]<\/code> \u2014 With a label prefix.<\/li>\n<li><code>[pageresonance_total_views icon=\"1\"]<\/code> \u2014 With an eye icon.<\/li>\n<\/ul>\n\n<p><strong>Taxonomy Archive Views:<\/strong><\/p>\n\n<ul>\n<li><code>[pageresonance_term_views]<\/code> \u2014 Displays the view count for the current category\/tag archive.<\/li>\n<li><code>[pageresonance_term_views id=\"5\"]<\/code> \u2014 Displays the view count for a specific term by ID.<\/li>\n<li><code>[pageresonance_term_views label=\"Views:\" icon=\"1\"]<\/code> \u2014 With label and icon.<\/li>\n<\/ul>\n\n<h4>Template Function<\/h4>\n\n<pre><code>&lt;?php echo pageresonance_get_views(); ?&gt; \u2014 Returns the view count for the current post.\n\n&lt;?php echo pageresonance_get_views( 123 ); ?&gt; \u2014 Returns the view count for a specific post.\n\n&lt;?php echo pageresonance_get_term_views(); ?&gt; \u2014 Returns the view count for the current category or tag archive.\n\n&lt;?php echo pageresonance_get_term_views( 5 ); ?&gt; \u2014 Returns the view count for a specific term.&lt;h3&gt;Privacy&lt;\/h3&gt;\n<\/code><\/pre>\n\n<p>PageResonance stores view counts on your site. It does not send visitor data to an external server.<\/p>\n\n<p>To avoid counting the same visitor twice within 24 hours, the plugin temporarily stores a one-way SHA-256 hash derived from the visitor IP address, browser user agent, and a site-specific WordPress salt. Raw IP addresses and user agents are not stored. A daily cleanup removes expired hashes, normally within 48 hours.<\/p>\n\n<p>The same description is suggested in WordPress under Settings \u2192 Privacy.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>pageresonance<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Go to <strong>PageResonance &gt; Settings<\/strong> to select which post types and taxonomies to track.<\/li>\n<li>Use the shortcodes or template function to display view counts on the frontend.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20does%20bot%20filtering%20work%3F\"><h3>How does bot filtering work?<\/h3><\/dt>\n<dd><p>The plugin uses two layers of protection:<\/p>\n\n<ol>\n<li><strong>Client-side:<\/strong> The tracking script only fires after a genuine user interaction (mouse movement, scroll, touch, click, or keypress). Bots that don't execute JavaScript or trigger DOM events are never counted.<\/li>\n<li><strong>Server-side:<\/strong> The user-agent string is checked against 50+ known bot and crawler patterns. Requests with empty user-agents are also rejected.<\/li>\n<\/ol><\/dd>\n<dt id=\"how%20does%20the%2024-hour%20deduplication%20work%3F\"><h3>How does the 24-hour deduplication work?<\/h3><\/dt>\n<dd><p>Each visitor is identified by a SHA-256 hash of their IP address, user-agent, and a WordPress salt. This hash is stored in a log table with a timestamp. If the same hash visits the same post or term again within 24 hours, the view is not counted. A daily cron job removes expired entries, so an expired hash is normally deleted within 48 hours.<\/p><\/dd>\n<dt id=\"is%20visitor%20data%20stored%20securely%3F\"><h3>Is visitor data stored securely?<\/h3><\/dt>\n<dd><p>The plugin does not store raw IP addresses or user-agent strings. It temporarily stores a one-way SHA-256 hash derived from them for deduplication. Expired hashes are normally deleted within 48 hours.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20work%20with%20caching%20plugins%3F\"><h3>Does this plugin work with caching plugins?<\/h3><\/dt>\n<dd><p>Yes. Tracking uses the WordPress REST API after a user interaction, so it works with page caching plugins.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20uninstall%20the%20plugin%3F\"><h3>What happens when I uninstall the plugin?<\/h3><\/dt>\n<dd><p>All plugin data is removed: custom database tables, post meta, term meta, and plugin options.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Restyle the How to Use shortcode list so each example is a row instead of a table inside a card.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Limit public tracking by IP address, with a daily cap on new visitor identities.<\/li>\n<li>Trust forwarded IP headers only when the direct connection comes from a listed proxy.<\/li>\n<li>Skip password-protected posts until the visitor unlocks them.<\/li>\n<li>Prefix spreadsheet formula characters in CSV export, including after leading whitespace.<\/li>\n<li>Count views from logged-in visitors.<\/li>\n<li>Show taxonomy totals for the 7-day and 30-day statistics ranges.<\/li>\n<li>Match the admin screens to the shared card layout.<\/li>\n<li>Point the About tab to pageresonance.com.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release of PageResonance.<\/li>\n<li>Post, page, and custom post type view tracking.<\/li>\n<li>Taxonomy archive view tracking.<\/li>\n<li>Bot filtering and 24-hour visitor deduplication.<\/li>\n<li>Admin statistics page.<\/li>\n<li>Shortcodes and template function.<\/li>\n<li>Settings page for selecting tracked post types and taxonomies.<\/li>\n<\/ul>","raw_excerpt":"Track and display page views for posts, pages, custom post types, and taxonomy archives with bot filtering and 24-hour per-visitor deduplication.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/396549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=396549"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/alexhedstrom"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=396549"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=396549"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=396549"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=396549"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=396549"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=396549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}