Tópico 4 — Banco de Dados no WordPress

1. Estrutura do Banco

O WordPress usa o banco de dados relacional MySQL ou MariaDB para armazenar posts, usuários, configurações e metadados. Sua estrutura é enxuta e altamente extensível. Abaixo, uma visão geral das tabelas principais.

TabelaFunção
wp_postsArmazena posts, páginas, anexos e custom post types.
wp_postmetaArmazena metadados de posts (pares chave/valor).
wp_usersContém informações de login e credenciais de usuários.
wp_usermetaMetadados relacionados aos usuários (funções, permissões).
wp_termsContém os nomes de categorias e tags.
wp_term_taxonomyRelaciona termos a taxonomias.
wp_term_relationshipsAssocia posts aos termos.
wp_optionsConfigurações do site, plugins e tema ativo.
wp_commentsComentários enviados no site.
wp_commentmetaMetadados associados aos comentários.

2. Relacionamentos Principais

Relações entre tabelas
wp_posts
 ├── wp_postmeta (1:N)
 │     └── metadados de cada post
 ├── wp_term_relationships (1:N)
 │     └── associa posts às taxonomias
 └── wp_comments (1:N)
       └── comentários vinculados ao post

wp_terms
 └── wp_term_taxonomy (1:1)
       └── wp_term_relationships (1:N)

wp_users
 └── wp_usermeta (1:N)
       └── perfis, funções e preferências
Importante O WordPress não usa chaves estrangeiras nativas por padrão, mas os relacionamentos são mantidos logicamente via IDs.

3. Consultas SQL Comuns

Listar posts publicados
SELECT ID, post_title, post_date 
FROM wp_posts
WHERE post_status = 'publish' 
  AND post_type = 'post'
ORDER BY post_date DESC
LIMIT 10;
Buscar posts por termo (categoria/tag)
SELECT p.ID, p.post_title, t.name AS categoria
FROM wp_posts p
JOIN wp_term_relationships r ON (p.ID = r.object_id)
JOIN wp_term_taxonomy tt ON (r.term_taxonomy_id = tt.term_taxonomy_id)
JOIN wp_terms t ON (tt.term_id = t.term_id)
WHERE p.post_status = 'publish' 
  AND tt.taxonomy = 'category'
ORDER BY p.post_date DESC;
Consultar metadados de um post
SELECT meta_key, meta_value
FROM wp_postmeta
WHERE post_id = 42;

4. Índices e Otimização

Como o WordPress depende fortemente de metadados, índices podem melhorar muito a performance em sites grandes.

Criar índice para meta_key/meta_value
CREATE INDEX idx_postmeta_key_value
ON wp_postmeta (meta_key(100), meta_value(100));
Aviso Índices melhoram buscas, mas aumentam custo de escrita. Avalie volume de dados antes de aplicar em produção.

5. Consultando com $wpdb no PHP

O objeto global $wpdb abstrai conexões e permite consultas seguras com prepare().

Exemplo prático
<?php
global $wpdb;

// Consulta simples
$posts = $wpdb->get_results(
  "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_status='publish' LIMIT 5"
);

// Consulta segura com prepare()
$autor = 'admin';
$query = $wpdb->prepare(
  "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_author = %s AND post_status = 'publish'",
  $autor
);
$resultados = $wpdb->get_results($query);

foreach ($resultados as $p) {
  echo '<p>'.$p->post_title.'</p>';
}
Boas práticas use prepare() para evitar SQL Injection e prefira {$wpdb->prefix} para compatibilidade com prefixos personalizados.

6. wp_options e Autoload

A tabela wp_options armazena configurações do site e variáveis persistentes. O campo autoload define se a opção é carregada automaticamente em todas as páginas.

Consulta de autoloads
SELECT option_name, LENGTH(option_value) AS tamanho
FROM wp_options
WHERE autoload = 'yes'
ORDER BY tamanho DESC
LIMIT 10;
Impacto Opções grandes com autoload='yes' são carregadas em todas as páginas, afetando o tempo de carregamento.

7. Boas Práticas