formulário de sorteio automático em PHP para WordPress

Como criar um formulário de sorteio automático em PHP para seu site WordPress

Continua após a publicidade..

Quer rodar sorteios simples direto no seu WordPress, coletando nome/e-mail e escolhendo um vencedor de forma automática? Abaixo vai um passo a passo rápido com um plugin leve + shortcode para você colar no seu site e começar hoje.

O que você vai construir

  • Um shortcode [sorteio_form] que exibe o formulário (nome + e-mail + consentimento).

  • Grava os participantes em uma tabela própria.

  • Traz um botão de “Sortear agora” (opcional) para admins.

  • Uma tarefa agendada diária que escolhe um vencedor automaticamente e envia e-mail.

Passo 1 — Crie o plugin

No seu editor, crie o arquivo sorteio-automatico.php e envie para wp-content/plugins/sorteio-automatico/. Ative no painel do WP.

<?php
/**
* Plugin Name: Sorteio Automático Simples
* Description: Formulário de sorteio com seleção automática de vencedor via CRON.
* Version: 1.0
* Author: Você
*/
if (!defined(‘ABSPATH’)) exit;

class SorteioAutomaticoSimples {
private $table;

Continua após a publicidade..

public function __construct() {
global $wpdb;
$this->table = $wpdb->prefix . ‘sorteio_participantes’;

register_activation_hook(__FILE__, [$this, ‘install’]);
add_shortcode(‘sorteio_form’, [$this, ‘shortcode_form’]);
add_action(‘init’, [$this, ‘handle_submit’]);
add_action(‘admin_post_sorteio_agora’, [$this, ‘sortear_agora’]); // admin only
add_action(‘sorteio_cron_diario’, [$this, ‘sortear_automaticamente’]);
}

public function install() {
global $wpdb;
$charset = $wpdb->get_charset_collate();
$sql = “CREATE TABLE {$this->table} (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
nome VARCHAR(120) NOT NULL,
email VARCHAR(190) NOT NULL,
ip VARCHAR(45) NULL,
criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
vencedor TINYINT(1) NOT NULL DEFAULT 0,
sorteado_em DATETIME NULL,
PRIMARY KEY (id),
KEY email (email),
KEY vencedor (vencedor)
) $charset;”;
require_once ABSPATH . ‘wp-admin/includes/upgrade.php’;
dbDelta($sql);

if (!wp_next_scheduled(‘sorteio_cron_diario’)) {
// agenda uma vez por dia às 18:00 (horário do WP)
$hora = strtotime(’18:00:00′);
wp_schedule_event($hora, ‘daily’, ‘sorteio_cron_diario’);
}
}

public function shortcode_form() {
ob_start();
if (isset($_GET[‘sorteio_ok’])) {
echo ‘<div class=”notice notice-success” style=”margin:8px 0;padding:10px;border:1px solid #46b450″>Inscrição recebida! Boa sorte 🍀</div>’;
}
?>
<form method=“post” style=“max-width:420px;margin:16px 0;padding:16px;border:1px solid #eee;border-radius:8px”>
<h3 style=“margin-top:0”>Participe do Sorteio</h3>
<p><label>Nome<br>
<input type=“text” name=“sorteio_nome” required style=“width:100%;padding:10px”></label></p>
<p><label>E-mail<br>
<input type=“email” name=“sorteio_email” required style=“width:100%;padding:10px”></label></p>
<p style=“font-size:13px”>
<label><input type=“checkbox” name=“sorteio_consent” required> Autorizo o uso dos meus dados para participar do sorteio e receber comunicações.</label>
</p>
<?php wp_nonce_field(‘sorteio_submit’, ‘sorteio_nonce’); ?>
<input type=“hidden” name=“sorteio_action” value=“enviar”>
<p><button type=“submit” style=“padding:10px 14px;cursor:pointer”>Quero participar</button></p>
</form>
<?php
// Botão “Sortear agora” visível apenas a administradores logados
if (current_user_can(‘manage_options’)) {
$url = admin_url(‘admin-post.php?action=sorteio_agora&_wpnonce=’ . wp_create_nonce(‘sorteio_agora’));
echo ‘<p><a href=”‘.esc_url($url).‘” class=”button button-primary”>🎯 Sortear agora</a></p>’;
}
return ob_get_clean();
}

public function handle_submit() {
if (!isset($_POST[‘sorteio_action’]) || $_POST[‘sorteio_action’] !== ‘enviar’) return;
if (!isset($_POST[‘sorteio_nonce’]) || !wp_verify_nonce($_POST[‘sorteio_nonce’], ‘sorteio_submit’)) return;

global $wpdb;
$nome = sanitize_text_field($_POST[‘sorteio_nome’] ?? );
$email = sanitize_email($_POST[‘sorteio_email’] ?? );
if (!$nome || !is_email($email)) return;

$wpdb->insert($this->table, [
‘nome’ => $nome,
‘email’ => $email,
‘ip’ => sanitize_text_field($_SERVER[‘REMOTE_ADDR’] ?? )
]);
// Redireciona para evitar reenvio do formulário
wp_safe_redirect(add_query_arg(‘sorteio_ok’, ‘1’, wp_get_referer() ?: home_url(‘/’)));
exit;
}

public function sortear_agora() {
if (!current_user_can(‘manage_options’)) wp_die(‘Sem permissão.’);
check_admin_referer(‘sorteio_agora’);
$this->executa_sorteio();
wp_safe_redirect(wp_get_referer() ?: admin_url());
exit;
}

public function sortear_automaticamente() {
$this->executa_sorteio();
}

private function executa_sorteio() {
global $wpdb;
// pega um participante não vencedor, aleatório
$participante = $wpdb->get_row(“SELECT * FROM {$this->table} WHERE vencedor = 0 ORDER BY RAND() LIMIT 1″);
if (!$participante) return;

$wpdb->update($this->table, [
‘vencedor’ => 1,
‘sorteado_em’ => current_time(‘mysql’)
], [‘id’ => $participante->id]);

// Envia e-mails simples (ajuste os textos)
$assunto = ‘🎉 Você ganhou o sorteio!’;
$msg_user = “Olá {$participante->nome},\n\nParabéns! Você foi o(a) vencedor(a) do nosso sorteio.\nEntraremos em contato com os próximos passos.\n\nAbraços!”;
wp_mail($participante->email, $assunto, $msg_user);

$admin_email = get_option(‘admin_email’);
$msg_admin = “Vencedor sorteado:\nNome: {$participante->nome}\nEmail: {$participante->email}\nID: {$participante->id}“;
wp_mail($admin_email, ‘Novo vencedor do Sorteio’, $msg_admin);
}
}
new SorteioAutomaticoSimples();

Passo 2 — Exiba o formulário

Em qualquer página ou post, adicione o shortcode:

[sorteio_form]

Passo 3 — Configure o e-mail e crons

  • Verifique se o seu servidor envia e-mails (ou instale um plugin SMTP).

  • O plugin agenda o sorteio diariamente às 18h (horário do WordPress). Você pode mudar no método install().

Boas práticas de SEO e UX

  • Página dedicada (URL curta e clara, ex.: /sorteio), com resumo do prêmio, regras e data do sorteio.

  • Schema “Giveaway/Contests” (via plugin de SEO) para aumentar a chance de rich results.

  • Prova social: mostre vencedores anteriores (nome/primeira letra do sobrenome).

  • LGPD: mantenha checkbox de consentimento e uma página de política de privacidade.

Perguntas rápidas

Posso evitar inscrições repetidas?
Sim. Adicione uma restrição por e-mail na hora de inserir (ex.: antes de $wpdb->insert, cheque se já existe).

Como mudar a frequência do sorteio?
Troque 'daily' para 'hourly' (hora em hora) ou crie seu próprio intervalo com filtros do WP-Cron.


Pronto! Com esse plugin e o shortcode, você tem um formulário de sorteio automático funcionando no WordPress, com fluxo simples, seguro (nonce/saneamento) e preparado para escalar.

Continua após a publicidade..

Leave A Comment

Your email address will not be published. Required fields are marked *