query_posts() en el valor de una clave, o en la existencia de la clave

7 ene 2011, 05:35:57
Vistas: 752
Votos: 1

Recientemente comencé a usar campos simples en un proyecto para diferenciar entre tipos de posts. Todos los posts a partir de ahora tendrán uno de cuatro posibles valores meta asociados con esto (Historia, Artículo, Video o Caricatura). Ninguno de estos tipos de posts tiene atributos o valores únicos, así que he decidido no usar tipos de posts personalizados esta vez.

Sé cómo consultar posts con un cierto valor meta, pero esto solo funciona en posts que ya tienen esa meta clave asociada con ellos - no para posts que fueron creados antes de que el plugin de campos simples fuera instalado y puesto en uso. Me pregunto cómo consultaría todos los posts que carecen de la meta clave "fizzbuzz" o tienen la clave pero está asociada con un valor de "foobar".

¿Hay alguna manera de consultar todos los posts que carecen de una clave por completo?

0
Todas las respuestas a la pregunta 1
5

Esto te dará todo lo que no tenga la meta clave fizzbizz. La parte del bucle personalizado la tomé directamente del codex.

$pageposts = $wpdb->get_results("
    SELECT * FROM wp_posts p 
    LEFT JOIN wp_postmeta m 
    ON p.ID = m.post_id 
    WHERE m.meta_key <> 'fizzbizz'
    OR m.metakey IS NULL
    ORDER BY p.post_date DESC;
");

if ($pageposts):
    global $post;
    foreach ($pageposts as $post): 
    setup_postdata($post);
// ahora estás en el bucle, usa the_title() o lo que necesites

Esto obtendrá todo donde exista la clave, pero el valor sea 'foobar'

$pageposts = $wpdb->get_results("
    SELECT * FROM wp_posts p 
    JOIN wp_postmeta m 
    ON p.ID = m.post_id 
    WHERE m.meta_key = 'fizzbizz' 
    AND m.meta_value = 'foobar' 
    ORDER BY p.post_date DESC;
");

Y ese último es complicado, no estoy muy seguro de ese...

Edición

Corregida la primera consulta gracias a esta pregunta.

7 ene 2011 05:51:49
Comentarios

La segunda consulta debería funcionar, pero puedes hacer lo mismo mejor usando las funciones de la API de WP. La primera consulta no me parece que funcione. Parece que solo obtendrá publicaciones que tengan claves meta establecidas (porque de lo contrario, no estarían incluidas en el JOIN).

goldenapples goldenapples
7 ene 2011 09:50:46

@golden Buen punto sobre la primera. Supongo que para escribir esa correctamente, primero necesitaría haber una forma de consultar publicaciones que carezcan de cualquier clave. ¿Tienes alguna idea sobre esa?

JakeParis JakeParis
7 ene 2011 17:41:18

@golden arreglé la primera consulta.

JakeParis JakeParis
7 ene 2011 19:11:28

¡Genial! Nunca entendí el LEFT JOIN, así que no tenía idea de cómo hacer eso (y créeme, ¡lo he necesitado!) Ahora lo único que queda es averiguar cómo usar esa sintaxis dentro de los métodos de la API de WP. Es decir, la segunda consulta podría escribirse simplemente como get_posts('meta_key=fizzbizz&meta_value=foobar'); Creo que consultar por la ausencia de una meta clave requiere filtros especiales en 'posts_join' y 'posts_where'... ¿alguien tiene una solución simple?

goldenapples goldenapples
7 ene 2011 20:09:46

Creo que también necesitas una cláusula DISTINCT en el SELECT si lo estás haciendo así, de lo contrario obtendrás una publicación particular múltiples veces si tiene múltiples valores meta.

goldenapples goldenapples
7 ene 2011 20:34:01