feat(cache): Verhaltensprobe und Smoke für WP Super Cache
SuperCacheProbe prüft beim Prüfen, ob wp_cache_post_edit die Cache-Datei einer Testseite entfernt; während der Probe ist nur der Einzelseiten-Purge erlaubt, der Pfad kommt aus home und es werden nur feste Dateinamen gelöscht. ProbeStep bündelt die Schrittlogik von Pods und WP Super Cache; ThrowawayPost hält Marker und Titel zentral und räumt auch private Probe-Seiten auf (WP Super Cache wie Pods beim Laden des Reiters). super-cache-smoke.sh prüft gegen das echte Plugin; lib.sh sperrt parallele Smoke-Läufe per flock, wp-config.php wird atomar wiederhergestellt. Doku: Host-Abhängigkeit des Einzel-Purges, WP-Cron für den Nachlauf, Komplett-Purge durch Divi beim Prüfen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
05bf890481
commit
661d3945fd
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace LIT\MCP\Compatibility;
|
||||
|
||||
use Closure;
|
||||
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
/** The one check step a profile's behaviour probe makes (Profile::$extraSteps), shared by Pods and WP Super Cache. */
|
||||
final class ProbeStep
|
||||
{
|
||||
/**
|
||||
* Skipped while the manifest is red (the probe would fail anyway). A probe with nothing to probe (null) is a
|
||||
* green step that says so, not a skipped one: a skipped step makes the report red and would lock the plugin on a
|
||||
* site that simply has nothing to probe yet.
|
||||
*
|
||||
* @param Closure(): (list<string>|null) $probe Problems, [] = green, null = nothing to probe.
|
||||
* @return Closure(bool): list<CheckStep>
|
||||
*/
|
||||
public static function extra(string $key, string $label, string $labelNothingToProbe, Closure $probe): Closure
|
||||
{
|
||||
return static function (bool $manifestClean) use ($key, $label, $labelNothingToProbe, $probe): array {
|
||||
if (! $manifestClean) {
|
||||
return [new CheckStep($key, [], true, $label)];
|
||||
}
|
||||
|
||||
$none = false;
|
||||
$problems = CompatibilityCheck::guarded(static function () use ($probe, &$none): array {
|
||||
$result = $probe();
|
||||
$none = $result === null;
|
||||
|
||||
return $result ?? [];
|
||||
});
|
||||
|
||||
return [new CheckStep($key, $problems, false, $none ? $labelNothingToProbe : $label)];
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,11 @@ defined('ABSPATH') || exit;
|
||||
*/
|
||||
final class ThrowawayPost
|
||||
{
|
||||
/** Meta key and title prefix the Pods and WP Super Cache probes give their entries (the Divi write probe has its own). */
|
||||
public const MARKER = '_lit_mcp_check_entry';
|
||||
|
||||
public const TITLE = '[LIT MCP Prüfung]';
|
||||
|
||||
/** Only entries not modified for this long are orphans – a running check's entry is younger. */
|
||||
private const ORPHAN_AGE_SECONDS = 600;
|
||||
|
||||
@@ -68,14 +73,14 @@ final class ThrowawayPost
|
||||
|
||||
/**
|
||||
* @param array<int, string>|string $postTypes
|
||||
* @return list<int> IDs of entries a dead check left behind, deleted now. Only drafts whose title starts with
|
||||
* the prefix are considered.
|
||||
* @return list<int> IDs of entries a dead check left behind, deleted now. Only drafts and private entries (a
|
||||
* probe may pass through private) whose title starts with the prefix are considered.
|
||||
*/
|
||||
public function removeOrphans(array|string $postTypes): array
|
||||
{
|
||||
$posts = get_posts([
|
||||
'post_type' => $postTypes,
|
||||
'post_status' => 'draft',
|
||||
'post_status' => ['draft', 'private'],
|
||||
// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- a handful of marked entries at most.
|
||||
'meta_key' => $this->marker,
|
||||
// post_modified_gmt, not post_date_gmt: an edit by the check keeps it current. A literal GMT timestamp,
|
||||
|
||||
Reference in New Issue
Block a user