Theme step: identify removal candidates explicitly
Replaces the 'inactive themes count' finding with a clearer breakdown: Keep set (each gets a 'Keep — <why>' row): - The active theme (always) - The parent of the active theme (if a child theme is in use and the parent exists on disk) - The newest Twenty* default installed (as a fallback we can swap to if the active theme breaks during work) Removal candidates (one row per inactive theme not in the keep set): - 'Candidate' rows for the technician to walk down and remove - Summary line warns at >3 candidates - 'none' ok row if every installed theme is a keeper Smoke-tested on testsite with three configurations: - Default theme active, no child: keep active + Twenty Twenty-Five fallback; one removal candidate. - Cluttered (Astra + Hello Elementor + extra Twenty* installed): same keepers, 4 candidates surfaced. - Astra active (custom, no child): keep Astra + Twenty Twenty-Five fallback; 4 candidates including any unused Twenty* and Hello Elementor.
This commit is contained in:
@@ -78,20 +78,82 @@ return new class extends WPH_Step {
|
|||||||
$f[] = $this->finding('active_update', 'ok', 'Active theme update', 'up to date', '');
|
$f[] = $this->finding('active_update', 'ok', 'Active theme update', 'up to date', '');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inactive themes
|
// --- Themes to keep vs. removal candidates ---------------------------
|
||||||
|
// Keep: the active theme, its parent (if a child), and the newest default
|
||||||
|
// Twenty* theme installed (as a fallback we can swap to if the active
|
||||||
|
// theme breaks during work). Everything else is a removal candidate.
|
||||||
$all = wp_get_themes();
|
$all = wp_get_themes();
|
||||||
$inactive = [];
|
|
||||||
foreach ($all as $slug => $t) {
|
$keep_slugs = [$active->get_stylesheet()];
|
||||||
if ($slug === $active->get_stylesheet() || ($is_child && $slug === $parent->get_stylesheet())) continue;
|
$keep_reasons = [$active->get_stylesheet() => 'active theme'];
|
||||||
$inactive[$slug] = (string) $t->get('Name');
|
if ($is_child && $parent && $parent->exists()) {
|
||||||
|
$parent_slug = $parent->get_stylesheet();
|
||||||
|
$keep_slugs[] = $parent_slug;
|
||||||
|
$keep_reasons[$parent_slug] = 'parent of active theme';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find the newest default theme installed (priority by release year).
|
||||||
|
$default_priority = [
|
||||||
|
'twentytwentyfive', 'twentytwentyfour', 'twentytwentythree',
|
||||||
|
'twentytwentytwo', 'twentytwentyone', 'twentytwenty',
|
||||||
|
'twentynineteen', 'twentyseventeen', 'twentysixteen',
|
||||||
|
'twentyfifteen', 'twentyfourteen', 'twentythirteen',
|
||||||
|
'twentytwelve', 'twentyeleven', 'twentyten',
|
||||||
|
];
|
||||||
|
$fallback_slug = null;
|
||||||
|
foreach ($default_priority as $slug) {
|
||||||
|
if (isset($all[$slug])) {
|
||||||
|
$fallback_slug = $slug;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($fallback_slug && !in_array($fallback_slug, $keep_slugs, true)) {
|
||||||
|
$keep_slugs[] = $fallback_slug;
|
||||||
|
$keep_reasons[$fallback_slug] = 'fallback default (newest Twenty* installed)';
|
||||||
|
} elseif ($fallback_slug && in_array($fallback_slug, $keep_slugs, true)) {
|
||||||
|
// Active theme already is the newest Twenty* — note it but no extra entry.
|
||||||
|
$keep_reasons[$fallback_slug] .= ' (also serves as the default fallback)';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Emit keeper rows (ok level).
|
||||||
|
foreach ($keep_slugs as $slug) {
|
||||||
|
if (!isset($all[$slug])) continue; // theme missing on disk
|
||||||
$f[] = $this->finding(
|
$f[] = $this->finding(
|
||||||
'inactive_themes',
|
'keep_' . sanitize_key($slug),
|
||||||
count($inactive) > 3 ? 'warn' : 'info',
|
'ok',
|
||||||
'Inactive themes',
|
'Keep — ' . $keep_reasons[$slug],
|
||||||
(string) count($inactive),
|
(string) $all[$slug]->get('Name') . ' (' . $slug . ')',
|
||||||
$inactive ? implode(', ', array_slice($inactive, 0, 6)) . (count($inactive) > 6 ? ' …' : '') : ''
|
''
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Emit removal candidates (info level).
|
||||||
|
$candidates = [];
|
||||||
|
foreach ($all as $slug => $t) {
|
||||||
|
if (in_array($slug, $keep_slugs, true)) continue;
|
||||||
|
$candidates[$slug] = (string) $t->get('Name');
|
||||||
|
}
|
||||||
|
if (!$candidates) {
|
||||||
|
$f[] = $this->finding('rm_none', 'ok', 'Removal candidates', 'none', 'No inactive themes left to clear out.');
|
||||||
|
} else {
|
||||||
|
// Summary line first, then each candidate.
|
||||||
|
$f[] = $this->finding(
|
||||||
|
'rm_count',
|
||||||
|
count($candidates) > 3 ? 'warn' : 'info',
|
||||||
|
'Removal candidates',
|
||||||
|
count($candidates) . ' theme(s)',
|
||||||
|
'Inactive themes that aren\'t the active theme, its parent, or the fallback default — safe to remove unless flagged by the client.'
|
||||||
|
);
|
||||||
|
foreach ($candidates as $slug => $name) {
|
||||||
|
$f[] = $this->finding(
|
||||||
|
'rm_' . sanitize_key($slug),
|
||||||
|
'info',
|
||||||
|
'Candidate',
|
||||||
|
$name . ' (' . $slug . ')',
|
||||||
|
'Delete via Appearance → Themes if not needed.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $f;
|
return $f;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user