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");
}
?>