如何只显示META_VALUE不为空的帖子?

时间:2011-03-02 作者:robalan

有三个人已经试图解决这个问题,我们的结果是零。我只想显示meta\\u键“featured\\u image”中有值的帖子。

所以如果“featured\\u image”不为空,则显示帖子。代码如下:

      <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>
我们已经尝试了所有我们能想到的组合,不推荐的meta\\u*选项、query\\u posts、get\\u posts,而不是WP\\u query。。。没有什么打印了select语句,未显示任何元值字段。它存在-对于post(每个post),它存在于db中。

我们现在已经看到了每个关于这个主题的帖子,包括:

query_posts and only show results if a custom field is not empty

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

废话。请帮助。。。

10 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@Rob:

您无法弄清楚如何做是因为这是不可能的,至少在不诉诸SQL的情况下是不可能的。尝试将以下内容添加到主题functions.php 文件:

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;
}
如果您有自定义\'featured_image\' 上述值为空的字段将过滤掉它们。如果您的问题是其他问题,我们必须查看您的数据是什么样子才能解决它。

有一件事我很好奇;如何获取的空值\'featured_image\'? WordPress 3.1中的管理UI尽最大努力防止您输入空值。希望这有帮助。

SO网友:t31os

这似乎可以将值放入查询中,但不确定它是否会得到有效的结果。。

\'meta_query\' => array(
    array(
        \'key\' => \'some_key\',
        \'value\'   => array(\'\'),
        \'compare\' => \'NOT IN\'
    )
)
没有时间创建字段来测试结果,但我一直在观察今天处理的查询,并注意到NOT IN 很乐意接受一个空数组。

SO网友:Erenor Paz

这是一个老问题,但Wordpress似乎已经修复了这个“缺失的功能”:现在,根据Wordpress Codex 可以检查元键的存在(或不存在),如下所示

\'meta_query\' => array(
    array(
        \'key\' => \'featured_image\',
        \'compare\' => \'EXISTS\', //or "NOT EXISTS", for non-existance of this key
    )
)
这可从WP>=3.5开始使用。

SO网友:Tessa

这是一个对我有用的问题。与t31os 2011年的答案中的比较非常相似,但由于元键/值只是一个简单的文本字符串,因此不需要是meta\\u查询数组。

$args = array(
    \'posts_per_page\' => 5,//replaced \'showposts\' in version 2.1
    \'meta_key\' => \'featured_image\',
    \'meta_value\' => array(\'\'),
    \'meta_compare\' => \'NOT IN\'
);
无论出于何种原因,使用\'meta_value\' => \'\'\'meta_compare\' => \'!=\'\'meta_compare\' => \'NOT LIKE\' 仍然为我拉了所有帖子,但这可能与我使用高级自定义字段(ACF)插件创建了我的元值有关。

Read more about custom field parameters in the codex.

SO网友:Mrexample

如果您希望元值存在并具有除空字符串以外的其他值,请执行以下操作:

      \'meta_query\' => [
        \'relation\' => \'AND\',
        [
          \'key\' => \'some_key\',
          \'compare\' => \'EXISTS\',
        ],
        [
          \'key\' => \'some_key\',
          \'compare\' => \'!=\',
          \'value\' => \'\'
        ]
      ]

SO网友:scribu

WP 3.2-alpha中对此进行了固定:

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

SO网友:Infinity Media

我错过什么了吗?

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

?>
这样不行吗?

SO网友:Benjamin Vaughan

希望这能有所帮助。您可以始终使用“EMPTY”或“NOT EMPTY”比较器,如下所示:

       \'meta_query\' => [
        \'relation\' => \'AND\',
        [
          \'key\' => \'your_key\',
          \'compare\' => \'NOT EMPTY\',
        ],
     
      ]
将它与我的复选框ACF字段一起使用,它似乎工作得非常好。在我的例子中,我做的与你相反,我查询的一些帖子没有这个元字段的条目,所以我只是添加了NOT EXISTS选项作为第二个比较。

查询不包含元字段或包含空字段的帖子:

 \'meta_query\' => [
        \'relation\' => \'AND\',
        [
          \'key\' => \'your_key\',
          \'compare\' => \'NOT EXIST\',
        ],
        [
          \'key\' => \'your_key\',
          \'compare\' => \'EMPTY\',
        ],
     
      ]

SO网友:john

因此,我在使用ACF&;时特别遇到了这个问题;使用包含多选的字段时,该字段以前已填充,现在为空。

我的问题是:

    \'relation\' => \'AND\',
    array(
       \'key\' => \'field_name\',
       \'compare\' => \'EXISTS\'
    ),    
    array(
      \'key\' => \'field_name\',
      \'value\' => \'\',
      \'compare\' => \'!=\'
    ),
是否返回所有帖子,无论meta是否为空?

因此,我查看字段是否包含双引号:

    \'key\' => \'field_name\',
    \'value\' => \'"\',
    \'compare\' => \'LIKE\'
因为ACF在数组结构中使用双引号来表示存储在DB中的多个选择。

希望这能帮助像我一样陷入同样陷阱的人:-)

SO网友:tom
!has_featured_image();

one liner ftw.

结束

相关推荐