¿Cómo puedo mostrar publicaciones solo si meta_value no está vacío?


36

Tres personas ya han intentado resolver esto, y estamos llegando a cero. Quiero mostrar solo las publicaciones que tienen un valor en la meta_key 'Featured_image'.

Entonces ... si 'Featured_image' no está vacío, muestra la publicación. 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="" />
            <?php else: ?>
              <img src="<?php bloginfo('template_directory'); ?>/timthumb.php?src=/wp-content/themes/ssv/images/review-default.gif&w=84&h=60" alt="" />
            <?php endif; ?>
            </a>
          </article>
        </li>
      <?php
      endwhile;

      wp_reset_query();
      ?>
      </ul>

Intentamos literalmente todas las combinaciones que podemos imaginar, las opciones obsoletas meta_ *, query_posts, get_posts, en lugar de WP_Query ... Nada. Impreso el enunciado select, no se muestra ningún campo de metavalor. Existe: para las publicaciones (para cada publicación) y existe en la base de datos.

Hemos visto todas las publicaciones sobre el tema en este momento, incluidas estas:

query_posts y solo muestra resultados si un campo personalizado no está vacío

http://scribu.net/wordpress/advanced-metadata-queries.html

Zilch Por favor ayuda...


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

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

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

Respuestas:


6

Hola @Rob:

La razón por la que no puede descubrir cómo hacerlo es porque no es posible, al menos no sin recurrir a SQL. Intente agregar lo siguiente al functions.phparchivo de su 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 tiene 'featured_image'campos personalizados con valores vacíos, lo anterior los filtrará. Si su problema es otra cosa, tendremos que ver cómo se ven sus datos para resolverlo.

Una cosa que me da curiosidad; ¿Cómo obtuviste valores vacíos 'featured_image'? La interfaz de usuario de administrador en WordPress 3.1 hace todo lo posible para evitar que ingrese valores vacíos. Espero que esto ayude.


Gracias a Dios ... así que no somos solo nosotros. Es bueno saberlo, supongo. Gracias @MikeSchinkel - Realmente deberían poner eso en el códice ... Esperando la explicación. ¡¡Gracias!!
robalan

@Rob: estaba dejando mi conocimiento 3.0 y ahora lo estoy probando en 3.1 y parece que funciona. Tengo dos publicaciones y una con un featured_imagecampo personalizado y su consulta funciona bien. Que estas encontrando ¿Existe la posibilidad de que su consulta esté cargando publicaciones que sí tienen un featured_imagecampo personalizado pero donde el valor de ese campo está vacío?
MikeSchinkel

@ MikeSchinkel - ¿No es broma? Sí, eso es exactamente lo que está haciendo: cada publicación tiene el campo Featured_image, simplemente no están todas configuradas. Está cargando todas las publicaciones de todos modos.
robalan

@Rob: vea mi respuesta actualizada.
MikeSchinkel

@ MikeSchinkel - ¡Gracias! Parece que funciona perfectamente, después de configurar el post_type en la consulta también. Los valores vacíos tienen un propósito: no todas las publicaciones tienen esta imagen destacada (y sé sobre la miniatura de la publicación, simplemente no es una buena opción para este sitio). ¡Muchas gracias!
robalan

57

Esto parece funcionar para obtener 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 tuve tiempo de crear campos para probar los resultados, pero he estado viendo consultas con las que he trabajado hoy y noté NOT INque con gusto tomaré una matriz vacía.


Sé que esta es una vieja respuesta, pero para aquellos que prueban esta apariencia, funciona en 'compare' => 'NOT LIKE'lugar de 'NOT IN'
golpeado a mano el

3
Seguramente más eficiente de usar! = En lugar de no en o no me gusta. Igual que wordpress.stackexchange.com/a/10286/32863 (que se trata de meta keys, pero el mismo principio)
Adam

55
Una solución aún más limpia: como ya dijo Adam. Es para usar: 'value' => '', 'compare' => '!='
Martijn van Hoof

Si necesita verificar para asegurarse de que no es una matriz vacía ...'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'
StephanieQ

10

Esta es una vieja pregunta, pero parece que Wordpress ha solucionado esta "característica faltante": ahora, de acuerdo con Wordpress Codex, es posible verificar la existencia (o no existencia) de la meta clave, como esta

'meta_query' => array(
    array(
        'key' => 'featured_image',
        'compare' => 'EXISTS', //or "NOT EXISTS", for non-existance of this key
    )
)

Esto está disponible a partir de WP> = 3.5.


EXISTSmostrará valores vacíos que no es lo que buscamos aquí. La mejor solución es 'value' => '', 'compare' => '!=' en lo que respecta a mis pruebas.
Ben

1
@Ben Eso es exactamente lo que intentó el OP, pero parece que sin éxito. Agregué mi solución para asegurarme de que las personas que pasaban buscando un método para recuperar publicaciones basadas en la existencia de meta_key pudieran 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 fusionar las dos opciones con una relación "Y"
Erenor Paz

4

Esta es la consulta que funcionó para mí. Muy similar a la comparación en la respuesta de t31os de 2011, pero debido a que la meta clave / valor es solo una cadena de texto simple, no necesita ser una matriz meta_query.

$args = array(
    'posts_per_page' => 5,//replaced 'showposts' in version 2.1
    'meta_key' => 'featured_image',
    'meta_value' => array(''),
    'meta_compare' => 'NOT IN'
);

Por alguna razón, el uso de 'meta_value' => '' y 'meta_compare' => '! =' O 'meta_compare' => 'NOT LIKE' todavía me atrajo todas las publicaciones, pero probablemente tenga algo que ver con el hecho de que Creé mi metavalor utilizando el complemento Advanced Custom Fields (ACF).

Lea más sobre los parámetros de campo personalizados en el códice .



3

¿Me estoy perdiendo de algo?

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

?>

¿No lo hará eso?


Editar: desde el códice: $query = new WP_Query( 'meta_key=featured_image' ); mira aquí: codex.wordpress.org/Class_Reference/…
Infinity Media

Primero, siempre puede editar una pregunta o respuesta en lugar de agregar un comentario. Segundo: no use mal las respuestas en lugar de los comentarios.
kaiser

Si tiene una nueva pregunta, hágala haciendo clic en el botón Hacer pregunta . Incluya un enlace a esta pregunta si ayuda a proporcionar contexto.
kaiser

@kaiser: me parece que estaba respondiendo. No pregunta si su código es válido, pero supongo que responde sarcásticamente a la pregunta con lo que él cree que funcionará.
Nathan

@Nathan Para eso están los comentarios.
kaiser

-3
!has_featured_image();

un trazador de líneas por cierto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.