Módulo 6: Interação com o Banco de Dados no WordPress

No Módulo 6 do nosso curso de desenvolvimento de plugins para WordPress, vamos aprender a interagir com o banco de dados utilizando as funções nativas do WordPress. Isso inclui a criação de tabelas personalizadas, inserção, atualização e recuperação de dados, bem como a implementação de boas práticas de segurança.

Usando as Funções do WordPress para Trabalhar com o Banco de Dados

O WordPress fornece uma API própria para interagir com o banco de dados chamada wpdb. Essa classe permite executar consultas SQL com segurança, prevenindo ataques como SQL Injection.

Exemplo de como recuperar dados de uma tabela do WordPress:

// Acessando o banco de dados do WordPress
global $wpdb;

// Obtendo todos os usuários
$usuarios = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}users");
foreach ($usuarios as $usuario) {
    echo "Nome: " . esc_html($usuario->display_name) . "<br>";
}

Criando Tabelas Personalizadas ao Ativar o Plugin

Podemos criar tabelas personalizadas ao ativar nosso plugin utilizando a função register_activation_hook.

function meu_plugin_criar_tabela() {
    global $wpdb;
    $tabela_nome = $wpdb->prefix . 'meu_plugin_dados';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $tabela_nome (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        nome varchar(255) NOT NULL,
        email varchar(255) NOT NULL,
        PRIMARY KEY (id)
    ) $charset_collate;";

    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'meu_plugin_criar_tabela');

Inserindo, Atualizando e Recuperando Dados

Podemos inserir, atualizar e recuperar dados de tabelas personalizadas utilizando wpdb.

Inserindo dados:

function meu_plugin_inserir_dados($nome, $email) {
    global $wpdb;
    $wpdb->insert(
        $wpdb->prefix . 'meu_plugin_dados',
        array(
            'nome' => sanitize_text_field($nome),
            'email' => sanitize_email($email)
        ),
        array('%s', '%s')
    );
}

Atualizando dados:

function meu_plugin_atualizar_dados($id, $nome, $email) {
    global $wpdb;
    $wpdb->update(
        $wpdb->prefix . 'meu_plugin_dados',
        array(
            'nome' => sanitize_text_field($nome),
            'email' => sanitize_email($email)
        ),
        array('id' => intval($id)),
        array('%s', '%s'),
        array('%d')
    );
}

Recuperando dados:

function meu_plugin_obter_dados() {
    global $wpdb;
    return $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "meu_plugin_dados");
}

Evitando Falhas de Segurança

Para evitar ataques, devemos sempre sanitizar e validar os dados recebidos. O WordPress fornece diversas funções para isso, como:

  • sanitize_text_field() – Remove caracteres perigosos de textos.
  • sanitize_email() – Valida e sanitiza e-mails.
  • esc_html() – Exibe textos seguros na tela.

Exemplo de sanitização ao processar um formulário:

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['meu_plugin_enviar'])) {
    $nome = sanitize_text_field($_POST['nome']);
    $email = sanitize_email($_POST['email']);
    meu_plugin_inserir_dados($nome, $email);
    echo "<p>Dados salvos com sucesso!</p>";
}

Conclusão

Com este módulo, aprendemos como interagir com o banco de dados do WordPress de forma segura, criar tabelas personalizadas, inserir, atualizar e recuperar dados. A aplicação correta dessas técnicas é essencial para desenvolver plugins robustos e eficientes.

No próximo módulo, exploraremos ainda mais funcionalidades avançadas para tornar nosso plugin ainda mais completo!

Veja o código completo até aqui:

<?php
/*
Plugin Name: Meu Primeiro Plugin
Description: Um simples plugin para aprender a criar plugins no WordPress.
Version: 1.0
Author: Seu Nome
*/

if ( !defined( 'ABSPATH' ) ) {
    exit; // Proteção contra acesso direto
}

// Função para exibir mensagem no rodapé
function meu_plugin_mensagem_rodape() {
    echo '<p style="text-align: center;">Obrigado por visitar nosso site! - Meu Primeiro Plugin</p>';
}

add_action( 'wp_footer', 'meu_plugin_mensagem_rodape' );

// Função para personalizar o título dos posts
function meu_plugin_personalizar_titulo( $titulo ) {
    // Adiciona o prefixo "[Especial]" ao título
    return '[Especial] ' . $titulo;
}
add_filter( 'the_title', 'meu_plugin_personalizar_titulo' );


// Função criando um shortcode
function meu_plugin_galeria_shortcode() {
    $html = '<div style="display: flex; gap: 10px;">';
    $html .= '<img src="https://aquinosresolvemos.com/wp-content/uploads/elementor/thumbs/NOVA-LOGO-RESOLVE-plwarhumrc67vvde2targiz5ew8d57mub701ju58xi.png" alt="Imagem 1">';
    $html .= '<img src="https://aquinosresolvemos.com/wp-content/uploads/elementor/thumbs/NOVA-LOGO-RESOLVE-plwarhumrc67vvde2targiz5ew8d57mub701ju58xi.png" alt="Imagem 2">';
    $html .= '<img src="https://aquinosresolvemos.com/wp-content/uploads/elementor/thumbs/NOVA-LOGO-RESOLVE-plwarhumrc67vvde2targiz5ew8d57mub701ju58xi.png" alt="Imagem 3">';
    $html .= '</div>';
    return $html;
}
add_shortcode( 'galeria_personalizada', 'meu_plugin_galeria_shortcode' );


function meu_plugin_formulario_shortcode() {
    $html = '<form method="post" action="#">';
    $html .= '<label for="nome">Nome:</label>';
    $html .= '<input type="text" id="nome" name="nome" required>';
    $html .= '<button type="submit">Enviar</button>';
    $html .= '</form>';
    return $html;
}
add_shortcode( 'formulario_simples', 'meu_plugin_formulario_shortcode' );

function meu_plugin_adicionar_pagina_configuracao() {
    add_menu_page(
        'Configurações do Meu Plugin', // Título da página
        'Meu Plugin', // Nome no menu
        'manage_options', // Permissão necessária
        'meu-plugin-configuracoes', // Slug da página
        'meu_plugin_pagina_configuracao_callback', // Função de callback
        'dashicons-admin-generic', // Ícone do menu
        20 // Posição no menu
    );
}
add_action( 'admin_menu', 'meu_plugin_adicionar_pagina_configuracao' );

function meu_plugin_pagina_configuracao_callback() {
    echo '<h1>Configurações do Meu Plugin</h1>';
    echo '<form method="post" action="options.php">';
    settings_fields( 'meu_plugin_opcoes' );
    do_settings_sections( 'meu-plugin-configuracoes' );
    submit_button();
    echo '</form>';
}

function meu_plugin_registrar_configuracoes() {
    register_setting( 'meu_plugin_opcoes', 'meu_plugin_opcao_texto' );

    add_settings_section(
        'meu_plugin_secao_principal',
        'Configurações Gerais',
        null,
        'meu-plugin-configuracoes'
    );

    add_settings_field(
        'meu_plugin_campo_texto',
        'Texto de Exemplo',
        'meu_plugin_campo_texto_callback',
        'meu-plugin-configuracoes',
        'meu_plugin_secao_principal'
    );
}
add_action( 'admin_init', 'meu_plugin_registrar_configuracoes' );

function meu_plugin_campo_texto_callback() {
    $valor = get_option( 'meu_plugin_opcao_texto', '' );
    echo '<input type="text" name="meu_plugin_opcao_texto" value="' . esc_attr( $valor ) . '" />';
}

function meu_plugin_adicionar_submenu() {
    add_submenu_page(
        'meu-plugin-configuracoes', // Slug do menu pai
        'Submenu do Meu Plugin', // Título da página
        'Submenu', // Nome no submenu
        'manage_options', // Permissão necessáriaa
        'meu-plugin-submenu', // Slug do submenu
        'meu_plugin_submenu_callback' // Função de callback
    );
}
add_action( 'admin_menu', 'meu_plugin_adicionar_submenu' );

function meu_plugin_submenu_callback() {
    echo '<h1>Submenu do Meu Plugin</h1>';
    echo '<p>Este é o conteúdo do submenu.</p>';
}

// Criando um submenu para o formulário da tabela
function meu_plugin_adicionar_submenu_tabela() {
    add_submenu_page(
        'meu-plugin-configuracoes',
        'Gerenciar Dados',
        'Gerenciar Dados',
        'manage_options',
        'meu-plugin-gerenciar-dados',
        'meu_plugin_formulario_dados_callback'
    );
}
add_action( 'admin_menu', 'meu_plugin_adicionar_submenu_tabela' );

// Callback do formulário
function meu_plugin_formulario_dados_callback() {
    echo '<h1>Gerenciar Dados</h1>';
    echo '<form method="post" action="">';
    echo '<label for="nome">Nome:</label>';
    echo '<input type="text" id="nome" name="nome" required>';
    echo '<label for="email">Email:</label>';
    echo '<input type="email" id="email" name="email" required>';
    echo '<button type="submit" name="submit">Salvar</button>';
    echo '</form>';

    if (isset($_POST['submit'])) {
        meu_plugin_inserir_dados($_POST['nome'], $_POST['email']);
        echo '<p>Dados inseridos com sucesso!</p>';
    }
    
    echo '<h2>Lista de Dados Inseridos</h2>';
    $dados = meu_plugin_obter_dados();
    if (!empty($dados)) {
        echo '<table border="1" cellpadding="5" cellspacing="0">';
        echo '<tr><th>ID</th><th>Nome</th><th>Email</th></tr>';
        foreach ($dados as $dado) {
            echo "<tr><td>{$dado->id}</td><td>{$dado->nome}</td><td>{$dado->email}</td></tr>";
        }
        echo '</table>';
    } else {
        echo '<p>Nenhum dado encontrado.</p>';
    }
}

function meu_plugin_criar_tabela() {
    global $wpdb;
    $tabela_nome = $wpdb->prefix . 'meu_plugin_dados';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $tabela_nome (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        nome varchar(255) NOT NULL,
        email varchar(255) NOT NULL,
        PRIMARY KEY (id)
    ) $charset_collate;";

    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'meu_plugin_criar_tabela');

function meu_plugin_inserir_dados($nome, $email) {
    global $wpdb;
    $wpdb->insert(
        $wpdb->prefix . 'meu_plugin_dados',
        array(
            'nome' => sanitize_text_field($nome),
            'email' => sanitize_email($email)
        ),
        array('%s', '%s')
    );
}

function meu_plugin_atualizar_dados($id, $nome, $email) {
    global $wpdb;
    $wpdb->update(
        $wpdb->prefix . 'meu_plugin_dados',
        array(
            'nome' => sanitize_text_field($nome),
            'email' => sanitize_email($email)
        ),
        array('id' => intval($id)),
        array('%s', '%s'),
        array('%d')
    );
}

function meu_plugin_obter_dados() {
    global $wpdb;
    return $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "meu_plugin_dados");
}



?>