Consulta WP Query por valor de meta post

18 nov 2014, 16:58:05
Vistas: 35.2K
Votos: 6

Estoy intentando obtener las entradas que tienen aplicado el valor meta trainees.

$args = array(
    'posts_per_page'   => -1,
    'orderby'          => 'post_date',
    'order'            => 'DESC',
    'post_status'      => 'publish',
    'meta_query' => array(
        array(
            'key'     => 'enterprise_on_page',
            'value'   => array( 'trainees' ),
            'compare' => 'IN',
        ),
    ),
);

$enterprise_posts = get_posts( $args );


En mi campo meta con la clave enterprise_on_page tengo almacenado un array() previamente como update_post_meta( $post_id, 'enterprise_on_page', array('trainees', 'staff') );.

Si ejecuto var_dump(get_post_meta($post->ID)) obtengo la siguiente salida:

'enterprise_on_page' => 
    array (size=1)
      0 => string 'a:2:{i:0;s:8:"trainees";i:1;s:7:"staff";}' 


¿Cómo puedo modificar mi consulta para que solo se muestren las entradas con el valor meta trainees? Por ahora no obtengo ninguna entrada.

0
Todas las respuestas a la pregunta 3
0

Gracias a @Howdy_McGee. Me dio la pista de buscar consultas meta serializadas. Con este código obtengo el resultado deseado.

$args = array(
    'posts_per_page'   => -1,
    'orderby'          => 'post_date',
    'order'            => 'DESC',
    'post_status'      => 'publish',
    'meta_query' => array(
        array(
            'key'     => 'enterprise_on_page',
            'value'   => serialize(strval('trainees')),
            'compare' => 'LIKE',
        ),
    ),
);

$enterprise_posts = get_posts( $args );
18 nov 2014 17:24:45
0

No creo que puedas comparar con precisión valores de un Array Serializado, lo cual ocurre cada vez que pasas un array a update_post_meta. Necesitas obtener el valor completo durante tu bucle usando:

get_post_meta( $post->ID, 'enterprise_on_page', 1 )

Si necesitas especificar consultas basadas en estos valores, lo mejor es guardarlos por separado.

Consulta esta pregunta para más información:

meta_query con valores meta como arrays serializados

18 nov 2014 17:14:03
0

Con la estructura actual de tus datos, no puedes usar SQL para hacer eso (bueno, al menos no de forma eficiente). Tienes dos opciones:

  1. Obtener TODAS las publicaciones y recorrerlas en memoria buscando el meta correcto, o
  2. Almacenar los valores meta por separado.

Entre las dos, recomiendo la segunda. WordPress te permite almacenar múltiples filas del mismo meta para una sola publicación, por lo que puedes obtener un array de datos sin necesidad de serializarlo y almacenarlo en una sola clave. Para hacer esto, necesitas cambiar ligeramente cómo interactúas con la API de meta de publicaciones. Algo como esto es lo que necesitarías:

Al obtener el meta de la publicación, harías:

get_post_meta($ID, 'enterprise_on_page', false);

La actualización sería lo más diferente. Si solo quieres añadir un valor, haz:

add_post_meta($ID, 'enterprise_on_page', $value);

Para actualizar un valor:

update_post_meta($ID, 'enterprise_on_page', $new_value, $old_value);

Y para eliminar un valor:

delete_post_meta($ID, 'enterprise_on_page', $value_to_delete);
18 nov 2014 17:23:09