Obtener entradas basadas en meta key/valor

4 jun 2013, 12:28:26
Vistas: 25.4K
Votos: 6

Tengo un tipo de post personalizado "custom_author" que se selecciona al crear una nueva entrada usando un desplegable metabox con la clave de campo "chosen_author".

Así es como se ve mi wp_postmeta:

Ejemplo de tabla wp_postmeta mostrando la relación entre posts y autores

Donde 13088 es la entrada del blog que tiene asignado el "autor" 13112.

Estoy intentando obtener todas las entradas de un autor en particular usando lo siguiente:

$args = array(
        'post_type'     => 'post',
        'post_status'   => 'publish',
        'meta_query' => array(
            array(
                'key' => 'chosen_author',
                'value' => '13112' // probado con y sin comillas
            )
        )
    );

    $getPosts = new WP_Query($args);

Pero simplemente devuelve TODAS mis entradas.

Hice algunas pruebas de depuración:

$getPosts = new WP_Query($args);
echo $GLOBALS['wp_query']->request;

y eso mostró

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND (wp_posts.post_author != 0) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10

¡Ignorando completamente el array meta_query!

Si importa, esto se está usando fuera del loop

2
Comentarios

$GLOBALS['wp_query']->request no será tu consulta porque tu consulta no es $wp_query, global o de otro tipo, es $getPosts. echo $getPosts->request es lo que necesitas.

s_ha_dum s_ha_dum
4 jun 2013 18:07:42

Si almacenas $getPosts, ¿por qué no simplemente $getPosts->posts?

->request contiene REQUEST, es decir, la consulta SQL para tus posts, no los RESULTADOS... :)

jave.web jave.web
12 jun 2017 10:02:36
Todas las respuestas a la pregunta 2
7

El problema

Parece que estás guardando los datos como:

$a = array( "13112" );
update_post_meta( $post_id, "article_author", $a);

lo cual te dará el meta_value

a:1:{i:0;s:5:"13112";}

Tu primera consulta te dará comillas escapadas:

LIKE '%\"13112\"%'

Método 1

Si guardas el array de autores con números en lugar de strings:

$a = array( 13112 );
update_post_meta( $post_id, "article_author", $a);

entonces el meta_value correspondiente será

a:1:{i:0;i:13112;}

Así que cuando intentes la meta query:

 'meta_query' => array(
            array(
                'key' => 'article_author',
                'value' => ':13112;',
                'compare' => 'LIKE'
            )
    )

la parte SQL correspondiente será

LIKE '%:13112;%'

Podrías intentar usar esto en su lugar.

Método 2

Otra forma es eliminar las comillas escapadas con comillas no escapadas:

add_filter('posts_where','my_posts_where');
$getPosts = new WP_Query($args);
remove_filter('posts_where','my_posts_where');

donde

function my_posts_where($where){    
    $where = str_replace('\"', '"', $where);    
    return $where;  
}

pero no lo recomiendo.

4 jun 2013 13:46:39
Comentarios

Gracias por esto, no tengo mucho control sobre el formato de guardado (cadena/entero). Por curiosidad, ¿por qué devuelve todas las publicaciones si claramente no encuentra una coincidencia? ¿Cómo se supone que debo manejar cuando no hay publicaciones coincidentes si me devuelve todas mis publicaciones? Edición: OK, no devuelve TODAS mis publicaciones, pero sí devuelve cientos

Titan Titan
4 jun 2013 14:18:04

Sí, eso es extraño, cuando buscas en PHPMyAdmin, ¿obtienes resultados similares?

birgire birgire
4 jun 2013 14:48:34

Estaba usando un plugin para ayudarme con meta boxes personalizados (un desplegable de las entradas de mi tipo de contenido personalizado). Me he sumergido y lo he hecho todo yo mismo en functions.php y ahora guardo en la base de datos solo el número como meta_value: 13112. Aún sin éxito, veré si puedo activar algún tipo de depuración que muestre la consulta SQL que está intentando realizar.

Titan Titan
4 jun 2013 17:09:26

Extraño, usé $GLOBALS['wp_query']->request; para averiguar y mostró SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND (wp_posts.post_author != 0) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10 ¡ignorando completamente el meta_query!

Titan Titan
4 jun 2013 17:15:26

He actualizado mi pregunta original con un resumen más actualizado

Titan Titan
4 jun 2013 17:20:28

Corregido abajo (¡perdón por el spam!)

Titan Titan
4 jun 2013 17:36:26

Que bueno escuchar que encontraste una solución a tu problema ;-) Deberías revisar tu SQL con $getPosts->request en su lugar.

birgire birgire
4 jun 2013 17:51:54
Mostrar los 2 comentarios restantes
0

Corregido utilizando

get_posts($args) en lugar de new WP_Query($args);

No tengo idea de por qué...

4 jun 2013 17:36:00