O dashboard registra o último resultado recebido pelo navegador. Ele não executa uma sonda contínua quando o computador/aba está fechado ou suspenso. “Tempo real” significa uma consulta ao clicar ou no intervalo selecionado, com limites impostos pela rede, navegador e hospedagem.
Limite importante: HTML estático não garante monitoramento 100%
Um arquivo HTML aberto em file:// ou hospedado em outro domínio não consegue confirmar com segurança a disponibilidade de qualquer site: CORS pode bloquear a leitura mesmo que o destino esteja online. Senha de Aplicativo no navegador também pode ser vista por extensões, malware ou falha XSS. Para operação 24/7, use um monitor servidor-side (cron/worker) e guarde as credenciais fora do navegador. Não existe forma gratuita que garanta 100% de disponibilidade ou ausência total de falsos alertas.
1. WordPress: configurar usuário e REST API
- Confirme HTTPS válido, WordPress atualizado e REST API acessível em
https://SEU-DOMINIO/wp-json/. Se a instalação estiver em subpasta, inclua-a na URL cadastrada. Em Links Permanentes, salve a configuração atual para regenerar regras.
- No WordPress, acesse Usuários > Adicionar novo e crie um usuário dedicado. Para o endpoint abaixo, use uma conta administradora dedicada; a senha de aplicativo herda todas as permissões dessa conta. Nunca use a senha normal do usuário.
- Abra Usuários > Perfil do usuário dedicado, gere uma Senha de Aplicativo com nome identificável e copie uma vez. Cadastre no app como
usuario:senha-de-aplicativo. O app mantém o segredo somente na sessão atual; ao fechar a aba, informe novamente.
- Crie um plugin pequeno ou use um gerenciador de snippets confiável para registrar
GET /wp-json/iuji-monitor/v1/status. O endpoint precisa exigir autenticação e permissão explícita, chamar wp_update_plugins() e wp_update_themes(), ler get_site_transient('update_plugins') e get_site_transient('update_themes'), e retornar { complete: true, plugins: [...], themes: [...] }. Cada item deve ter name e/ou slug. Não exponha os transients publicamente.
- Teste autenticado o endpoint antes de cadastrar: resposta HTTP 200, JSON válido,
complete: true e arrays de plugins/temas. HTTP 401/403 significa autenticação/permissão; 404 indica endpoint/reescrita ausente. Sem resposta completa, o app não afirma que está atualizado.
Exemplo de resposta exigida pelo app
{"complete":true,"plugins":[{"name":"Plugin exemplo","slug":"plugin-exemplo"}],"themes":[]}
Os dados devem refletir as atualizações oferecidas pelo próprio WordPress. Atualizações de plugins/temas premium podem depender do fornecedor/licença e não aparecer como atualização disponível no WordPress.
Snippet gratuito de referência para registrar a rota WP
Instale como plugin próprio em wp-content/plugins/iuji-monitor/iuji-monitor.php, ou em um gerenciador de snippets com execução global. Troque https://manager.example.com pela origem HTTPS exata do dashboard. O endpoint só aceita usuário com manage_options; isso é leitura do status, mas a senha de aplicativo ainda herda os poderes administrativos da conta.
<?php
/*
Plugin Name: IUJI Monitor Endpoint
Description: Endpoint autenticado de leitura para o IUJI Manager.
*/
add_filter('allowed_http_origins', function ($origins) {
$origins[] = 'https://manager.example.com';
return $origins;
});
add_action('rest_api_init', function () {
register_rest_route('iuji-monitor/v1', '/status', [
'methods' => 'GET',
'permission_callback' => function () {
return current_user_can('manage_options');
},
'callback' => function () {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
wp_update_plugins();
wp_update_themes();
$plugin_updates = get_site_transient('update_plugins');
$theme_updates = get_site_transient('update_themes');
$checked_at = time();
$complete = is_object($plugin_updates)
&& is_object($theme_updates)
&& !empty($plugin_updates->last_checked)
&& !empty($theme_updates->last_checked)
&& is_array($plugin_updates->checked ?? null)
&& is_array($theme_updates->checked ?? null)
&& ($checked_at - (int) $plugin_updates->last_checked) <= 12 * HOUR_IN_SECONDS
&& ($checked_at - (int) $theme_updates->last_checked) <= 12 * HOUR_IN_SECONDS;
foreach (array_keys(get_plugins()) as $plugin_file) {
if (!array_key_exists($plugin_file, $plugin_updates->checked ?? [])) {
$complete = false;
break;
}
}
foreach (wp_get_themes() as $theme) {
if (!array_key_exists($theme->get_stylesheet(), $theme_updates->checked ?? [])) {
$complete = false;
break;
}
}
$plugins = [];
foreach ((array) ($plugin_updates->response ?? []) as $file => $update) {
$plugin = get_plugin_data(WP_PLUGIN_DIR . '/' . $file, false, false);
$plugins[] = [
'slug' => $file,
'name' => $plugin['Name'] ?: $file,
'current' => $plugin['Version'] ?? '',
'new_version' => $update->new_version ?? '',
];
}
$themes = [];
foreach ((array) ($theme_updates->response ?? []) as $stylesheet => $update) {
$theme = wp_get_theme($stylesheet);
$themes[] = [
'slug' => $stylesheet,
'name' => $theme->get('Name') ?: $stylesheet,
'current' => $theme->get('Version'),
'new_version' => $update['new_version'] ?? '',
];
}
return rest_ensure_response([
'complete' => $complete,
'checked_at' => gmdate('c', min((int) ($plugin_updates->last_checked ?? 0), (int) ($theme_updates->last_checked ?? 0))),
'plugins' => $plugins,
'themes' => $themes,
]);
},
]);
});
?>
A checagem de atualização depende também de saída HTTPS do servidor para WordPress.org/fornecedores. O próprio WordPress aplica cache/limites a essas chamadas; “real-time” não significa consulta instantânea ao catálogo em toda requisição.
2. Hospedagem: Hostinger, HostGator, VPS ou local
- Hostinger/HostGator: no hPanel/cPanel, ative SSL gratuito (Let's Encrypt quando disponível), force HTTPS e confirme que o domínio aponta para a hospedagem. O nome dos menus varia por plano. Se REST/API ou OPTIONS retornar 403/406/5xx, peça ao suporte para verificar ModSecurity/WAF, regras de segurança, proxy/CDN e logs, liberando somente a rota e origem necessárias.
- CORS: hospede este dashboard em uma origem HTTPS fixa. Na hospedagem WP, permita essa origem exata para GET, OPTIONS e cabeçalho Authorization; não use
* junto de credenciais. Apache pode configurar isso em VirtualHost/.htaccess se mod_headers estiver habilitado; Nginx precisa de ajuste no servidor. Em hospedagem compartilhada sem acesso, solicite ao suporte ou use um proxy próprio. Não desative o WAF globalmente.
- Acesso local: não abra o arquivo via
file:// para chamadas remotas. Rode um servidor local HTTPS/HTTP confiável e configure a origem CORS de desenvolvimento; não exponha o servidor local à internet. Um navegador/PC desligado não faz checagens agendadas.
- Segredos: não publique senha/token no HTML, JavaScript, Git ou backup. Para uso contínuo, crie um backend/proxy com HTTPS, autenticação, limite de requisições e segredo em variável de ambiente. CORS não substitui autenticação.
3. Sites HTML e monitoramento contínuo
Selecione “HTML / outro” para consultar a URL via HTTP. O servidor precisa liberar CORS para a origem do dashboard. Falha de CORS/rede será exibida como inconclusiva, nunca como confirmação automática de offline. Para sondas 24/7, use um serviço externo de uptime com plano gratuito vigente ou um cron/worker próprio; um serviço externo pode monitorar sem o navegador, mas sua API e limites devem ser configurados separadamente. A integração de terceiros não está conectada automaticamente neste arquivo.
4. Resultado e diagnóstico
- Online: recebeu resposta HTTP do endpoint configurado; isso não prova que todas as páginas estão funcionando.
- Inconclusivo: CORS, timeout, autenticação ou resposta inválida. Corrija a causa; não conte como offline nem como atualizado.
- Atualização pendente: item devolvido pelo endpoint WP e incluído nos filtros selecionados. Faça a atualização no painel WP e verifique novamente.
- Inclusão exclusiva: se preenchida, alerta somente para os plugins/temas informados. A lista de ignorados sempre remove itens do alerta.
- Alertas financeiros: vencido fica vermelho, vencimento hoje laranja; os fundos dos cards destacam a prioridade.