¿Puedo consultar metadatos personalizados a través de WP_Query?

4 oct 2012, 19:37:01
Vistas: 24.3K
Votos: 6

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!

1
Comentarios

Evita arreglos multidimensionales

Tom J Nowell Tom J Nowell
4 oct 2012 21:11:01
Todas las respuestas a la pregunta 2
8
11

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

4 oct 2012 19:51:44
Comentarios

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

yoxalld yoxalld
4 oct 2012 20:39:53

¿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];

Tom J Nowell Tom J Nowell
4 oct 2012 21:08:53

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

Tom J Nowell Tom J Nowell
4 oct 2012 21:10:35

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

yoxalld yoxalld
4 oct 2012 22:10:04

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

Tom J Nowell Tom J Nowell
4 oct 2012 22:20:05

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

yoxalld yoxalld
4 oct 2012 22:46:56

¡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

Tom J Nowell Tom J Nowell
5 oct 2012 00:20:16

He actualizado mi respuesta para reflejar eso, lo siento, debería haberme dado cuenta antes de que el meta no era un valor individual

Tom J Nowell Tom J Nowell
5 oct 2012 00:21:57
Mostrar los 3 comentarios restantes
0
    $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 );
22 ene 2021 14:41:24