Linux 软件免费装
Banner图

Who Changed It? – Activity Log & Audit Trail

开发者 cmdgw
更新时间 2026年8月12日 22:21
PHP版本: 7.4 及以上
WordPress版本: 7.0
版权: GPLv2 or later
版权网址: 版权信息

标签

security activity log audit log user activity audit trail

下载

0.5.0 0.7.0 0.8.0 0.9.0

详情介绍:

Who edited that page? Who deleted the post that was there yesterday? Who installed that plugin, switched open registration on, or created a new administrator account at three in the morning? Who Changed It? answers those questions. It records what happens on your WordPress site and shows it as one searchable, filterable list: logins, failed logins and logouts, user and role changes, plugin and theme installs, updates, activations and deletions, core updates, theme and plugin file editor use, post, page and media edits — with the exact fields that changed — and changes to sensitive site settings. Documentation and guides: whochangedit.com Every event is classified Most activity logs hand you a wall of identical rows and leave you to spot the one that matters. This one sorts every event into three levels: Classification is a two-stage process: every event type has a base severity, and contextual heuristics can escalate it — logins at unusual hours, logins from IP addresses never seen for that user, bursts of failed logins from one IP, bursts of deletions by one user. Every escalation is stored with a human-readable reason shown in the log and in alert emails. Tamper-evident by design An activity log is only worth as much as its resistance to being edited. Every record here stores a hash of its own contents plus the hash of the record before it, so changing or removing an entry breaks every link that follows and is reported on the log screen. Legitimate deletions are not silent either: retention purges, manual purges and GDPR erasures record the span they removed, so the chain still verifies across the gap. Anything else is flagged. Redaction rewrites what a record shows while leaving the hash that sealed it intact, so honouring a privacy request never costs you the audit trail. For evidence that holds up against database-level access, move the chain key out of the database by adding define( 'WHOCHITA_CHAIN_KEY', 'a long random string' ); to wp-config.php. The settings screen tells you which mode you are in. Features What gets audited Authentication (logins, failed logins, logouts, password resets), users and roles, plugin and theme installs/updates/activations/deletions, WordPress core updates, WordPress 7.0 AI connector and feature changes, theme/plugin file editor use, posts, pages and media (with field-level diffs of what changed), a watched list of sensitive site options, and data exports. On WooCommerce shops: product price changes, coupon amounts, order status changes, refunds, store settings, and payment gateway configuration. When Yoast SEO, Advanced Custom Fields or Elementor are installed, their own changes are audited too — SEO titles, meta descriptions, focus keyphrases and canonical URLs; noindex and nofollow switches; Yoast's site-wide settings; ACF field group saves and deletions; and Elementor page saves. Each of these lives in post meta, so a generic activity log records "post updated" and reports that nothing changed. What it does not do It does not phone home, does not require an account, and does not send your log to anyone else's servers. On a default install it makes no outbound network requests at all — a regression test over every shipped file enforces that, and asserts that every notification channel ships switched off. The single exception is the one you configure. If you enable Slack, Discord or Telegram notifications, the plugin posts to that service and only that service: Webhook URLs are pinned to those hosts, so a compromised settings screen cannot redirect your log somewhere else. A notification carries the event type, object, user, IP address and time — the same fields the alert email sends, with the IP already masked to whatever privacy setting you chose. Field-level diffs are never sent.

安装:

  1. Upload the plugin to /wp-content/plugins/who-changed-it/, or install it through the Plugins screen.
  2. Activate it through the Plugins screen. The log table is created automatically.
  3. Find the log under the new "Activity Log" menu item.
If your site runs behind a reverse proxy or CDN, map the real client IP header via the whochita_client_ip filter — otherwise all events will appear to come from the proxy's address.

屏幕截图:

  • The same log grouped by day, with a burst of related dangerous events collapsed into a single entry and the reason it was escalated shown in plain language.

常见问题:

How do I find out who edited a page or post in WordPress?

Open the Activity Log screen and search for the page title, or filter the event family to "content". Each edit shows the user, the time, the IP address, and a field-level diff of what actually changed — title, slug, excerpt, author, content length, password protection, parent.

How do I see who deleted a post or a page?

Deletions are recorded like any other event, with the user who did it and the name of the thing that was deleted. Filter by the "content" family, or search the title of the missing item. A burst of deletions by one user is escalated to Dangerous automatically.

How do I see who installed, activated or deleted a plugin?

Filter the log by the "plugins" or "themes" family. Installs, updates, activations, deactivations and deletions are all recorded with the user who performed them. Use of the built-in theme and plugin file editor is classified Dangerous on sight, because that is how a compromised administrator account usually plants code.

How do I see failed login attempts and brute-force attacks?

Failed logins are recorded with the username tried and the originating IP. A burst of failures from one IP is escalated to Dangerous and triggers an email alert — throttled, so an attack sends you one message rather than hundreds.

Will an activity log slow down my site?

It writes one row to its own database table when something happens, and nothing at all on ordinary page views by visitors. There are no external calls to wait on, and retention keeps the table from growing without limit. The reporting and diff work happens on the admin screen, not on the front end.

How is this different from other activity log plugins?

Three things. Every event is classified as Normal, Strange or Dangerous with a stated reason, so you are not scanning thousands of identical rows. The log is hash-chained, so an attacker who cleans up after themselves is detected instead of trusted. And exports are cryptographically signed, so what you hand an auditor or an insurer can be shown not to have been edited afterwards.

Does it log activity from before it was installed?

No. It records events as they happen, starting at activation.

How long are events kept?

3 months by default. Configure the retention window (or keep all data forever) on the settings screen; developers can additionally use the whochita_retention_days filter.

Can I keep some events longer than others?

Yes. Events are grouped into families — authentication, users, content, plugins, themes, core, settings, WooCommerce, and a catch-all — and each family can keep the default window, use its own, or keep everything forever.

Can I change how events are classified?

Yes — override the base severity of any event type with the whochita_base_severity_map filter, and extend the list of audited options with whochita_watched_options.

Does it work with WooCommerce?

Yes. When WooCommerce is active, the plugin automatically also records product price changes (a price drop of more than 50% raises the severity), coupon amount changes, order status changes, refunds, store settings, and payment gateway configuration changes. Gateway secrets and API keys are never stored in the log.

Does the plugin send any data to external services?

Not unless you ask it to. Out of the box everything stays in your own WordPress database and the plugin makes no external calls whatsoever. If you turn on Slack, Discord or Telegram notifications, it sends alert messages to that service and nothing else — see "What it does not do" above for exactly what each message contains.

Can I get activity alerts in Slack?

Yes. Create an Incoming Webhook for the channel you want, paste the URL into the plugin settings, and choose whether you want dangerous events only, dangerous and strange, or everything. Discord webhooks and Telegram bots work the same way. Alerts are throttled per event type, so a brute-force attack sends one message rather than hundreds, and several events in the same request arrive as a single grouped message.

Does it track Yoast SEO, ACF or Elementor changes?

Yes, automatically, as soon as those plugins are active. Yoast: SEO titles, meta descriptions, focus keyphrases, canonical URLs, the noindex and nofollow switches, and the site-wide Yoast settings. ACF: field group saves and deletions. Elementor: page and template saves. Nothing is registered when the plugin in question is not installed.

How do I find out who set a page to noindex?

Filter the log by the "SEO, fields & builders" family, or search the page title. Switching noindex on is classified Strange in its own right, because the page still loads normally afterwards — the damage usually surfaces weeks later as a traffic drop, by which point nobody remembers the edit.

Why does an Elementor edit show up twice?

WordPress records the post update, and Elementor's own save is recorded separately. They are genuinely different facts: Elementor keeps the page content in post meta, so the WordPress-level record honestly shows almost nothing changed. If you only want one, mute either event type on the settings screen.

Can I get a weekly summary instead of an alert per event?

Yes. Switch on the digest and choose weekly or daily. It covers the whole period in one email: totals by severity, every dangerous and strange event with the reason it was flagged, the ten most frequent event types, and confirmation that the audit chain still verifies. It is sent on schedule even when nothing happened, so a digest that stops arriving is itself a signal. The digest and the per-event alerts are independent — run either, both, or neither.

Can I send alerts to WhatsApp?

Not directly. WhatsApp has no webhook, and business-initiated messages need a message template pre-approved by Meta, which does not suit alerts whose content changes every time. Telegram is the closest equivalent and takes about a minute to set up.

How do I know the log has not been edited?

The log screen shows the chain status every time you open it. "Verify now" re-runs the check on demand, walking every record and confirming its position, its link to the previous record, and that its stored fields still match the hash written when it was recorded.

Can I hide the log from administrators?

Yes. Reading the log is governed by the whochita_view_log capability. Switch read access to capability mode and grant it to the roles you choose; administrators then see the log only if you grant it to them. Changing plugin settings still requires the administrator role, so you cannot lock yourself out.

Is it GDPR friendly?

Yes. IP addresses can be stored whole, masked to /24 (IPv4) or /48 (IPv6), stored as a keyed digest, or not stored at all, and everything already recorded can be masked with one button. The plugin answers WordPress's own Export and Erase Personal Data tools; erasure redacts records rather than deleting them, so evidence about other people's actions survives and the chain still verifies.

What does a signed export contain?

The records with their chain hashes, plus a manifest recording the site, the filters and time bounds you exported, the record count, the chain positions covered, and whether the chain verified at that moment. The manifest is covered by an HMAC-SHA256 signature, so neither the records nor the stated bounds can be altered afterwards without invalidating it.

What happens to my existing log when I update?

Records written before this version are sealed into the chain on upgrade, oldest first. That proves they have not changed since the upgrade — it cannot prove anything about what happened before it, and the plugin records that boundary rather than blurring it.

更新日志:

0.9.0 0.8.0 0.7.0 0.6.0 0.5.0 0.4.0 0.3.0 0.2.0 0.1.1 0.1.0