¿Cómo mostrar solo las entradas cuyo campo meta_value no está vacío?

2 mar 2011, 07:56:19
Vistas: 116K
Votos: 51

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...

3
Comentarios

¿Qué versión de WordPress estás usando?

MikeSchinkel MikeSchinkel
2 mar 2011 08:09:02

@MikeSchinkel - Lo siento Mike, no vi esto — Es la 3.1.

robalan robalan
2 mar 2011 08:32:02

WP 3.5 soluciona este problema y te permite usar un método de comparación diferente

Erenor Paz Erenor Paz
6 dic 2017 19:19:06
Todas las respuestas a la pregunta 10
4
65

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.

4 mar 2011 02:20:02
Comentarios

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

handsofaten handsofaten
11 jul 2012 20:10:59

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)

Adam Adam
9 sept 2015 22:22:37

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

Martijn van Hoof Martijn van Hoof
20 abr 2018 11:32:16

Si necesitas verificar que no sea un array vacío... 'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'

StephanieQ StephanieQ
14 ago 2018 19:39:53
2
27

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.

6 dic 2017 19:18:27
Comentarios

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 Ben
9 ago 2019 16:28:59

@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".

Erenor Paz Erenor Paz
9 ago 2019 19:06:24
2
16

Si quieres que el valor meta exista y tenga algún valor diferente a una cadena vacía:

      'meta_query' => [
        'relation' => 'AND',
        [
          'key' => 'some_key',
          'compare' => 'EXISTS',
        ],
        [
          'key' => 'some_key',
          'compare' => '!=',
          'value' => ''
        ]
      ]
8 sept 2020 16:29:51
Comentarios

Esta es la única respuesta 100% correcta según mis pruebas.

alexg alexg
5 ene 2022 16:57:19

Probé todas las soluciones y esta fue la única que funcionó.

Sarathlal N Sarathlal N
1 ago 2022 05:13:59
0

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 y DATETIME
  • >= - funciona con tipos de valores meta numéricos, DATE y DATETIME
  • < - funciona con tipos de valores meta numéricos, DATE y DATETIME
  • <= - funciona con tipos de valores meta numéricos, DATE y DATETIME
  • LIKE - puede funcionar con un array de valores meta
  • NOT LIKE - puede funcionar con un array de valores meta
  • IN - el valor meta debe ser un array de valores
  • NOT IN - el valor meta debe ser un array de valores
  • BETWEEN - funciona con tipos de valores meta numéricos, DATE, DATETIME así como con un array de valores
  • NOT BETWEEN - funciona con tipos de valores meta numéricos, DATE, DATETIME así como con un array de valores
  • EXISTS - no es necesario especificar un valor meta para versiones de WP 3.9 y superiores
  • NOT EXISTS - no es necesario especificar un valor meta para versiones de WP 3.9 y superiores
  • REGEXP
  • NOT REGEXP
  • RLIKE
10 ene 2018 16:03:35
8

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.

2 mar 2011 08:05:21
Comentarios

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!

robalan robalan
2 mar 2011 08:10:38

@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 MikeSchinkel
2 mar 2011 08:45:43

@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.

robalan robalan
2 mar 2011 09:20:39

@Rob - Mira mi respuesta actualizada.

MikeSchinkel MikeSchinkel
2 mar 2011 09:48:58

@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!

robalan robalan
2 mar 2011 17:14:10

@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?

robalan robalan
2 mar 2011 18:18:57

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().

Dougal Campbell Dougal Campbell
2 mar 2011 19:05:04

¿Ese código revisa TODOS los campos personalizados para ver si ALGUNO de ellos está vacío? ¿Qué pasa si quiero que la consulta solo revise un campo especial y verifique si ese está vacío sin importar los demás?

Jens Törnell Jens Törnell
31 may 2011 19:28:11
Mostrar los 3 comentarios restantes
8

¿Me estoy perdiendo algo?

<?php 
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => -1,
        'meta_key' => "featured_image"
    );
    $the_query = new WP_Query( $args ); 

?>

¿No funcionaría eso?

24 ene 2014 23:47:40
Comentarios

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

Infinity Media Infinity Media
24 ene 2014 23:50:32

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

kaiser kaiser
25 ene 2014 02:05:46

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 kaiser
25 ene 2014 02:05:56

@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á.

Nathan Nathan
5 sept 2016 07:19:14

@Nathan Para eso están los comentarios.

kaiser kaiser
5 sept 2016 10:42:03

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

Nathan Nathan
5 sept 2016 18:16:23

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

kaiser kaiser
5 sept 2016 19:47:48

Había un error en WordPress pero ahora está corregido. Esta es la forma correcta de hacerlo.

Ryan Taylor Ryan Taylor
4 dic 2016 04:19:16
Mostrar los 3 comentarios restantes
0

Esto está corregido en WP 3.2-alpha:

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

3 mar 2011 02:43:05
1

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',
        ],
     
      ]
11 ago 2021 13:13:42
Comentarios

No encuentro la documentación para 'EMPTY' y 'NOT EMPTY'. ¿Tienes un enlace a ella?

Pikamander2 Pikamander2
23 jul 2022 12:40:10
0

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 :-)

7 ene 2022 21:23:30
0
-4
!has_featured_image();

una sola línea por la victoria.

30 ene 2012 13:39:09