'; echo '

Site Healthcheck

'; if (!$session) { wph_render_start_panel(); echo ''; return; } if ($session->is_finished()) { wph_render_finished_panel($session); echo ''; return; } wph_render_active_session($session); echo ''; } function wph_render_start_panel(): void { ?>

Start a healthcheck

This will create a new in-progress session for . One session per site at a time.

progress(); $tech = get_userdata($session->technician_id()); ?>

Session: id()); ?> · Started: started_at())); ?> · Technician: display_name : '#' . $session->technician_id()); ?> · / steps

WP wp_version()); ?> · PHP php_version()); ?> · Site site_url()); ?>

all() as $step) { wph_render_step_card($session, $step); } } function wph_render_step_card(WPH_Session $session, WPH_Step $step): void { $state = $session->step_state($step->id()); $status = $state['status']; $notes = $state['notes']; ?>
id()); ?>

title()); ?>

blurb()): ?>

sub_items()): ?> watch_outs()): ?>
Watch out for:
escalation())): ?>

Last saved ago

Healthcheck finished

Started started_at())); ?> · Finished finished_at())); ?>

Report preview

is_finished()) wp_die('No active session.'); if (!WPH_Steps::instance()->get($step_id)) wp_die('Unknown step.'); $status = isset($_POST['status']) ? sanitize_key((string) $_POST['status']) : WPH_Session::STATUS_NOT_STARTED; $notes = isset($_POST['notes']) ? wp_unslash((string) $_POST['notes']) : ''; $session->update_step($step_id, $status, $notes); wp_safe_redirect(admin_url('tools.php?page=site-healthcheck#step-' . rawurlencode($step_id))); exit; } function wph_handle_finish(): void { if (!current_user_can('manage_options')) wp_die('Forbidden'); check_admin_referer('wph_finish'); $session = WPH_Session::current(); if (!$session) wp_die('No active session.'); $session->finish(); wp_safe_redirect(admin_url('tools.php?page=site-healthcheck')); exit; } function wph_handle_discard(): void { if (!current_user_can('manage_options')) wp_die('Forbidden'); check_admin_referer('wph_discard'); WPH_Session::discard(); wp_safe_redirect(admin_url('tools.php?page=site-healthcheck')); exit; } function wph_render_autocheck(WPH_Session $session, WPH_Step $step): void { if (!$step->has_autocheck()) return; $result = $session->get_autocheck($step->id()); ?>

Automated checks

id()); ?>

No automated checks have been run for this step yet.

'✓', 'warn' => '⚠', 'bad' => '✗', 'info' => '·'][$finding['level']] ?? '·'; ?>

Checked ago ()

is_finished()) wp_die('No active session.'); $step = WPH_Steps::instance()->get($step_id); if (!$step) wp_die('Unknown step.'); @set_time_limit(60); $findings = $step->autocheck($session->data()); $session->set_autocheck($step_id, $findings); wp_safe_redirect(admin_url('tools.php?page=site-healthcheck#step-' . rawurlencode($step_id))); exit; } function wph_handle_download_report(): void { if (!current_user_can('manage_options')) wp_die('Forbidden'); check_admin_referer('wph_download_report'); $session = WPH_Session::current(); if (!$session) wp_die('No session.'); $report = wph_build_markdown_report($session); $host = parse_url(get_site_url(), PHP_URL_HOST) ?: 'site'; $host = preg_replace('/[^a-z0-9.-]/i', '', (string) $host); $stamp = date('Ymd', $session->started_at() ?: time()); $filename = 'wph-report-' . $host . '-' . $stamp . '.md'; nocache_headers(); header('Content-Type: text/markdown; charset=UTF-8'); header('Content-Disposition: attachment; filename="' . $filename . '"'); echo $report; exit; }