Obtener entradas basadas en meta key/valor
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:
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
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.

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

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

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.

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!
