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.
| Tabela | Função |
|---|---|
| wp_posts | Armazena posts, páginas, anexos e custom post types. |
| wp_postmeta | Armazena metadados de posts (pares chave/valor). |
| wp_users | Contém informações de login e credenciais de usuários. |
| wp_usermeta | Metadados relacionados aos usuários (funções, permissões). |
| wp_terms | Contém os nomes de categorias e tags. |
| wp_term_taxonomy | Relaciona termos a taxonomias. |
| wp_term_relationships | Associa posts aos termos. |
| wp_options | Configurações do site, plugins e tema ativo. |
| wp_comments | Comentários enviados no site. |
| wp_commentmeta | Metadados 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
- Evite armazenar dados volumosos em metadados. Use tabelas customizadas quando necessário.
- Faça backup periódico do banco e use controle de versão para scripts SQL.
- Monitore o tamanho da tabela
wp_options. - Prefira APIs nativas do WordPress (
get_posts(),get_user_meta(),update_option()). - Limpe revisões e transients expirados para manter o banco enxuto.