Como posso mostrar posts apenas se meta_value não estiver vazio

27

Três pessoas já tentaram resolver isso, e estamos chegando a zero. Quero mostrar apenas as postagens que têm um valor na meta_key 'featured_image'.

Então ... se 'featured_image' não estiver vazio, mostre a postagem. Aqui está o 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>

Nós tentamos literalmente todas as combinações que podemos imaginar, as obsoletas meta_ * options, query_posts, get_posts, ao invés de WP_Query ... Nothing. Imprimiu a instrução select, nenhum campo de meta valor está sendo exibido. Existe - para os posts (para cada post) e existe no banco de dados.

Já vimos todos os posts sobre o assunto no momento, incluindo:

query_posts e só mostrará resultados se um campo personalizado não estiver vazio

enlace

Zilch. Por favor ajude ...

    
por robalan 02.03.2011 / 06:56
fonte

7 respostas

6

Oi @Rob:

O motivo pelo qual você não consegue descobrir como fazer isso é porque não é possível, pelo menos não sem recorrer ao SQL. Tente adicionar o seguinte ao arquivo functions.php do seu 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;
}

Se você tiver campos personalizados 'featured_image' com valores vazios, os filtros acima serão filtrados. Se o problema for outra coisa, teremos que ver como são seus dados para resolvê-lo.

Uma coisa que eu estou curioso sobre; Como você obteve valores vazios para 'featured_image' ? A interface administrativa do WordPress 3.1 faz o possível para evitar que você insira valores vazios. Espero que isso ajude.

    
por MikeSchinkel 02.03.2011 / 07:05
fonte
49

Isso parece funcionar para inserir o valor na consulta, mas não sabe se ele obtém resultados válidos.

'meta_query' => array(
    array(
        'key' => 'some_key',
        'value'   => array(''),
        'compare' => 'NOT IN'
    )
)

Não tive tempo de criar campos para testar os resultados, mas observei as consultas com as quais trabalhei hoje e observei que NOT IN ficará feliz em usar uma matriz vazia.

    
por t31os 04.03.2011 / 01:20
fonte
3

Isso é corrigido no WP 3.2-alpha:

enlace

    
por scribu 03.03.2011 / 01:43
fonte
3

Estou sentindo falta de algo?

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

?>

Não vai fazer isso?

    
por Infinity Media 24.01.2014 / 22:47
fonte
3

Esta é a consulta que funcionou para mim. Muito semelhante à comparação na resposta do t31os de 2011, mas como a meta key / value é apenas uma simples cadeia de texto, ela não precisa ser uma 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 alguma razão, usando 'meta_value' = > '' e 'meta_compare' = > '! =' ou 'meta_compare' = > 'NOT LIKE' ainda puxou todas as postagens para mim, mas provavelmente tem algo a ver com o fato de que eu criei meu meta valor usando o plugin Advanced Custom Fields (ACF).

Leia mais sobre parâmetros de campo personalizados no códice .

    
por Tessa 10.01.2018 / 15:03
fonte
3

Esta é uma pergunta antiga, mas parece que o Wordpress corrigiu esse "recurso ausente": agora, de acordo com Wordpress Codex é possível verificar a existência (ou não-existência) da chave meta, como esta

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

Está disponível a partir de WP > = 3.5.

    
por Erenor Paz 06.12.2017 / 18:18
fonte
-3
!has_featured_image();

um liner ftw.

    
por tom 30.01.2012 / 12:39
fonte