Comparar meta_query en los argumentos de get_posts

13 nov 2014, 13:04:26
Vistas: 33.7K
Votos: 12

Me gustaría excluir ciertas entradas con un campo personalizado. Entonces si my_custom_field_ignore está definido Y es 1 ignorar esta entrada. Si no está definido, incluirla.

Esto es lo que tengo

    $args = array(
        'post_type' => $post_type,
        'offset' => $offset,
        'meta_query' => array(
            array(
                'key' => 'my_custom_field_ignore',
                'value' => '1',
                'compare' => '!=',
            )
        )
    );

Esto solo funciona para entradas donde my_custom_field_ignore está establecido a algo diferente de 1

¿Cómo puedo incluir todas las entradas (por supuesto no las que tienen my_custom_field_ignore = 1)?

Edición:

Así es como funciona en WP 3.5+

    'meta_query' => array(
        array(
            'key' => 'my_custom_field_ignore',
            'compare' => 'NOT EXISTS',
        )
    )

Esta simple búsqueda para la aparición de my_custom_field_ignore ignora el valor. Si bien esto podría funcionar en primer lugar, los usuarios podrían confundirse cuando cambian 1 a 0 y esperan ser incluidos.

Parece que 3.3 y 3.4 necesitan alguna verificación condicional.

Edición 2

Parece que la respuesta marcada funciona (al menos para 3.5+). Por alguna razón extraña ignora la primera entrada "Hello World". Después de agregar my_custom_field_ignore y eliminarlo posteriormente, funciona

0
Todas las respuestas a la pregunta 2
12
11

Si definimos las condiciones:

A: my_custom_field_ignore EXISTE
B: my_custom_field_ignore = 1

entonces NOT ( A && B ) es equivalente a:

NOT ( A ) || NOT ( B )

lo que significa en nuestro caso:

( my_custom_field_ignore NO EXISTE ) ||  ( my_custom_field_ignore != 1 ) 

Por lo tanto, podríamos intentar lo siguiente para WP 3.5+ (no probado):

 $args = array(
    'post_type'  => $post_type,
    'offset'     => $offset,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'my_custom_field_ignore',
            'value'   => '1',
            'compare' => '!=',
        ),
        array(
            'key'     => 'my_custom_field_ignore',
            'compare' => 'NOT EXISTS',
            'value'   => '1',     #<-- solo algún valor como solución temporal para un bug anterior a 3.9 (Codex)
        ),
    )
);
13 nov 2014 13:19:08
Comentarios

Gracias, lo revisaré pero debería funcionar con 3.3+

Xaver Xaver
13 nov 2014 13:20:12

Actualicé la respuesta, el NOT EXISTS solo es compatible con WP 3.5+ según el Codex.

birgire birgire
13 nov 2014 13:24:34

lo siento, esto no funciona desde la versión 3.3 hasta la 4.0

Xaver Xaver
13 nov 2014 14:39:53

Acabo de probar esto en una instalación limpia de WP 4.0, donde funciona como se espera. ¿Cuál es tu resultado? ¿Cómo se ve la consulta SQL en tu caso?

birgire birgire
13 nov 2014 15:05:07

http://pastebin.com/bLSHErMH ¿cuál es la tuya? (También tengo 'numberposts => 1' pero supongo que eso no importa)

Xaver Xaver
13 nov 2014 15:15:13

sí, obtuve la misma consulta SQL, aparte del límite. ¿Tienes espacios adicionales en tus valores meta? ¿No obtienes ningún resultado? ¿Es correcto tu tipo de post? ¿Estás probando esto en WP 4.0?

birgire birgire
13 nov 2014 15:31:16

no, paso los argumentos a la función get_posts. Haré algunas pruebas y te mantendré informado. ¡Gracias de antemano!

Xaver Xaver
13 nov 2014 16:01:41

He actualizado mis preguntas con una posible solución pero tiene algunas contrapartidas

Xaver Xaver
13 nov 2014 16:17:50

Extraño, no estoy seguro de por qué no funciona para ti. Asegúrate de que los valores meta guardados no tengan espacios adicionales. En mi instalación limpia de WP 4.0 creé 10 posts. Luego actualicé 3 de ellos con el campo personalizado my_custom_field_ignore, dos de ellos con el valor de 1 y uno solo con el valor de 0. Luego ejecuté la consulta anterior con posts_per_page=10 y obtuve 8 posts en esa consulta. Los posts con valores de campo personalizado iguales a 1 fueron excluidos como se esperaba.

birgire birgire
13 nov 2014 18:58:08

ok, lo verificaré de nuevo - tal vez

Xaver Xaver
13 nov 2014 20:01:56

La publicación que no se mostraba era la publicación "Hello World". Todo funciona bien si agrego el my_custom_field_ignore a esta publicación y luego lo elimino. Aunque es algo extraño.

Xaver Xaver
13 nov 2014 20:31:12

eso es extraño pero me alegra escuchar que lo resolviste ;-)

birgire birgire
13 nov 2014 21:15:09
Mostrar los 7 comentarios restantes
0

debes usar la función serialize en caso de que estés usando enteros:

$args = array(
    'meta_query' => array(
        array(
            'key' => 'my_meta_key',
            'value' => serialize(strval($my_vale)),
            'compare' => 'LIKE'
        )
    )
);
$posts = get_posts( $args );

y ya estás listo,

print_r($posts); 

y ver los resultados

15 jul 2015 16:51:55