admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('abc_integrity_scan'), ]); } function abc_integrity_time_ago(int $timestamp): string { $diff = time() - $timestamp; if ($diff < 60) { return 'just now'; } if ($diff < 3600) { $mins = (int) round($diff / 60); return $mins === 1 ? '1 minute ago' : "{$mins} minutes ago"; } if ($diff < 86400) { $hours = (int) round($diff / 3600); return $hours === 1 ? '1 hour ago' : "{$hours} hours ago"; } $days = (int) round($diff / 86400); return $days === 1 ? 'yesterday' : "{$days} days ago"; } function abc_integrity_render_admin_page(): void { if (!current_user_can('manage_options')) { wp_die('Forbidden'); } $manifest = abc_integrity_get_manifest(); $results = abc_integrity_get_scan_results(); $version = (string) get_bloginfo('version'); $locale = get_locale() ?: 'en_US'; $rescanContext = abc_integrity_get_rescan_context($results, $version); $hasResults = is_array($results) && ($results['version'] ?? '') === $version && ($results['locale'] ?? '') === $locale && $manifest !== null && ($results['manifest_fetched_at'] ?? 0) === (int) ($manifest['fetched_at'] ?? -1); $isStale = $hasResults && (time() - (int) ($results['scanned_at'] ?? 0)) > 4 * HOUR_IN_SECONDS; $dateFormat = get_option('date_format') . ' \a\t ' . get_option('time_format'); ?>
Your previous scan results were cleared because WordPress core was reinstalled. Run a new scan to verify WordPress . Your previous scan was for WordPress . Run a new scan to verify the core files for WordPress . Your previous scan results were cleared after WordPress was updated. Run a new scan to verify WordPress .
No scan results yet
Run your first scan to verify that your WordPress core files match the official checksums published by WordPress.org.
The scan downloads the official WordPress checksum manifest from WordPress.org and compares each core file’s MD5 hash. Plugin and theme files are not checked.

Scan results

300 ? ' (' . abc_integrity_time_ago($scannedAt) . ')' : ''; ?>

Scanned

All core files match the official WordPress release
Run a fresh scan to verify your current files.
$count === 1 ? '1 file does not match its expected checksum' : "{$count} files do not match their expected checksums", 'missing' => $count === 1 ? '1 expected file is not present on disk' : "{$count} expected files are not present on disk", 'unreadable' => $count === 1 ? '1 file could not be read' : "{$count} files could not be read", ]; $desc = $failDescs[$type] ?? "{$count} {$type}"; } else { $desc = $passDesc; } $outcome = "{$count} {$type}"; $outcomeClass = $isPass ? 'pass-text' : ($type === 'missing' ? 'warn-text' : 'fail-text'); $rowClass = $isPass ? 'check-row pass' : 'check-row fail open'; ?>
data-abc-toggle="check-row" role="button" tabindex="0" aria-expanded="true">