✅ Notícias, temas e plug-ins da WEB e do WordPress. Aqui compartilhamos dicas e as melhores soluções para sites.

Consultas do WordPress com cláusulas IN (quem sabia)?

19

Há pouco mais de um ano, escrevi um post sobre como usar o WP_Meta_Query sempre que você tiver um conjunto de chaves que deseja usar para ajudar a recuperar informações do banco de dados.

E quanto ao caso, porém, quando você tem várias chaves diferentes que resultariam na criação de uma matriz muito longa para a classe WP_Meta_Query? Por exemplo, e se você tivesse que percorrer uma coleção de dados antes mesmo de configurar a consulta?

Em algum nível, pode parecer que a coisa natural a fazer seria:

  1. iterar através da coleção de chaves,
  2. construir dinamicamente os resultados,
  3. combiná-los em um único conjunto de resultados,
  4. então trabalhe com o que for dado.

Mas isso não soa um pouco complicado (quanto mais lento)?

Quando se trata de usar a API do WordPress, faço o que posso para me ater a ela antes de falar, digamos, diretamente com o banco de dados, mas também há momentos em que faz sentido escrever uma consulta bruta do que escrever algum tipo de código inteligente apenas para que a API do WordPress funcione.

Antes de entrar no raciocínio de por que fiz as coisas que fiz, quero explicar o problema e a abordagem. Isso provavelmente evitará que alguém entre nos comentários prematuramente.

Esta captura de tela não tem nada a ver com a consulta. Apenas uma foto do IDE por diversão.

Então aqui vai:

  • Eu tenho uma matriz padrão de valores que são eventualmente usados ​​para ajudar a obter metadados e criar um tipo de postagem personalizado a partir deles (porque eles foram importados de uma fonte de terceiros).
  • Eu sou um grande defensor da parametrização de consultas (e, portanto, usando prepare) para garantir que os dados sejam consultados corretamente no banco de dados. Infelizmente, isso não estava acontecendo ao tentar executar esta consulta. Vou explicar o porquê mais adiante neste post.
  • Assim, pegar a matriz e convertê-la em uma string é útil, mas ainda não resolve o problema de por que a  função de preparação padrão não estava funcionando.

Dito isso, vou explicar algumas coisas:

  1. por que optei por usar um array para armazenar valores de metadados,
  2. por que usei implode para convertê-los em uma string,
  3. por que não estou usando prepare para lidar com a consulta.

Sobre valores de metadados

A razão para manter metadados em um array como uma propriedade da classe é porque esse array pode mudar com o tempo.

Ou seja, podemos precisar importar dados adicionais de terceiros, precisaremos remover dados de terceiros ou podemos precisar fazer algumas modificações no que estiver presente.

Quando esses dados são mantidos em um único local, fica muito mais fácil gerenciar versões futuras do código.

Implodindo a matriz

Sempre que você estiver executando uma consulta no banco de dados e precisar trabalhar com uma matriz de dados, poderá usar WP_Meta_Query e usar cada chave como parte da matriz de argumentos.

Mas se você tem um conjunto relativamente grande de dados, primeiro você precisa percorrer todos eles, criar a consulta e processá-la.

E uma vez que você tenha feito tudo isso, não estou convencido de que o código que foi escrito não tenha prejudicado o desempenho. É por isso que, às vezes, opto por usar wpdb.

Não usando Preparar

Agora, ao fazer interface diretamente com o banco de dados, tento ter certeza:

  1. Eu tenho uma boa razão para fazê-lo,
  2. Estou usando consultas parametrizadas.

Mas eu tenho trabalhado com esse conjunto específico de dados por um tempo tentando usar todas as permutações do desenvolvimento do WordPress que eu conheço (incluindo conversar com vários colegas sobre isso) para tentar fazer isso funcionar da melhor maneira possível.

Mas não estava acontecendo. E foi aí que me deparei com a seguinte página no Codex :

Em 99% dos casos, você pode usar $wpdb->prepare() em vez disso, e esse é o método recomendado. Esta função é apenas para uso nos raros casos em que você não pode usar facilmente $wpdb->prepare(). Um exemplo é preparar um array para uso em uma cláusula IN.

E era exatamente isso que eu estava tentando fazer: eu estava procurando pesquisar a meta-tabela de postagem onde os valores da meta-chave estavam contidos em uma matriz.

Então aqui está como eu resolvi tudo isso.

Primeiro, criei um array para conter as várias meta-chaves que sei que eventualmente precisarei mapear (embora o valor das chaves não importe para o propósito deste post):

<?php

// This is used to maintain a map of data should we need to add more.
$data_types = [
    'data_item_one',
    'data_item_two',
    '...'
    'data_item_ten,
];

Então eu os converti em uma string pronta para MySQL. Concedido, isso não é entrada do usuário e está sendo usado em uma  cláusula IN, portanto, não pode ser usado em uma  instrução prepare :

<?php

/**
 * Converts the incoming array into a comma-delimited string with
 * quotes wrapped around each key.
 *
 * @access private
 *
 * @param  array $arr The array to convert to a string.
 * @return string     The string representation of the array delimited by quotes and commas.
 */
private function convert_to_sql_ready_string( $arr) {
  return '"'. implode( $arr, '","' ). '"';
}

Por fim, criei a consulta e recuperei os resultados:

<?php

public function get_data_values() {

  global $wpdb;
  $query = "
    SELECT post_id, meta_key, meta_value 
    FROM $wpdb->postmeta WHERE
    meta_key in ($this->data_types) AND 
    meta_value <> '';
  ";

  $results = $wpdb->get_results( $query );

  return $results;
}

E foi assim que acabei trabalhando com os arrays, a propriedade de classe e configurando minha consulta.

Esta é a melhor maneira de trabalhar com consultas do WordPress com cláusulas IN? Não tenho certeza, mas dada a minha experiência, o que li e como está funcionando, estou feliz com o resultado final.

Fonte de gravação: tommcfarlin.com

Este site usa cookies para melhorar sua experiência. Presumiremos que você está ok com isso, mas você pode cancelar, se desejar. Aceitar Consulte Mais informação