| 开发者 | sitecheck |
|---|---|
| 更新时间 | 2026年10月12日 22:12 |
| PHP版本: | 8.0 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
wp-content/plugins/site-check-accessibility/.dom extension. Pretty
permalinks should be enabled.No. Fixes are applied at delivery time and are fully reversible. They are served only while the site is connected and the subscription is active; otherwise the original markup is delivered unchanged.
No. Once connected, approved fixes are applied automatically — no theme or template edits are required.
Some hosts strip the Authorization header before it reaches PHP. The plugin
also accepts the pairing token via the X-Sw-Api-Token header, which survives
most such configurations; if pairing still fails, make sure either that header
or Authorization: Bearer is passed through to PHP (typically an .htaccess
rule on Apache + mod_php).
Only the data needed to sync fixes and connection status with the Site-Check web app. See the Privacy section below.
www host
(https://www.site-check.de) while the Grav connector uses the canonical apex
(https://site-check.de). Post-EU-cutover www 301-redirects to the apex, and
the overlay runtime's config fetch (GET /api/overlay/config, CORS
origin-bound) plus the heartbeat POST (Authorization bearer -> preflighted)
do not follow a cross-origin 301 cleanly -> the overlay panel never mounted.
Base URL corrected to the apex, identical to the Grav connector.
label_append server-side render path (WCAG 3.3.2 required indicator).
label_append overrides were persisted but never rendered — the output loop
had no handler. ServerHtmlMutator::applyLabelAppend now resolves the field's
<label> (explicit label[for], then nearest wrapping <label>, then an
unambiguous unassociated sibling <label> in the field's parent) and appends a
visible " *"; inject_label_append_bootstrap runs it server-side first with a
client fallback for post-JS/SPA fields. Idempotent (data-sc-acc-required-marked);
a safe no-op when the field has no label (the paired aria-required write still
lands). The marker span is aria-hidden so it reinforces visually only. New
healthcheck feature: label-append.
missing-required-indicator fix: aria-required="true" +
a visible " *" on the field's label, instead of a "Pflichtfeld" text node after
the input. Re-deployment required for the visible marker to render.label_append was dropped before render — the cache normaliser
(index_override_items_by_id) had no branch for it, so the attribute-required
catch-all silently discarded it. Added the branch; the leading space of " *"
is preserved (was trimmed).clear_stored_api_token() now also unlinks
the signed cache, so the webapp-status reconciler (401 / DISCONNECTED) removes
the fixes instead of leaving them until the 24h grace expired. Combined with
the webapp calling /clear-cache on delete/disconnect, fixes are removed
immediately from both sides.tag_replace runtime now remembers per-item which
items have already been applied (appliedIndex map inside the IIFE). Without
this, the MutationObserver re-ran apply() after the first replacement and
the originally-second <h2> became the new "first match" of a positional
selector like div.bp-container h2:nth-of-type(1) — and got promoted too.
Per-item idempotency makes apply() safe across the entire page lifecycle.tag_replace runtime applies the transformation to the first
eligible match only (previously: all matches). This alone was not enough
— see 2.3.3 for the actual fix.sibling_text_insert carries an optional wrapTag (whitelisted to
h1–h6/p/span/legend) so the runtime can render an <h1> (and not a
<span>) where the fix is meant to add a real heading.tag_replace carries an optional inlineStyle — a compact CSS string the
runtime merges onto the replaced element's style attribute. Prevents
theme styling from breaking when promoting e.g. <h2> to <h1>.cache.json and the
cached state option, so a previously paired site stops shipping fixes
immediately after disconnect. Plugin deactivation stays a no-op.data-sc-acc-fallback="1"). Same
target elements, same result, same reversibility, same subscription binding —
only the mutation site changes (server HTML instead of browser DOM).
masterminds/html5) + a CMS-agnostic
ServerHtmlMutator engine. Adds server-side-apply to the healthcheck feature
list so the webapp can verify fixes statically.JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) on all sinks.JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) to every inline-<script> JSON sink added
since — the client-side alt injector and the Phase-0 bootstraps
sr_only_text_insert / css_rule_inject / element_insert.
attribute_remove — pure
client-side attribute deletion via the selector-overrides bootstrap
(operation: "remove"), verify anchor data-sc-acc-managed-removed.
Includes the optional removeAttributes piggyback field on
alt_text_override / aria_label_set / attribute_override /
text_content_override items (removal applied after the value write).
sr_only_text_insert — visually-hidden screenreader text
(<span class="sc-acc-sr-only" data-sc-acc-sr-only-id="<item-id>">,
text via createTextNode, </> rejected; the class is defined once
via <style data-sc-acc-sr-only-style>).css_rule_inject — fail-closed validated CSS rules collected into a
single <style data-sc-acc-css-inject> tag (no at-rules, no
url()/expression()/javascript:, no {}/<>/;/@/backslash in
values; re-validated on the render path).element_insert — whitelisted HTML (a/span/p/button/div only; no
script/style/iframe, no event handlers, no javascript:/vbscript:/
data:text/html URLs, no &#/: entities, no comments/doctype)
inserted via template + insertAdjacentElement, de-dup via
data-sc-acc-insert-id="<item-id>".unsupported_fix_type: <type> instead of being silently treated as
alt_text_override. Every webapp-sent type has an explicit case; a
missing/empty type still means alt_text_override (legacy alt payloads).<script> bootstrap injectors. All JSON
embedded in an inline script (selector-overrides, sibling-inserts,
document-overrides, tag_replace / element_replace / element_remove, overlay
bootstrap) now also uses JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT, so a fix value / overlay label containing </script>… can no
longer break out of the inline script.apiToken so the
browser-side overlay can authenticate the new POST /api/overlay/heartbeat
call against the webapp. Without the token the runtime simply skips the
heartbeat — overlay itself keeps working.sync-status response now reports the real overlayRuntimeEnabled value
instead of a hard-coded true.