Blog

Banco de dados do WordPress. Objeto $wpdb

banco de dados / médio

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'
	)
);

Leave your thought here

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *