Banco de dados do WordPress. Objeto $wpdb
Banco de dados do WordPress. Objeto $wpdb
Hoje nós vamos falar sobre como trabalhar com banco de dados do WordPress. O WordPress tem para isso um objeto especial $wpdb da classe wpdb.
Essa classe permite conectar com banco de dados sem precisar usar chamadas do SQL
global $wpdb;
$results = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}options WHERE option_id = 1", OBJECT );
Este exemplo recupera uma opção da tabela wp_options com um valor de coluna option_id igual a um. Se fizermos print_r( $results ), obtemos:
Array
(
[0] => stdClass Object
(
[option_id] => 1
[option_name] => siteurl
[option_value] => https://wordpresstuts.com.br
[autoload] => yes
)
)
$wpdb-prepare() ou como se proteger de injeções de SQL
Quaisquer dados que você passar para suas consultas SQL devem ser sanitizados ou você aumentará o risco de injeção de SQL para seu site. O método prepare faz um ótimo trabalho e também suporta as sintaxes sprintf() e vsprintf().
A melhor maneira de entender como funciona é com um exemplo.
$meta_key = 'seo_title';
$meta_value = 'Olá!';
$wpdb->query(
$wpdb->prepare(
"
INSERT INTO $wpdb->postmeta
( post_id, meta_key, meta_value )
VALUES ( %d, %s, %s )
",
10,
$meta_key,
$meta_value
)
);
Vamos dar uma olhada neste exemplo:
- $wpdb->prepare() prepara a consulta SQL para $wpdb->query() e reside diretamente dentro dela.
- A sintaxe sprintf() que usada aqui, no primeiro parâmetro temos uma consulta INSERT INTO SQL como uma string, na qual as variáveis são substituídas por placeholders (%d e %s), que serão substituídos por variáveis dos seguintes parâmetros na mesma ordem em que são indicados. Por exemplo, %d será substituído por 10.
- %d significa inteiro, %s significa string, mais valores podem ser encontrados na documentação do sprintf().
A sintaxe vsprintf() difere porque os valores são passados para a consulta não como um número infinito de variáveis, mas como um array.
$meta_key = 'seo_title';
$meta_value = 'Olá!';
$wpdb->query(
$wpdb->prepare(
"
INSERT INTO $wpdb->postmeta
( post_id, meta_key, meta_value )
VALUES ( %d, %s, %s )
",
array(
10,
$meta_key,
$meta_value,
)
)
);
Em ambas as situações, não precisamos limpar os dados transmitidos de forma alguma, porque nós os passamos através de espaços reservados.
Certifique-se de usar $wpdb->prepare() com $wpdb->query(), $wpdb->get_col(), $wpdb->get_var(), $wpdb->get_row(), $wpdb->get_results( ).
Não há necessidade de usar $wpdb->prepare() com os métodos $wpdb->insert(), $wpdb->update(), $wpdb->replace(), $wpdb->delete() pois já está dentro dele.
Acessando tabelas MySQL, prefixo de tabela
Temos várias variáveis específicas da classe que ajudam nos a conectar as tabelas do banco de dados
$commentmeta
$comments
$links
$options
$postmeta
$posts
$terms
$term_relationships
$term_taxonomy
$usermeta
$users
Um exemplo de uso dessas variáveis
$wpdb->query(
$wpdb->prepare(
"
DELETE FROM $wpdb->posts
WHERE id = '%d'
",
$post_id
)
);
Ok, mas como conectar as tabelas dos plugins ou tabelas que criamos manualmente no WordPress?
$wpdb->query(
$wpdb->prepare(
"
DELETE FROM " . $wpdb->prefix . "posts
WHERE id = '%d'
",
$post_id
)
);
Espero que até agora está tudo claro. Vamos para frente.
$wpdb->get_results()
O primeiro método parece muito com uma solicitação simples do SELECT
$wpdb->get_results( 'query', output_type );
output_type
Tipo de saída.
OBJECT – objeto (padrão)
OBJECT_K – Um array associativo que usará os valores da primeira coluna como chaves e ignorará duplicatas.
ARRAY_A – Um array numerado que consiste em arrays associativos, que serão indexados pelos nomes das colunas.
ARRAY_N – Uma matriz bidimensional numerada.
Veja como mostrar os títulos de todas as páginas publicadas
$pages = $wpdb->get_results(
"
SELECT post_title, post_content
FROM $wpdb->posts
WHERE post_status = 'publish'
AND post_type = 'page'
"
);
if( $pages ) {
foreach ( $pages as $page ) {
echo $page->post_title;
}
}
E mais um exemplo, mas com uso de setup_postdata que seria parecida com WP_Query
$pages = $wpdb->get_results(
"
SELECT *
FROM $wpdb->posts
WHERE post_status = 'publish'
AND post_type = 'page'
"
);
if ( $pages ) {
foreach ( $pages as $post ) {
setup_postdata( $post );
echo '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
}
} else {
echo '<p>Nada foi encontrado</p>';
}
$wpdb->get_var()
Vamos para o segundo método, get_var(), diferente de get_results(), ele permite exibir um valor, e este pode ser a soma dos valores ou o número de linhas.
$wpdb->get_var( 'query', column_offset, row_offset );
Onde column_offset – é o número do coluna, e row_offset é o número da linha
Vamos receber a data de cadastro de um usuário
$date = $wpdb->get_var(
"
SELECT user_registered
FROM $wpdb->users
WHERE user_login = 'PedroHenrique'
"
);
echo $date;
E agora vamos saber quantas pessoas se cadastraram em nosso site
$number_of_users = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users" );
echo "Total pessoas cadastradas: {$number_of_users}";
$wpdb->get_row()
Recebe o valor somente de uma linha que responde a solicitação
$wpdb->get_row( 'query', output_type, row_offset );
output_type
tipo de saída de dados,
OBJETO – objeto (padrão),
ARRAY_A – matriz associativa,
ARRAY_N – array numerado;
row_offset – número da linha
Vamos procurar um post que tem mais comentários
$post = $wpdb->get_row(
"
SELECT post_title, post_content
FROM $wpdb->posts
WHERE post_status = 'publish'
ORDER BY comment_count DESC LIMIT 0,1
"
);
echo $post->title;
E usando uma matriz associativa faremos assim:
$post = $wpdb->get_row(
"
SELECT post_title, post_content
FROM $wpdb->posts
WHERE post_status = 'publish'
ORDER BY comment_count DESC LIMIT 0,1
",
ARRAY_A
);
echo $post[ 'title' ];
$wpdb->get_col()
Recebe os dados comente de uma coluna
$wpdb->get_col( 'query', column_offset );
column_offset é o número de colulna
Como receber o título do primeira página publicada
$posts = $wpdb->get_col(
"
SELECT post_title
FROM $wpdb->posts
WHERE post_status = 'publish'
AND post_type='page'
"
);
echo $posts[0];
$wpdb->insert()
Projetado para inserir uma linha em uma tabela. Vou direto ao exemplo, pois à primeira vista, pouco ficará claro na sintaxe.
$wpdb->insert(
$wpdb->prefix . 'usermeta', // definimos a tabela
array( 'nome da tabela' => 'valor'
'user_id' => 1,
'meta_key' => 'first_name',
'meta_value' => 'Lucas'
),
array(
'%d', // %d - um número
'%s', // %s - uma string
'%s'
)
);
$wpdb->update()
Atualiza os dados na tabela
$wpdb->update(
$wpdb->prefix . 'usermeta', // definimos a tabela
array('meta_value' => 'Lucas'), // alteramos o nome
array(
'user_id' => 1,
'meta_key' => 'first_name'
),
array( '%s' ),
array(
'%d',
'%s'
)
);