Plugin WordPress para gestão de chamados de desentupimento 24 horas em São Paulo
Desenvolva plugin WordPress para gestão de chamados 24h de desentupimento em SP. Arquitetura, filas, geolocalização e integração WhatsApp.
Você recebe um chamado às 3h da madrugada: pia da cozinha transbordando no Jardim Paulista. O cliente espera resposta imediata, técnico disponível e rastreamento em tempo real. Como transformar esse caos operacional em fluxo automatizado dentro do WordPress?
A resposta não está em adaptar um helpdesk genérico. Desentupimento 24h em São Paulo tem regras próprias: geolocalização por bairros, SLAs por tipo de obstrução, escala de plantonistas rotativa e integração nativa com WhatsApp — canal preferido do cliente paulistano. Um plugin bem arquitetado resolve isso na raiz.
Arquitetura de dados para filas de alta demanda
O coração do plugin é o Custom Post Type desentup_chamado. Diferente de posts comuns, ele carrega metadados críticos: prioridade (emergência, urgente, normal), sla_vencimento (timestamp calculado), bairro_id (taxonomia hierárquica), tecnico_atribuido (user ID), coordenadas (lat/lng JSON) e canal_origem (whatsapp, site, telefone).
Taxonomias registradas:
desentup_bairro— hierárquica, parent para regiões (Zona Sul, Zona Norte) e children para bairros reaisdesentup_servico— pia, ralo, vaso, esgoto, caixa_gordura, hidrojateamentodesentup_status— não hierárquica: novo, triado, a_caminho, em_atendimento, finalizado, cancelado
Índices de banco via dbDelta no register_activation_hook:
CREATE INDEX idx_chamado_fila ON wp_postmeta (meta_key, meta_value) WHERE meta_key IN ('_prioridade', '_status', '_sla_vencimento');
CREATE INDEX idx_chamado_geo ON wp_postmeta (meta_key, meta_value(50)) WHERE meta_key = '_coordenadas';
Essa estrutura permite queries como “chamados emergência na Zona Sul não atribuídos ordenados por SLA” em milissegundos.
Integração WhatsApp Business API nativa
O WhatsApp não é “mais um canal” — é o canal. A integração usa a Cloud API oficial (Meta), não gateways não-oficiais que caem. Fluxo:
- Webhook
/wp-json/desentup/v1/webhook/whatsapprecebemessagesestatuses - Valida assinatura
X-Hub-Signature-256comAPP_SECRET - Se mensagem de cliente novo →
wp_insert_posttipodesentup_chamadocomcanal_origem=whatsapp - Se resposta de técnico → atualiza meta
_tecnico_respostae dispara actiondesentup_tecnico_respondeu - Template messages para “técnico a caminho” e “serviço finalizado” usam
template_nameaprovado
Armazene credenciais em wp_options criptografadas com openssl_encrypt (AES-256-GCM) usando WP_AUTH_KEY como key derivation. Nunca em .env ou constants.
Desentupidora 24 horas São Paulo
Geolocalização e roteirização inteligente
São Paulo tem 96 distritos. O plugin resolve atribuição automática com dois passos:
Geocodificação: ao salvar endereço (CEP + número + complemento), wp_remote_post para Nominatim (OpenStreetMap) ou Google Geocoding API. Cache de 30 dias em transient desentup_geo_{cep}_{numero}. Fallback manual se API falhar.
Busca de técnico próximo: query customizada:
$tecnicos = get_users([
'meta_query' => [
'relation' => 'AND',
[
'key' => '_bairros_atendimento',
'value' => $bairro_id,
'compare' => 'LIKE'
],
[
'key' => '_plantao_ativo',
'value' => '1',
'compare' => '='
]
],
'number' => 5
]);
Para roteirização, integre OSRM (self-hosted gratuito) ou Google Directions. Salve rota_otimizada (JSON polyline) no meta do chamado. O dashboard do técnico consome via endpoint REST /wp-json/desentup/v1/chamado/{id}/rota.
Processamento assíncrono e SLA automatizado
WordPress é síncrono por natureza. Para 24h sem travamentos, use Action Scheduler (bundled no WooCommerce, mas standalone):
desentup_verificar_sla— roda a cada 5 min, busca chamados com_sla_vencimento < now()e_status != finalizado, dispara escalaçãodesentup_notificar_tecnico— fila de notificações WhatsApp/E-mail com retry exponencialdesentup_limpar_cache_dashboard— invalida transients de contadores a cada mudança de status
Exemplo de agendamento recorrente no plugins_loaded:
as_schedule_recurring_action(
time() + 300,
300,
'desentup_verificar_sla',
[],
'desentup_sla_monitor'
);
Dashboard em tempo real usa Server-Sent Events (SSE) via endpoint REST que faz stream_select em tabela de notificações — leve, sem WebSocket server separado.
Extensibilidade via hooks documentados
Um plugin para agências exige pontos de extensão claros. Principais hooks:
| Hook | Tipo | Parâmetros | Uso típico |
|---|---|---|---|
desentup_chamado_antes_criar |
filter | $dados_chamado |
Validar/alterar dados antes do insert |
desentup_chamado_criado |
action | $chamado_id, $dados |
Disparar webhook externo, CRM, ERP |
desentup_sla_calculo |
filter | $segundos, $tipo_servico, $prioridade |
SLA dinâmico por contrato |
desentup_tecnico_elegivel |
filter | $tecnicos_ids, $chamado |
Regra customizada de atribuição |
desentup_notificacao_conteudo |
filter | $mensagem, $template, $dados |
Personalizar templates WhatsApp |
Documente cada hook com @since, @param, @return no PHPDoc. Gere hooks.md automatizado no build.
Multi-tenancy para redes de desentupidoras
Muitas agências atendem múltiplas desentupidoras. Duas abordagens:
Multisite (recomendado): Network activate o plugin. Cada site = uma desentupidora. Tabelas separadas nativas. switch_to_blog() apenas para relatórios consolidados. Capabilities: desentup_gerenciar_chamados, desentup_ver_dashboard, desentup_configurar_sla.
Single site + tenant_id: Coluna tenant_id em todas as metas (via post_meta _tenant_id). REST API namespace /wp-json/desentup/v1/tenant/{id}/. Middleware valida X-Tenant-ID header vs usuário logado. Mais complexo, mas single deploy.
Escolha baseada em: isolamento de dados (LGPD), deploy independente, customização por cliente.
Painel do técnico: React no admin ou headless?
Para experiência mobile-first do técnico na rua, duas arquiteturas:
- Blocos Gutenberg + Interactivity API — nativo, usa
wp-interactive,wp-scripts. Funciona offline com Service Worker. Ideal se técnico usa tablet da empresa. - App React Native / PWA headless — consome REST API + JWT (Application Passwords). Melhor para BYOD (bring your own device). Requer build separado.
Recomendação: comece com Interactivity API no admin. Shortcode [desentup_tecnico_dashboard] renderiza raiz React. Migre para headless quando houver demanda real de app nativo.
Testes, deploy e observabilidade
Pipeline mínimo no GitHub Actions:
phpunit— testes unitários (regras SLA, priorização, geocodificação mock)phpstan --level=5— análise estáticawp-env run tests-cli— integração com WP real- Deploy via
wp-clino staging:wp plugin install --activate zip-url
Observabilidade: log estruturado com Monolog via wp_debug_log customizado. Métricas Prometheus expostas em /wp-json/desentup/v1/metrics (chamados_criados_total, sla_violado_total, tecnicos_online). Grafana dashboard para ops.
Um plugin de desentupimento 24h não é um CRUD bonito. É sistema de missão crítica onde SLA vencido = cliente perdido = prejuízo real. Arquitetura de dados sólida, fila assíncrona confiável, WhatsApp nativo e geolocalização precisa separam o amador do profissional. Comece pelo domínio: modele o fluxo real de um chamado às 3h da madrugada no Jardim Paulista. O código segue naturalmente.
Para aprofundar em filas assíncronas no WordPress, veja como organizar rotinas com troca de óleo em São Paulo ou eliminar recursos bloqueantes de renderização para performance do dashboard. Se atende múltiplas unidades, a gestão de tempo para reparo de direção hidráulica traz paralelos valiosos de multi-tenancy operacional.
Checklist prático
Perguntas frequentes
Como estruturar o banco de dados para filas de atendimento 24h?
Utilize custom post types com taxonomias para status (aberto, em andamento, finalizado) e prioridade. Adicione campos meta para geolocalização, tipo de serviço e SLA. Índices compostos em status + prioridade + data_criacao garantem consultas rápidas nas filas.
Qual a melhor forma de integrar WhatsApp Business API no plugin?
Implemente webhook receiver para mensagens recebidas e use a Cloud API oficial do Meta. Armazene o phone_number_id e access_token em opções criptografadas. Trate eventos de delivery, read e failed com hooks personalizados para atualizar status do chamado.
Como garantir performance com muitos chamados simultâneos?
Implemente cache de objetos com Redis para filas ativas e use transients para contadores de dashboard. Processe notificações via Action Scheduler ou WP-CLI queue. Paginação com keyset pagination evita OFFSET lento em tabelas grandes.
Como lidar com geolocalização e roteirização de técnicos?
Salve coordenadas (lat/lng) no chamado via GeoLocation API do navegador ou endereço geocodificado. Use PostGIS se disponível ou bounding box para buscar técnicos próximos. Integre com OSRM ou Google Directions API para roteirização otimizada.
Quais hooks essenciais para extensibilidade do plugin?
Disponibilize actions: 'desentup_chamado_criado', 'desentup_status_alterado', 'desentup_tecnico_atribuido'. Filters: 'desentup_sla_calculo', 'desentup_notificacao_dados', 'desentup_campos_formulario'. Documente com exemplos no readme para desenvolvedores terceiros.
Como implementar multi-tenancy para múltiplas desentupidoras?
Use network sites (multisite) com plugin network-activated ou tabela compartilhada com coluna tenant_id. Isolamento via capabilities customizadas e REST API namespaced por tenant. Cada desentupidora gerencia seus técnicos, bairros e SLAs independentemente.