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 reais
  • desentup_servico — pia, ralo, vaso, esgoto, caixa_gordura, hidrojateamento
  • desentup_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:

  1. Webhook /wp-json/desentup/v1/webhook/whatsapp recebe messages e statuses
  2. Valida assinatura X-Hub-Signature-256 com APP_SECRET
  3. Se mensagem de cliente novo → wp_insert_post tipo desentup_chamado com canal_origem=whatsapp
  4. Se resposta de técnico → atualiza meta _tecnico_resposta e dispara action desentup_tecnico_respondeu
  5. Template messages para “técnico a caminho” e “serviço finalizado” usam template_name aprovado

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ção
  • desentup_notificar_tecnico — fila de notificações WhatsApp/E-mail com retry exponencial
  • desentup_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:

  1. Blocos Gutenberg + Interactivity API — nativo, usa wp-interactive, wp-scripts. Funciona offline com Service Worker. Ideal se técnico usa tablet da empresa.
  2. 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:

  1. phpunit — testes unitários (regras SLA, priorização, geocodificação mock)
  2. phpstan --level=5 — análise estática
  3. wp-env run tests-cli — integração com WP real
  4. Deploy via wp-cli no 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

0 de 9 concluídos

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.