¿Cómo mostrar solo las entradas cuyo campo meta_value no está vacío?
Tres personas ya han intentado resolver esto y no hemos llegado a nada. Quiero mostrar solo las entradas que tienen un valor en el meta_key 'featured_image'.
Entonces... si 'featured_image' no está vacío, mostrar la entrada. Aquí está el código:
<ul>
<?php
$args = array(
'showposts' => 5,
'meta_query' => array(
array(
'key' => 'featured_image',
'value' => '',
'compare' => '!='
)
)
);
$ft_pagination = new WP_Query( $args );
?>
<?php while ($ft_pagination->have_posts()) : $ft_pagination->the_post(); ?>
<?php $ftimage = get_post_meta(get_the_id(), 'featured_image', TRUE); ?>
<li>
<article>
<a href="">
<?php if ($ftimage): ?>
<img src="<?php bloginfo('template_directory'); ?>/timthumb.php?src=<?php echo $ftimage; ?>&w=84&h=60" alt="Imagen destacada" />
<?php else: ?>
<img src="<?php bloginfo('template_directory'); ?>/timthumb.php?src=/wp-content/themes/ssv/images/review-default.gif&w=84&h=60" alt="Imagen por defecto" />
<?php endif; ?>
</a>
</article>
</li>
<?php
endwhile;
wp_reset_query();
?>
</ul>
Hemos probado literalmente todas las combinaciones que se nos ocurren, las opciones meta_* obsoletas, query_posts, get_posts, en lugar de WP_Query... Nada. Imprimimos la declaración select y no se muestra ningún campo meta value. Existe - para las entradas (para cada entrada) y existe en la base de datos.
Hemos visto todas las publicaciones sobre el tema hasta ahora, incluyendo estas:
query_posts y mostrar solo resultados si un campo personalizado no está vacío
http://scribu.net/wordpress/advanced-metadata-queries.html
Nada. Por favor, ayuda...

Esto parece funcionar para introducir el valor en la consulta, aunque no estoy seguro de si obtiene resultados válidos...
'meta_query' => array(
array(
'key' => 'some_key',
'value' => array(''),
'compare' => 'NOT IN'
)
)
No he tenido tiempo de crear campos para probar los resultados, pero he estado observando consultas con las que he trabajado hoy y noté que NOT IN
acepta sin problemas un array vacío.

Sé que esta es una respuesta antigua, pero para aquellos que prueban este enfoque, funciona con 'compare' => 'NOT LIKE'
en lugar de 'NOT IN
'

Seguramente es más eficiente usar != en lugar de not in o not like. Lo mismo que http://wordpress.stackexchange.com/a/10286/32863 (que trata sobre meta keys, pero el mismo principio)

Solución aún más limpia: como Adam ya mencionó. Es usar:
'value' => '',
'compare' => '!='

Esta es una pregunta antigua, pero parece que Wordpress ha solucionado esta "falta de funcionalidad": ahora, según el Códice de Wordpress, es posible verificar la existencia (o no existencia) de la clave meta, de esta manera:
'meta_query' => array(
array(
'key' => 'featured_image',
'compare' => 'EXISTS', //o "NOT EXISTS", para la no existencia de esta clave
)
)
Está disponible desde WP >= 3.5.

EXISTS
mostrará valores vacíos, lo cual no es lo que buscamos aquí. Según mis pruebas, la mejor solución es 'value' => '', 'compare' => '!='
.

@Ben Eso es exactamente lo que intentó el OP, pero parece que sin éxito. Añadí mi solución para asegurarme de que las personas que pasen buscando un método para recuperar publicaciones basadas en la existencia de meta_key puedan encontrarlo. Dado que el valor de un meta puede ser "algo", "vacío" o "nulo" (en caso de que el meta no exista), probablemente la mejor solución sería combinar las dos opciones con una relación "AND".

Esta es la consulta que funcionó para mí. Muy similar a la comparación en la respuesta de t31os de 2011, pero como la clave/valor meta es simplemente una cadena de texto, no necesita ser un array meta_query.
$args = array(
'posts_per_page' => 5, //reemplazó 'showposts' en la versión 2.1
'meta_key' => 'featured_image',
'meta_value' => array(''),
'meta_compare' => 'NOT IN'
);
Por alguna razón, usar 'meta_value' => ''
(establecido como cadena vacía) y 'meta_compare' => '!='
o 'meta_compare' => 'NOT LIKE'
aún me mostraba todas las publicaciones, probablemente tenga que ver con el hecho de que creé mi valor meta usando el plugin Advanced Custom Fields (ACF).
Aunque usar EXISTS
podría funcionar, no verifica si el valor está vacío o no, por lo que aún mostraría publicaciones que tienen el campo meta incluso si el valor meta está en blanco o vacío.
Leer más sobre parámetros de campos personalizados en el codex. Valores posibles para meta_compare
:
=
!=
>
- funciona con tipos de valores meta numéricos,DATE
yDATETIME
>=
- funciona con tipos de valores meta numéricos,DATE
yDATETIME
<
- funciona con tipos de valores meta numéricos,DATE
yDATETIME
<=
- funciona con tipos de valores meta numéricos,DATE
yDATETIME
LIKE
- puede funcionar con un array de valores metaNOT LIKE
- puede funcionar con un array de valores metaIN
- el valor meta debe ser un array de valoresNOT IN
- el valor meta debe ser un array de valoresBETWEEN
- funciona con tipos de valores meta numéricos,DATE
,DATETIME
así como con un array de valoresNOT BETWEEN
- funciona con tipos de valores meta numéricos,DATE
,DATETIME
así como con un array de valoresEXISTS
- no es necesario especificar un valor meta para versiones de WP 3.9 y superioresNOT EXISTS
- no es necesario especificar un valor meta para versiones de WP 3.9 y superioresREGEXP
NOT REGEXP
RLIKE

Hola @Rob:
La razón por la que no puedes descubrir cómo hacerlo es porque no es posible, al menos no sin recurrir a SQL. Intenta agregar lo siguiente al archivo functions.php
de tu tema:
add_filter('posts_where','yoursite_posts_where',10,2);
function yoursite_posts_where($where,$query) {
global $wpdb;
$new_where = " TRIM(IFNULL({$wpdb->postmeta}.meta_value,''))<>'' ";
if (empty($where))
$where = $new_where;
else
$where = "{$where} AND {$new_where}";
return $where;
}
Si tienes campos personalizados 'featured_image'
con valores vacíos, lo anterior los filtrará. Si tu problema es otro, tendremos que ver cómo están tus datos para resolverlo.
Algo que me da curiosidad; ¿cómo obtuviste valores vacíos para 'featured_image'
? La interfaz de administración en WordPress 3.1 hace todo lo posible para evitar que ingreses valores vacíos.
Espero que esto ayude.

Gracias a Dios... así que no somos solo nosotros. Eso es bueno saberlo, supongo. Gracias @MikeSchinkel - Realmente deberían poner eso en el codex... Espero con ansias la explicación. ¡Gracias!

@Rob - Así que estaba basándome en mi conocimiento de la versión 3.0 y ahora lo estoy probando en 3.1 y parece funcionar. Tengo dos publicaciones y una con un campo personalizado featured_image
y tu consulta funciona bien. ¿Qué estás encontrando? ¿Existe la posibilidad de que tu consulta esté cargando publicaciones que tienen el campo personalizado featured_image
pero donde el valor de ese campo está vacío?

@MikeSchinkel - ¿En serio? Sí, eso es exactamente lo que está haciendo: cada publicación tiene el campo featured_image, simplemente no todos están configurados. De todos modos, está cargando todas las publicaciones.

@MikeSchinkel - ¡Gracias! Parece estar funcionando perfectamente, después de establecer también el post_type en la consulta. Los valores vacíos son intencionales — no todas las publicaciones tienen esta imagen destacada (y sé acerca de la miniatura de publicación, simplemente no es una buena opción para este sitio). ¡Muchas gracias!

@MikeSchinkel - Me retracto - funciona en las consultas que quería, pero está causando errores 404 en todas las demás páginas. Páginas de publicaciones individuales, archivos... :o\ ¿Alguna idea?

En el ejemplo de código de tu pregunta anterior, intenta colocar la llamada add_filter()
justo antes de tu llamada a WP_Query()
, luego coloca remove_filter('posts_where','yoursite_posts_where');
justo antes de llamar a wp_reset_query()
.

Edición: del codex: $query = new WP_Query( 'meta_key=featured_image' );
mira aquí:http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

Primero, siempre puedes [editar] una pregunta o respuesta en lugar de agregar un comentario. Segundo: No malutilices las respuestas en lugar de comentarios.

Si tienes una nueva pregunta, por favor hazla clickeando el botón Preguntar. Incluye un enlace a esta pregunta si ayuda a proporcionar contexto.

@kaiser - me parece que él estaba respondiendo. No está preguntando si su código es válido, sino que supongo que está respondiendo sarcásticamente a la pregunta con lo que él cree que funcionará.

@kaiser, ¿Los comentarios son para publicar respuestas y código? ¿Cómo se publica código en un comentario?

@Nathan Me refería a la parte sarcástica de la respuesta. El código debería ser una respuesta – incluyendo alguna explicación.

Esto está corregido en WP 3.2-alpha:

Espero que esto pueda ayudar. Siempre puedes usar los comparadores 'EMPTY' o 'NOT EMPTY' de la siguiente manera:
'meta_query' => [
'relation' => 'AND',
[
'key' => 'your_key',
'compare' => 'NOT EMPTY',
],
]
Esto funciona muy bien con uno de mis campos de checkbox de ACF. En mi caso, estaba haciendo lo opuesto a lo que tú necesitas y algunos de los posts que estaba consultando no tenían una entrada para este campo meta, así que simplemente añadí la opción NOT EXISTS como una segunda comparación.
Consultando posts que no contenían el campo meta o contenían un campo vacío:
'meta_query' => [
'relation' => 'AND',
[
'key' => 'your_key',
'compare' => 'NOT EXISTS',
],
[
'key' => 'your_key',
'compare' => 'EMPTY',
],
]

Así que tuve este problema específicamente cuando usaba ACF y cuando utilizaba un campo que contenía una selección múltiple que previamente había sido poblada y ahora estaba vacía.
Tenía el problema de que:
'relation' => 'AND',
array(
'key' => 'field_name',
'compare' => 'EXISTS'
),
array(
'key' => 'field_name',
'value' => '',
'compare' => '!='
),
¿Estaba devolviendo todas las publicaciones sin importar si el meta estaba vacío o no?
Así que en su lugar busqué ver si el campo contenía comillas dobles:
'key' => 'field_name',
'value' => '"',
'compare' => 'LIKE'
Ya que ACF usa comillas dobles en una estructura de array para selecciones múltiples almacenadas en la base de datos.
Espero que esto ayude a alguien que haya caído en la misma trampa que yo :-)
