$data) { $outdated[] = [ 'type' => 'plugin', 'name' => $data->Name ?? $file, 'current' => $data->Version ?? '', 'available' => $data->update->new_version ?? '', ]; } $themeUpdates = function_exists('get_theme_updates') ? get_theme_updates() : []; foreach ($themeUpdates as $slug => $data) { $new = is_array($data->update ?? null) ? ($data->update['new_version'] ?? '') : ''; $outdated[] = [ 'type' => 'theme', 'name' => $data->get('Name') ?: $slug, 'current' => (string) $data->get('Version'), 'available' => $new, ]; } $coreOutdated = false; if (function_exists('get_preferred_from_update_core')) { $core = get_preferred_from_update_core(); if (is_object($core) && ($core->response ?? '') === 'upgrade') { $coreOutdated = true; $outdated[] = [ 'type' => 'core', 'name' => 'WordPress', 'current' => get_bloginfo('version'), 'available' => $core->current ?? '', ]; } } $count = count($outdated); // Core being outdated is the worst case; weight it heavily. $penalty = ($coreOutdated ? 4 : 0) + ($count - ($coreOutdated ? 1 : 0)); $score = max(0, self::MAX_SCORE - $penalty); $status = $count === 0 ? 'pass' : ($coreOutdated || $count > 3 ? 'fail' : 'warn'); return new CheckResult( 'obsolete_versions', $status, $score, self::MAX_SCORE, $coreOutdated || $count > 5 ? 'high' : 'medium', ['outdated' => array_slice($outdated, 0, 100), 'count' => $count, 'core_outdated' => $coreOutdated], $count === 0 ? 'Cœur, extensions et thèmes à jour' : sprintf('%d élément(s) obsolète(s)%s', $count, $coreOutdated ? ' (dont le cœur WordPress)' : '') ); } catch (\Throwable $e) { return new CheckResult( 'obsolete_versions', 'skip', 0, self::MAX_SCORE, 'info', ['error' => $e->getMessage()], 'Vérification ignorée (exception interne) : ' . $e->getMessage() ); } } }