Usando $ wpdb para consultar posts com meta valor contendo current post_id

2

Eu estou tentando usar $ wpdb para recuperar uma lista de posts do banco de dados onde o meta_value na tabela wp_postmeta contém o atual post_ID em vírgulas invertidas. por exemplo. "10"

As aspas invertidas são a garantia de que 10 também não corresponda a 100, etc.

Eu posso fazer o trabalho trabalhar quando eu colo o exato do valor meta ou seja: a: 1: {i: 0; s: 2: "10";}, no entanto, ele também está retornando todas as revisões, não apenas o post mais recente.

Aqui está o código que estou usando no momento:

   $id = get_the_ID();
   $rows = $wpdb->get_results($wpdb->prepare( 
                  "
                  SELECT * 
                  FROM wp_postmeta
                  WHERE meta_key LIKE %s
                      AND meta_value = %s
                  ",
                  'roles_%_production',
                  '%"' . $id . '"%'
              ));

        // loop through the results
        if( $rows ) {
        ......
        }

Qualquer ideia seria muito apreciada.

Obrigado

    
por Matt Edwards 04.08.2013 / 08:20

3 respostas

6

No código que você postou, você não recupera 'lista de postagens' como diz, mas recupera uma lista de linhas na meta-tabela. Se você quiser realmente recuperar uma lista de posts, confie em WP_Query usando meta_query param.

Algo como:

$id = '10'; // unserialized value

$args = array(
  'post_type' => 'post',
  'post_status' => 'publish',
  'posts_per_page' => -1,
  'meta_query' => array(
    array(
      'key' => 'roles_%_production',
      'value' => $id,
      'compare' => 'LIKE'
    )
  )
);
$query = new WP_Query( $args );
$rows = $query->get_posts();

Se você quiser usar $ wpdb (não sei por que), a consulta correta é algo como:

<?php
$id = '10'; // unserialized value

global $wpdb;
$rows = $wpdb->get_col( $wpdb->prepare(
  "SELECT DISTINCT $wpdb->posts.ID FROM $wpdb->posts, $wpdb->postmeta
  WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id AND
  $wpdb->posts.post_status = 'publish' AND
  $wpdb->posts.post_type = 'post' AND
  $wpdb->postmeta.meta_key = %s AND
  meta_value = %s",
  'roles_%_production',
  $id
) );
?>

$rows conterá uma matriz de IDs de postagens. Eu fiz essa alteração para fazer um sentido para o uso de $ wpdb. Se você quiser recuperar todos os campos, use SELECT * em vez de SELECT DISTINCT $wpdb->posts.ID , use $wpdb->get_results em vez de $wpdb->get_col e adicione a linha GROUP BY $wpdb->posts.ID à consulta.

    
por gmazzap 04.08.2013 / 10:29
1

Duas notas:

Pesquisando metadados

A regra é simples: os metadados serializados (como uma matriz convertida em a:1:{i:0;s:2:"10";} ) não devem ser pesquisados . Você terá que converter seu conjunto de dados em valores únicos, para que você possa fazer as pesquisas meta_query adequadas.

A única maneira realmente funcional de pesquisar isso é consultar todos os dados, depois desserializá-los, processá-los se corresponderem aos seus critérios ou ignorá-los. Existem discussões suficientes e perguntas e respostas sobre o SO que abrangem esse tópico .

Declarações preparadas

like_escape() , que deve ser usado assim:

"%".like_escape( $string )."%"

A razão pela qual você precisa pré e acrescentar os caracteres % é simples: Você pode decidir se o LIKE deve acontecer em ambas as extremidades ou apenas em uma única (início, fim, ambos os lados).

    
por kaiser 04.08.2013 / 13:51
0
  

As aspas invertidas são a garantia de que 10 também não corresponda a 100, etc.

     

Eu posso fazer o trabalho trabalhar quando eu colo o exato do valor meta ou seja: a: 1: {i: 0; s: 2: "10";}

Isso ocorre porque, na sua consulta WHERE, você usou = , onde o valor contém % . Usar o LIKE em vez disso resolveria esse problema específico. Altere meta_value = %s para meta_value LIKE %s e sua consulta deve funcionar da mesma forma como se você usasse a sequência serializada completa.

  

também está retornando todas as revisões, não apenas a postagem mais recente.

Certifique-se de especificar o tipo de postagem e o status corretos ao consultar seus resultados. Se você quiser incluir todas as postagens que não são revisões, será necessário garantir a inclusão na tabela de postagens (antes da declaração WHERE ).

LEFT JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->postmeta.post_id

e inclua a seguinte linha na sua declaração WHERE (vinculada por um AND ).

$wpdb->posts.post_type NOT IN ('revision')
    
por Shaun Cockerill 31.07.2017 / 03:10