feat(cache): WP Super Cache über den Kompatibilitätskern anbinden

SuperCacheFeature, SuperCacheCompatibility (LockOnFailure, getestet 3.1.5, Version aus dem Plugin-Header) und SuperCacheIntegration ohne Tools. Der SuperCacheListener sammelt Änderungen über lit_mcp_changed und leert einmal am Request-Ende: einen Beitrag per wp_cache_post_edit, mehrere Beiträge oder seitenweite Änderungen per wp_cache_clear_cache (Multisite: eigener Blog). Komplett-Purges höchstens alle 30 s, mit genau einem Nachlauf per WP-Cron. Freigabe-Einträge leeren nichts. Uninstaller räumt Optionen, Transient und Cron-Hook ab; Reiter und lit-site-status zeigen das Profil automatisch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jan-Niclas Loosen
2026-11-06 14:50:35 +01:00
co-authored by Claude Opus 5.5
parent c383b99e7d
commit 05bf890481
16 changed files with 1054 additions and 21 deletions
+26 -5
View File
@@ -13,6 +13,7 @@ use LIT\MCP\Admin\LogTab;
use LIT\MCP\ChangeLog\ChangeLogCleanup;
use LIT\MCP\ChangeLog\ChangeLogInstaller;
use LIT\MCP\Integrations\Divi\Release\ReleaseResolver;
use LIT\MCP\Integrations\SuperCache\SuperCacheListener;
use LIT\MCP\Limits;
use LIT\MCP\Uninstaller;
use LIT\MCP\Updater\RecheckOnInstall;
@@ -44,7 +45,11 @@ final class UninstallerTest extends TestCase
$transients[] = $transient;
return true;
});
Functions\expect('wp_clear_scheduled_hook')->once()->with(ChangeLogCleanup::HOOK);
$hooks = [];
Functions\when('wp_clear_scheduled_hook')->alias(static function (string $hook) use (&$hooks): int {
$hooks[] = $hook;
return 0;
});
// Review m-8: the Protokoll screen option is user meta (network-wide): removed once.
Functions\expect('delete_metadata')->once()->with('user', 0, LogTab::PER_PAGE_OPTION, '', true);
$deleted = [];
@@ -55,12 +60,17 @@ final class UninstallerTest extends TestCase
Uninstaller::run();
self::assertSame([ConnectionStatus::ENDPOINT_TRANSIENT, ReleaseResolver::CACHE], $transients);
self::assertSame(
[ConnectionStatus::ENDPOINT_TRANSIENT, ReleaseResolver::CACHE, SuperCacheListener::PURGED_AT],
$transients
);
self::assertSame([ChangeLogCleanup::HOOK, SuperCacheListener::TRAILING_HOOK], $hooks);
self::assertSame(
[
Access::OPTION, ExposurePolicy::OPTION, Limits::OPTION, ChangeLogInstaller::VERSION_OPTION,
'lit_mcp_divi_releases', 'lit_mcp_divi_check_report', 'lit_mcp_divi_check_lock',
'lit_mcp_pods_releases', 'lit_mcp_pods_check_report', 'lit_mcp_pods_check_lock',
'lit_mcp_wpsc_releases', 'lit_mcp_wpsc_check_report', 'lit_mcp_wpsc_check_lock',
'lit_mcp_snapshots_colors', 'lit_mcp_snapshots_variables', 'lit_mcp_snapshots_presets',
'lit_mcp_snapshots_theme_options', 'lit_mcp_snapshots_custom_css',
DesignLock::option('colors'), DesignLock::option('variables'), DesignLock::option('presets'), DesignLock::option('custom_css'),
@@ -86,7 +96,11 @@ final class UninstallerTest extends TestCase
$transients[] = $transient;
return true;
});
Functions\expect('wp_clear_scheduled_hook')->twice()->with(ChangeLogCleanup::HOOK);
$hooks = [];
Functions\when('wp_clear_scheduled_hook')->alias(static function (string $hook) use (&$hooks): int {
$hooks[] = $hook;
return 0;
});
Functions\expect('delete_metadata')->once()->with('user', 0, LogTab::PER_PAGE_OPTION, '', true);
Functions\when('delete_option')->justReturn(true);
@@ -94,10 +108,17 @@ final class UninstallerTest extends TestCase
self::assertSame(
[
ConnectionStatus::ENDPOINT_TRANSIENT, ReleaseResolver::CACHE,
ConnectionStatus::ENDPOINT_TRANSIENT, ReleaseResolver::CACHE,
ConnectionStatus::ENDPOINT_TRANSIENT, ReleaseResolver::CACHE, SuperCacheListener::PURGED_AT,
ConnectionStatus::ENDPOINT_TRANSIENT, ReleaseResolver::CACHE, SuperCacheListener::PURGED_AT,
],
$transients
);
self::assertSame(
[
ChangeLogCleanup::HOOK, SuperCacheListener::TRAILING_HOOK,
ChangeLogCleanup::HOOK, SuperCacheListener::TRAILING_HOOK,
],
$hooks
);
}
}