Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/lygia-teixeira/agenda-eventos-wp/archive/refs/heads/main.zipPlugin WordPress para cadastrar e divulgar eventos com agenda pública filtrável, painel lateral flutuante de destaques e personalização de cores pelo painel. Inclui tela própria de cadastro, duplicação e repetição de eventos.
Foi criado para atender sites institucionais que precisavam publicar a agenda de eventos sem depender de plugins pesados nem editar o tema. Está em uso em ambiente de produção.
✨ Funcionalidades
Painel lateral (todas as páginas do site)
- Aba fixa "EVENTOS" que abre um painel com até 10 eventos em destaque
- Slider com setas, indicadores (dots), contador e swipe no celular
- Cada card mostra imagem, categoria, resumo, local, datas, botão "Continuar lendo" (modal) e link externo
- Botão "Ver mais" leva à página da agenda (URL configurável)
Agenda completa — shortcode [agenda_eventos]
- Lista todos os eventos publicados, ordenados pela data de início (mais recentes primeiro)
- Filtros no navegador: palavra-chave (ignora acentos), categoria, data inicial e data final (mostra eventos cujo período cruza o intervalo pesquisado)
- Paginação de 10 eventos por página, com contador de resultados e botão "Limpar filtros"
- Status automático: Acontecendo, Evento futuro ou Encerrado, pela data atual do WordPress
- Modal de detalhes, imagem ampliável (lightbox) e link externo / inscrição
- O atributo
quantidadeé aceito pelo shortcode, mas ainda não limita a listagem (ver Roadmap)
Cadastro (admin)
- Tela própria "Adicionar evento" no lugar do editor padrão: título, categoria, imagem (Biblioteca de Mídia), início/encerramento com hora, local, link externo, descrição (editor visual) e destaque
- Categorias padrão criadas automaticamente (Exposição, Shows, Esporte, Cursos, Palestras, Festas, Cultura, Reuniões, Outros); ao escolher "Outros", é possível digitar uma categoria nova, que fica disponível nos próximos cadastros
- Duplicar evento (ação na listagem e botão na tela de edição)
- Repetir evento: semanal, mensal ou anual (até 24 cópias) ou em datas específicas (
DD/MM/AAAA,DD-MM-AAAAouAAAA-MM-DD, até 24), mantendo a duração do evento original. Trata fim de mês e 29/02 em ano não bissexto
Personalização (Agenda de Eventos → Configurações)
- Ligar/desligar a aba lateral
- URL do botão "Ver mais", título da agenda e texto de introdução (aceita HTML básico)
- Cabeçalho da agenda em formato simples ou balão/cartão
- 15 cores em 4 grupos (Agenda, Eventos, Status, Botões), com seletor de cor e campo hexadecimal
- Restaurar configurações padrão sem apagar eventos
🔐 Segurança
O plugin recebe dados do painel e os imprime em todas as páginas do site, então entrada, saída e permissões são tratadas explicitamente:
| Risco | Mitigação no código |
|---|---|
| CSRF no cadastro, metabox, duplicação e reset | wp_nonce_field + wp_verify_nonce / check_admin_referer; duplicação com nonce por evento (ale_duplicate_event_{ID}); configurações via settings_fields |
| Gerenciamento por usuário sem permissão | capability_type => 'ale_evento' + map_meta_cap; capabilities concedidas só ao administrador; current_user_can('edit_post', $id) antes de editar/duplicar; manage_options nas configurações |
| Alterar outro tipo de post pelo formulário de eventos | o ID enviado precisa ser do tipo ale_evento (get_post_type) |
| XSS armazenado em título, local, categoria e descrição | entrada: sanitize_text_field / wp_kses_post; saída: esc_html, esc_attr, wp_kses_post |
Links maliciosos (javascript: etc.) |
esc_url_raw ao salvar, esc_url ao exibir |
| Imagem arbitrária | só ID de anexo (absint) que seja imagem (wp_attachment_is_image) |
| Valores inesperados em opções | whitelist para frequência de repetição e estilo do cabeçalho; sanitize_key; datas validadas por formato estrito |
| Injeção de CSS pelas cores | toda cor passa por sanitize_hex_color antes de ir para wp_add_inline_style |
| Criação em massa de posts | repetição limitada a 24 cópias |
| Open redirect | wp_safe_redirect |
| Reverse tabnabbing | links externos com target="_blank" rel="noopener" |
| DOM XSS no front-end | JS usa textContent, ` |