Linux 软件免费装

AnGo Scroll Analytics

开发者 andrewgolubev
更新时间 2026年11月5日 04:12
PHP版本: 7.4 及以上
WordPress版本: 7.1
版权: GPLv2 or later
版权网址: 版权信息

标签

statistics analytics engagement readability scroll depth

下载

1.17.0 1.17.1 1.2.1 1.3.0 1.4.0 1.15.0 1.5.0 1.2.0 1.6.0 1.10.0 1.13.0 1.7.0 1.8.1 1.11.0 1.12.0 1.9.0 1.14.0 1.16.0 1.8.0

详情介绍:

AnGo Scroll Analytics records how far visitors scroll through your content and displays the results on a dedicated "Readability" screen in wp-admin. It answers the question a pageview count cannot: did anyone actually read past the first screen? Unlike heavy external analytics suites or heatmap SaaS tools, AnGo Scroll Analytics runs 100% natively on your server. There are no external scripts, no cookies, no third-party data sharing, and no complex event setups. Why site owners and developers choose AnGo What the Readability dashboard shows How it works under the hood The tracking script loads on the single page of every public post type and measures depth through the scrollable height of the document — not the share of the article visible on screen, so a page that fits on one screen records 100%.
  1. Initial arrival: a visit is registered as soon as the page loads. A visitor who reads the top screen without scrolling still gets a row, with 0%.
  2. Efficient beacons: data is sent to the server only when reading progress actually advances (checked every 5 seconds), and when the visitor leaves the page or switches tabs (via navigator.sendBeacon, or fetch with keepalive). A failed send is retried at the next check. Each beacon also carries a coarse device class — mobile, tablet or desktop, computed in the visitor's browser; no user-agent string is collected.
  3. One row per visit: each visit occupies a single row in {prefix}_ango_visits, updated as the reader gets further down the page. A new tab or a new session is a new visit.
Performance & scale Designed for small-to-medium blogs and content sites: the statistics are computed on the fly with direct SQL queries, and the REST endpoint is rate-limited to 60 requests per minute per IP hash (changeable via the ango_rate_limit filter). Without a persistent object cache each beacon costs two lightweight options-table queries — a spam brake, not a firewall. At hundreds of thousands of visits, transient caching or cron-based aggregation is worth adding; a typical blog does not need it.

安装:

  1. In wp-admin go to Plugins → Add New → Upload Plugin.
  2. Choose the downloaded archive (ango-scroll-analytics-1.17.1.zip), click "Install Now", then "Activate".
  3. On activation the plugin creates its table in the database, {prefix}_ango_visits (wp_ango_visits with the default prefix). If the schema changes in a later version, the table is brought up to date the next time wp-admin is opened (dbDelta).
  4. A "Readability" entry appears in the left-hand menu — the dashboard lives there.

常见问题:

Do visits with no scrolling really count?

Yes. Every arrival is a row, including the ones with 0% scroll: the percentiles describe all arrivals, not only those who read to the end. That is a deliberate decision, not lost data. The dashboard does distinguish two kinds of zero-scroll visits. A visit that sent nothing after the initial page-load beacon (max_scroll 0 and time on page 0) is "load-and-die" — on a live site those are usually bots, crawlers and link previews, not people. They are excluded from the statistics by default (the Visits card shows how many were left out), while a person who loaded the page and stayed without scrolling — time on page above zero — always counts. The checkbox in the filter bar turns the exclusion off.

Is the tracking endpoint public?

Yes — it has to be, because visitors are not logged in. POST /wp-json/ango/v1/depth is limited to 60 requests per minute per IP; the limit is changed through the ango_rate_limit filter, and a value below 1 disables the check. The IP itself is not stored, only a hash of it, for the duration of the window. Behind a proxy (Cloudflare and similar) REMOTE_ADDR is the proxy address, so the limit is shared by all visitors — raise it in that setup.

Why do the numbers differ from my analytics tool?

This plugin measures depth through the scrollable height of the page, not the share of the article that was on screen: a short page that fits on one screen records 100%. And it counts visits, not unique readers — a new tab or a new session is a new visit.

What timezone are the numbers in?

Timestamps in the table (created_at) are stored in UTC, while the dashboard computes day boundaries in the site timezone. Keep that in mind when writing manual SQL against {prefix}_ango_visits.

Can I track custom post types?

They are tracked by default: the script loads on the single page of every public post type, so a WooCommerce product, a forum thread or a knowledge-base entry all get measured the moment they exist. Media attachments are the one exception — they are public but are media-library artifacts, not pages a reader scrolls. If a plugin registers a public type you do not want counted (a page-builder's template library, a popup type), remove it with the ango_trackable_post_types filter: add_filter( 'ango_trackable_post_types', function ( $types ) { unset( $types['my_popup'] ); return $types; } );

Does the admin screen load anything from outside my site?

No. The chart is drawn by Chart.js 4.5.1, bundled with the plugin (assets/vendor/chart.umd.min.js, MIT license), so wp-admin makes no external request and the chart works offline and behind a filtering proxy.

Why does the bundled Chart.js ship minified?

Chart.js 4.5.1 (MIT) ships here as the minified UMD build that upstream publishes — assets/vendor/chart.umd.min.js, licence banner intact. Upstream has no unminified UMD to use instead: dist/chart.umd.js and dist/chart.umd.min.js in its package are both minified. The readable code is published, just in another build: the unminified ESM bundle is dist/chart.js (https://unpkg.com/chart.js@4.5.1/dist/chart.js), and the sources it is built from are at https://github.com/chartjs/Chart.js/tree/v4.5.1/src.

Why are the file names so plain?

They are deliberately neutral: the tracking script is assets/js/scroll-depth.js and the public endpoint is /wp-json/ango/v1/depth, with no tracker/track in either. Those words are a common target for filter lists, and a blocked script or beacon loses data silently. Neither EasyList/EasyPrivacy nor the uBlock Origin and AdGuard filters matched these URLs (checked 2026-09-16 under the plugin's previous name; the endpoint paths did not change in the rename), but the lists update daily — so do not rename them back "for clarity".

What happens to my data when I uninstall the plugin?

Deleting the plugin removes everything it stored: the {prefix}_ango_visits table, the ango_db_version option and the throttle transients. Deactivating does not — the data survives a deactivate and reactivate cycle, so an upgrade or a temporary switch-off costs nothing. Clicking Delete on the Plugins screen shows a confirmation naming the statistics that will be lost. If you need the numbers after the plugin is gone, export them before deleting, or hold the cleanup back from a must-use plugin with add_filter( 'ango_remove_data_on_uninstall', '__return_false' ).

更新日志:

1.17.1 1.17.0 1.16.0 1.15.0 1.14.0 1.13.0 1.12.0 1.11.0 1.10.0 1.9.0 1.8.1 1.8.0 1.7.0 1.6.0 1.5.0 1.4.0 1.3.0 1.2.1 1.2.0 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0