meta_query para claves que aún no están configuradas

8

Estoy tratando de consultar un tipo de publicación personalizada para un sistema de galería. Tengo una casilla de verificación para establecer una galería como galería "destacada" (configurada a través del complemento Más campos): si está marcada, el valor meta se convierte en 1 y, si no está marcado, se convierte en 0. Todo bien. Sin embargo, si la casilla nunca ha sido marcada, la meta clave nunca se crea, lo que significa que no puedo consultar NOT LIKE 1 porque no existe.

La consulta que quiero es extraer 4 galerías que no están marcadas como '1' en este metavalor, pero también aquellas que no tienen este valor en absoluto. ¿Hay alguna forma de dar siempre a las publicaciones recién agregadas un valor predeterminado para esta metaclave (es decir, siempre haga que sean 0 de forma predeterminada si no se marca la casilla) o hay una forma de consultar la clave que aún no se ha configurado?

Mi consulta actual es:

$args = array(
                        'post_type' => 'gallery',
                        'showposts' => 4,
                        'meta_key' => 'gal-ID',
                        'order_by' => 'meta_value',
                        'order' => 'ASC',
                        'meta_query' => array( array(
                                            'key' => 'main-gal',
                                            'value' => false,
                                        ) ),
                        ) );

Y he intentado varios intentos con 'compare' => 'NOT LIKE', '! =' Etc. etc.

¿Algunas ideas? Este boleto parece implicar que es algo que debe resolverse:

http://core.trac.wordpress.org/ticket/18158

¡Gracias!

parques artísticos
fuente

Respuestas:

7

Esa función masiva daba un poco de miedo, conseguí que funcionara así, con dos argumentos (que excluyen las características)

$args = array(

    'meta_query' => array(
        'relation' => 'OR',
            array( // new and edited posts
                'key' => 'Set as Featured Post',
                'compare' => '!=',
                'value' => 1
            ),

            array( // get old posts w/out custom field
                'key' => 'Set as Featured Post',
                'value' => '1',
                'compare' => 'NOT EXISTS'
            ) 
        ),
    'posts_per_page' => 30

);
ArleyM
fuente
Mi primera matriz está anulando mi segunda con esta solución. Parece que tal vez no puedes hacer una doble consulta en el mismo campo.
Allen Gingrich el
3

Según los parámetros de campo personalizados en el Codex, hay una NOT EXISTScomparación especial disponible desde WP versión 3.5

Técnicamente, produce algo como seguir una consulta SQL en solicitudes de publicaciones:

$posts = get_posts( array(
    'meta_query' => array(
        array(
            'key'     => 'wrong',
            'compare' => 'NOT EXISTS',
        ),
    ),
) );
SELECT *,wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'wrong')
WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.post_id IS NULL)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 5

Funciona uniendo la tabla meta en la clave proporcionada y solo seleccionando registros donde eso no haya resultado en datos significativos ( IS NULL). Por lo tanto, funciona solo para el caso en que la clave no existe en absoluto y no funcionará para las claves que existen con valores falsos .

Rarst
fuente
Estoy intrigado por esta NOT EXISTScomparación. Como solución alternativa para las teclas meta no establecidas, solo guardo un 0 en el save_postgancho si la tecla meta no está configurada. Como NOT EXISTSfunciona ¿Ordenará la consulta del OP main-galy luego completará el 4 con las publicaciones que no tienen ese meta?
helgatheviking
@helgatheviking He explicado la mecánica en respuesta
Rarst el
2

Como señaló el ticket, no es compatible ... hasta entonces, tendrá que confiar en una solución personalizada.

Algunos usuarios han pedido esto antes, o al menos preguntaron cómo hacerlo en los foros de WordPress.org, así que escribí una función para hacer el trabajo que nunca tuve (pegar), afortunadamente encontré el tema original donde proporcioné el enlace pastebin (que no debería caducar).

http://pastebin.com/kgLt1RrG

Escribí eso hace 8 meses y no lo he probado (desde entonces), así que avíseme de cualquier problema.

Espero que ayude..

t31os
fuente
Genial, gracias por esto, lo probaré más tarde esta noche y le informaremos qué sucede.
artparks
1

El método más simple, aunque no el más limpio:

$args = array(
    'post_type' => 'gallery',
    'posts_per_page' => -1,
    'meta_key' => 'gal-ID',
    'order_by' => 'meta_value',
    'order' => 'ASC',
    'meta_key' => 'main-gal',
    ) );

Esto le dará todas sus galerías ordenadas por la meta clave. El siguiente paso es averiguar si las galerías con el valor 1 vienen después o antes de las otras publicaciones. De esta manera puedes:

  • Procese los elementos hasta que haya procesado 4 elementos de la galería o alcanzado una publicación con un metavalor de 1
  • Omita las publicaciones con un valor meta 1 y luego comience a procesar cuando llegue al primer valor que no sea 1

Otros métodos que no requieren una instrucción SQL personalizada:

  • Haciendo una consulta para encontrar las galerías que no desea, utilizándola para llenar una matriz de ID de publicaciones, luego haciendo una segunda consulta, pasando esa matriz como publicaciones para excluir
  • Usar una taxonomía en lugar de campos personalizados (resuelve esto bastante bien y pone muchas otras mejoras agradables de forma gratuita, por lo que también le ahorra tiempo)
Tom J Nowell
fuente