Как отображать только сообщения, поле мета-значения которых не является пустым?


Три человека уже пытались решить эту проблему, и мы приближаемся к нулю. Я хочу показывать только сообщения, которые имеют значение в мета_ключе "featured_image".

Итак... если "featured_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_*, query_posts, get_posts вместо WP_Query... Ничего. Распечатал инструкцию select, поле мета-значения не отображается. Он существует - для сообщений (для каждого сообщения), и оно существует в бд.

Мы видели все публикации на эту тему прямо сейчас, включая следующие:

Query_posts и показывать результаты только в том случае, если пользовательское поле не пустое

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

Пшик. Пожалуйста, помогите...

Author: Jesse Nickles, 2011-03-02

8 answers

Привет @Роб:

Причина, по которой вы не можете понять, как это сделать, заключается в том, что это невозможно, по крайней мере, не прибегая к 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 делает все возможное, чтобы вы не вводили пустые значения. Надеюсь, это поможет.

 6
Author: MikeSchinkel, 2011-03-02 07:48:31

Похоже, это работает для ввода значения в запрос, хотя я не уверен, что он выдает правильные результаты..

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

Не успел создать поля для проверки результатов, но я наблюдал за запросами, с которыми работал сегодня, и заметил, что NOT IN с радостью примет пустой массив.

 60
Author: t31os, 2011-03-04 00:20:02

Это старый вопрос, но, похоже, Wordpress исправил эту "недостающую функцию": теперь, согласно Кодексу Wordpress, можно проверить наличие (или отсутствие) мета-ключа, как это

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

Это доступно по состоянию на WP>=3.5.

 18
Author: Erenor Paz, 2019-02-26 08:40:57

Это запрос, который сработал для меня. Очень похоже на сравнение в ответе t31os от 2011 года, но поскольку мета-ключ/значение - это просто текстовая строка, она не обязательно должна быть массивом 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'
);

По какой-либо причине, используя 'meta_value'=>" и 'meta_compare' => '!=' или 'meta_compare'=>'НЕ НРАВИТСЯ' все равно вытащил все сообщения для меня, но, вероятно, это как-то связано с тем, что я создал свое мета-значение, используя расширенный Плагин пользовательских полей (ACF).

Подробнее о параметрах настраиваемых полей читайте в кодексе.

 7
Author: Tessa, 2018-01-10 14:03:35

Это исправлено в WP 3.2-альфа:

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

 3
Author: scribu, 2011-04-25 11:13:54

Я что-то упускаю?

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

?>

Разве это не поможет?

 3
Author: Infinity Media, 2014-01-24 21:47:40

Если вы хотите, чтобы мета-значение существовало и имело какое-то значение, отличное от пустой строки:

      'meta_query' => [
        'relation' => 'AND',
        [
          'key' => 'some_key',
          'compare' => 'EXISTS',
        ],
        [
          'key' => 'some_key',
          'compare' => '!=',
          'value' => ''
        ]
      ]
 3
Author: Mrexample, 2020-09-08 14:29:16
!has_featured_image();

Один лайнер ftw.

 -3
Author: tom, 2012-11-05 01:34:45