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

36

Três pessoas já tentaram resolver isso, e estamos chegando a zero. Quero mostrar apenas postagens que tenham 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>

Tentamos literalmente todas as combinações em que podemos pensar, as opções meta_ * obsoletas, query_posts, get_posts, em vez de WP_Query ... Nada. Imprimiu a instrução select, nenhum campo de meta-valor está sendo exibido. Existe - para as postagens (para todas as postagens) e existe no banco de dados.

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

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

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

Zilch. Por favor ajude...

robalan
fonte
Qual versão do WordPress você está usando?
21811 MikeSchinkel #
@ MikeSchinkel - Desculpe Mike, não vi isso - é 3.1.
Robalan #
WP 3.5 corrige esse problema e permite que você use um método de comparar diferentes
Erenor Paz

Respostas:

6

Olá @Rob:

A razão pela 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 functions.phparquivo 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 'featured_image'campos personalizados com valores vazios, os filtros acima serão filtrados. Se o seu problema for outra coisa, teremos que ver como são os seus dados para resolvê-los.

Uma coisa que me interessa; como você conseguiu valores vazios 'featured_image'? A UI do administrador no WordPress 3.1 faz o possível para impedir que você insira valores vazios. Espero que isto ajude.

MikeSchinkel
fonte
Graças a Deus ... então não somos apenas nós. É bom saber, suponho. Obrigado @ MikeSchinkel - Eles realmente devem colocar isso no códice ... Ansioso pela explicação. Obrigado!!
Robalan #
@ Rob - Então, eu estava saindo do meu conhecimento de 3.0 e agora estou testando-o no 3.1 e ele parece funcionar. Tenho duas postagens e uma com um featured_imagecampo personalizado, e sua consulta funciona bem. O que você está achando? Existe uma chance de sua consulta estar carregando postagens que possuem um featured_imagecampo personalizado, mas onde o valor desse campo está vazio?
21811 MikeSchinkel #
@MikeSchinkel - Sem brincadeira? Sim, é exatamente isso o que está fazendo - todas as postagens têm o campo featured_image, elas nem sempre estão definidas. Está carregando todas as postagens de qualquer maneira.
Robalan #
@Rob - Veja minha resposta atualizada.
MikeSchinkel
@MikeSchinkel - Obrigado! Parece estar funcionando perfeitamente, depois de definir o post_type na consulta também. Os valores vazios são propositais - nem todas as postagens têm essa imagem em destaque (e eu sei sobre a miniatura da postagem, não é apenas uma boa opção para este site). Muito obrigado!
Robalan #
57

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

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

Não tive tempo para criar campos para testar os resultados, mas tenho assistido a consultas com as quais trabalhei hoje e percebi NOT INque, felizmente, terá uma matriz vazia.

t31os
fonte
Eu sei que essa é uma resposta antiga, mas para aqueles que tentam usar esse método, ele funciona com em 'compare' => 'NOT LIKE'vez de 'NOT IN'#
handsofaten
3
Certamente mais eficiente de usar! = Em vez de não gostar ou não gostar. Mesmo que wordpress.stackexchange.com/a/10286/32863 (que é sobre teclas de meta, mas mesmo princípio)
Adam
5
Solução ainda mais limpa: como Adam já declarou. É usar: 'value' => '', 'compare' => '!='
Martijn van Hoof
Se você precisa verificar para se certificar de que não é um array vazio ...'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'
StephanieQ
10

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

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

Está disponível no WP> = 3.5.

Erenor Paz
fonte
EXISTSmostrará valores vazios que não é o que procuramos aqui. A melhor solução é 'value' => '', 'compare' => '!=' tanto quanto meus testes.
Ben
1
@ Ben Isso é exatamente o que o OP tentou, mas sem sucesso, ao que parece. Eu adicionei minha solução para garantir que as pessoas que pesquisam um método para recuperar postagens com base na existência de meta_key possam encontrá-lo. Como o valor de uma meta pode ser "algo", "vazio" ou "nulo" (caso a meta não exista), provavelmente a melhor solução seria mesclar as duas opções com uma relação "AND"
Erenor Paz
4

Esta é a consulta que funcionou para mim. Muito semelhante à comparação na resposta do t31os de 2011, mas como a meta-chave / valor é apenas uma string de texto simples, ela não precisa ser uma matriz de 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 qualquer motivo, usar 'meta_value' => '' e 'meta_compare' => '! =' Ou 'meta_compare' => 'NOT LIKE' ainda atrai todas as postagens para mim, mas provavelmente tem algo a ver com o fato de que Criei meu meta-valor usando o plug-in Advanced Custom Fields (ACF).

Leia mais sobre parâmetros de campo personalizados no codex .

Tessa
fonte
3

Estou esquecendo de algo?

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

?>

Isso não fará?

Infinity Media
fonte
Edit: from the codex: $query = new WP_Query( 'meta_key=featured_image' ); veja aqui: codex.wordpress.org/Class_Reference/…
Infinity Media
Primeiro, você sempre pode editar uma pergunta ou resposta em vez de adicionar um comentário. Segundo: Não use respostas erradas em vez de comentários.
Kaiser
Se você tiver uma nova pergunta, faça-o clicando no botão Fazer pergunta . Inclua um link para esta pergunta se ela ajudar a fornecer contexto.
Kaiser
@ Kaiser - parece-me que ele estava respondendo. Ele não está perguntando se seu código é válido, mas suponho que responda sarcasticamente à pergunta com o que ele acredita que funcionará.
Nathan
@ Nathan É para isso que servem os comentários.
Kaiser #
-3
!has_featured_image();

um forro ftw.

tom
fonte