StatInform is a self-hosted analytics plugin for WordPress that keeps all data on your own server. It does not use cookies, does not send data to third parties (Google, Yandex, or anyone else), and has a minimal impact on your site’s performance.
Key features
sessionStorage, which is cleared when the browser tab closes. No long-lived identifiers, no cross-visit tracking.wp-load.php, does not touch the database, and simply appends a line to a buffer file.mailto:, and tel: links.Accept-Language headers.StatInform’s collection endpoint intentionally runs outside of WordPress core. This means:
wp-load.php. The endpoint is a standalone PHP script. It does not load WordPress, does not connect to the database, and does not fire any hooks.wp-content/uploads/eistat/. It is copied there on activation from a template file inside the plugin folder. WordPress.org guidelines require plugins to store user data in uploads/, not in the plugin directory..jsonl buffer files. Aggregation into the database happens separately via WP-Cron or the manual “Update now” button..htaccess files in the buffer and archives folders block direct HTTP access. On Nginx, these files are ignored and equivalent server-level rules should be configured.A few static-analysis warnings appear when running Plugin Check (PCP) on this plugin. They are false positives:
InterpolatedNotPrepared on SQL queries. All queries use $wpdb->prepare() for values. Table names are built as $wpdb->prefix . 'eistat_' and cannot be parameterized through prepare(). The table prefix is a controlled value that never comes from user input.
NonceVerification.Recommended on GET parameters. The admin views read filter parameters (days, view, date, source, link_type, paged) directly from $_GET. These are read-only filters that do not change state, so a nonce is not required. All values are sanitized with sanitize_text_field(), sanitize_key(), or absint().
DirectDatabaseQuery and NoCaching. The plugin uses custom tables with the prefix wp_eistat_. These tables are not part of the WordPress object cache, so caching them would provide no benefit.
The plugin does not write any PHP code to user files. The buffer path is stored as plain JSON in uploads/eistat/buffer-path.json and read with file_get_contents() + json_decode().