¿Puedo consultar metadatos personalizados a través de WP_Query?
Ok, mi pregunta es un poco compleja así que intentaré dar una explicación general y luego entrar en detalles.
Estoy ejecutando WordPress 3.4.2 y estoy usando WCK Post Type Creator y WCK Custom Fields Creator para crear mi tipo de post personalizado y campos personalizados.
Estoy tratando de consultar posts del tipo personalizado 'business' que tienen un campo personalizado 'special' adjunto. Mi problema es que me gustaría ser más específico y obtener solo cierto tipo de especial (que está configurado en el plugin Custom Fields Creator) pero no sé si/cómo puedo hacer esto usando el argumento meta_query para WP_Query.
Lo que tengo ahora extraerá posts del tipo de post pero luego tengo que usar get_post_meta() para encontrar los campos personalizados y recorrerlos haciendo pruebas para lo que quiero. Esto es lo que tengo ahora mismo:
<?php
$args = array(
'post_type' => 'business',
'meta_query' => array(
array(
'key' => 'specials'
)
)
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$specials = get_post_meta( $post->ID, 'specials');
//Recorrer array de especiales
foreach( $specials as $special){
//Recorrer cada especial
foreach($special as $individual){
//Comprobar si hay un especial de bebida
if ($individual ['type-of-special'] == 'Drink' ) {
//Hacer cosas
}//individual
}//special
} //specials
endwhile; ?>
Entonces, lo que estoy haciendo aquí es extraer los posts y luego para cada post obtener los metadatos 'specials' y recorrer los diferentes arrays para verificar qué tipo de especial es y luego mostrar cosas si es el tipo correcto de especial. ¿Hay alguna manera de ser más específico en mi WP_query para que solo devuelva los posts que son de cierto tipo de especial?
El problema con el que me encuentro es que no sé cómo profundizar lo suficiente en los arrays multidimensionales que tiene el campo personalizado 'specials' para verificar valores con el argumento meta_query para WP_Query.
Si imprimo $special en foreach($specials as $special) obtengo esto:
Array
(
[0] => Array
(
[type-of-special] => Drink
[name-of-special] => Pumpkin Latte
[price] => 2.00
[day-of-the-week] => Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
)
)
Así que no sé cómo llegar a la clave [type-of-special] para verificar su valor a través de meta_query.
Sé que esta es mucha información y realmente aprecio cualquier comentario y ayuda para resolver este problema. Si necesitas más información o aclaración sobre algo, házmelo saber. ¡Gracias de nuevo!

Normalmente solo especificarías un meta_value, por ejemplo:
$args = array(
'post_type' => 'business',
'meta_query' => array(
array(
'key' => 'specials',
'value' => 'these are not the specials you are looking for - Obi Wan Kenobi'
)
)
);
Sin embargo, como tus metadatos de publicación son en realidad una estructura de datos, un array/objeto PHP serializado, eso no es posible.
Puedes leer más aquí:
http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

No estoy seguro de cómo formatear el campo 'value' porque la información que necesito verificar está dentro de un array. He intentado estos: 'value' => 'Drink' 'value' => 'type-of-special' 'value' => array([type-of-special]=>'Drink')
pero ninguno de esos funciona. ¿Alguna idea de cómo debería formatearlo para acceder a esos arrays? Gracias

¿Por qué harías 'value' => 'type-of-special' 'value' => array([type-of-special]=>'Drink')? Simplemente accede al campo del array que quieres, PHP básico, por ejemplo, para acceder al elemento 5 del array 'stuff' haz $thefifthvalueinstuff = $stuff[5];

De hecho, mirando tu código, tu pregunta de seguimiento tampoco tiene sentido. Configúralo como 'Drink', y no tendrás que verificar si es del tipo drink porque solo se devolverán los tipos drink

Creo que el problema está en cómo WCK Custom Fields Creator almacena los campos personalizados que crea. El meta box personalizado es 'specials' pero 'Drink' es solo un dato contenido dentro de ese campo personalizado, por lo que no es reconocido por meta_query como una 'key'.
Por eso publiqué la salida de $special, porque necesito ayuda para entender cómo acceder a la información contenida dentro de esos arrays. Disculpa la confusión. Gracias

Pero tu meta query ocurre antes del loop, no tienes ninguno de esos datos todavía así que no puedes usarlos en tus query args

Ok genial, seguiré haciendo las comprobaciones dentro del Loop, no estaba seguro si había una forma más correcta de hacerlo que la que estaba usando. ¡Realmente aprecio toda tu ayuda! Gracias

¡AJA! Perdón, ahora lo entendí. Vas a tener que almacenar tu metadato de publicación de manera diferente, ya que los valores del post meta son objetos serializados

$args = array(
'post_type' => "tu_tipo_de_post",
'meta_key' => 'nombre_de_la_clave_meta',
'meta_compare' => '=', // consulta la documentación para ver las opciones de comparación
'meta_value ' => 'el_valor_que_quieres_buscar'
);
$posts = new WP_Query( $args );
https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters
Si deseas buscar elementos que no estén vacíos
$args = array(
'post_type' => "tu_tipo_de_post",
'meta_key' => 'nombre_de_la_clave_meta',
'meta_compare' => '!=',
'meta_value ' => ''
);
$posts = new WP_Query( $args );
