Usando $ wpdb para consultar publicaciones con valor meta que contenga post_id actual

2

Estoy intentando usar $ wpdb para recuperar una lista de publicaciones de la base de datos donde el meta_valor en la tabla wp_postmeta contiene la post_ID actual en comas invertidas. p.ej. "10"

Las comillas invertidas son las que aseguran que 10 no coincidan con 100, etc.

Puedo hacer que funcione cuando pego el valor exacto del metacontenedor, es decir: a: 1: {i: 0; s: 2: "10";}, sin embargo, también está devolviendo todas las revisiones, no solo la publicación más reciente.

Aquí está el código que estoy usando actualmente:

   $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 ) {
        ......
        }

Cualquier idea sería muy apreciada.

Gracias

    
pregunta Matt Edwards 04.08.2013 - 08:20

3 respuestas

6

En el código que publicaste, no recuperas la 'lista de publicaciones' como dices, sino que recuperas una lista de filas en la tabla meta. Si realmente quieres recuperar una lista de publicaciones, confía en 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();

Si desea usar $ wpdb (no sé por qué) la consulta correcta es algo así 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 contendrá una matriz de ID de publicaciones. He hecho este cambio para dar sentido al uso de $ wpdb. Si desea recuperar todos los campos, use SELECT * en lugar de SELECT DISTINCT $wpdb->posts.ID , use $wpdb->get_results en lugar de $wpdb->get_col y agregue la línea GROUP BY $wpdb->posts.ID a la consulta.

    
respondido por el gmazzap 04.08.2013 - 10:29
1

Dos notas:

Buscando metadatos

La regla es simple: los metadatos serializados (como una matriz convertida a a:1:{i:0;s:2:"10";} ) no deben buscarse . Tendrá que convertir su conjunto de datos a valores individuales, para que pueda realizar las búsquedas correctas de meta_query .

La única forma realmente útil de buscar esto es consultar todos los datos, luego deserializarlos, procesarlos si coinciden con sus criterios o omitirlos. Hay suficientes discusiones y Q / As sobre SO que cubren ese tema .

Declaraciones preparadas

Hay like_escape() , que debe usarse de esta forma:

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

La razón por la que necesita pre y anexar % chars es simple: puede decidir si el LIKE debería ocurrir en ambos extremos o solo en uno (inicio, final, ambos lados).

    
respondido por el kaiser 04.08.2013 - 13:51
0
  

Las comillas invertidas son las que aseguran que 10 no coincidan con 100, etc.

     

Puedo hacer que funcione cuando pego el valor exacto del metacontenedor, es decir: a: 1: {i: 0; s: 2: "10";}

Esto se debe a que en su consulta WHERE, utilizó = donde el valor contiene % . Usar LIKE en su lugar solucionaría este problema en particular. Cambie de meta_value = %s a meta_value LIKE %s , y su consulta debería funcionar igual que si usara la cadena serializada completa.

  

también está devolviendo todas las revisiones, no solo la publicación más reciente.

Asegúrese de especificar el tipo de publicación y el estado correctos al consultar sus resultados. Si desea incluir todas las publicaciones que no sean revisiones, deberá asegurarse de unirse a la tabla de publicaciones (antes de su declaración WHERE ).

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

e incluya la siguiente línea en su declaración WHERE (vinculada por un AND ).

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

Lea otras preguntas en las etiquetas