Как я могу показывать сообщения, только если meta_value не пусто

36

Три человека уже пытались решить эту проблему, и мы приближаемся к нулю. Я хочу показывать только сообщения, которые имеют значение в meta_key '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 ... Ничего. Напечатан оператор выбора, поле мета-значения не отображается. Он существует - для постов (для каждого поста) и существует в БД.

Мы уже видели каждый пост на эту тему, в том числе:

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

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

Шиш. Пожалуйста помоги...

robalan
источник
Какую версию WordPress вы используете?
MikeSchinkel
@MikeSchinkel - Извините, Майк, не видел этого - это 3.1.
Робалан
WP 3.5 исправляет эту проблему и позволяет вам использовать другой метод сравнения
Erenor Paz

Ответы:

6

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

MikeSchinkel
источник
Слава богу ... так что это не только мы. Это хорошо знать, я полагаю. Спасибо @MikeSchinkel - они действительно должны поместить это в кодекс ... Ждем объяснений. Благодарность!!
Робалан
@Rob - Итак, я отказался от своих знаний по 3.0, а теперь я тестирую их в 3.1, и, похоже, это работает. У меня есть два сообщения и одно с featured_imageнастраиваемым полем, и ваш запрос работает нормально. Что ты находишь? Есть ли вероятность, что ваш запрос загружает сообщения, которые имеют featured_imageнастраиваемое поле, но значение этого поля пустое?
MikeSchinkel
@MikeSchinkel - Без шуток? Да, это именно то, что он делает - у каждого поста есть поле featured_image, они просто не все установлены. Он загружает все сообщения в любом случае.
Робалан
@Rob - Смотрите мой обновленный ответ.
MikeSchinkel
@MikeSchinkel - Спасибо! Кажется, что он работает отлично, после установки post_type в запросе. Пустые значения являются целенаправленными - не каждое сообщение имеет это рекомендуемое изображение (и я знаю о миниатюре сообщения, это просто не хороший вариант для этого сайта). Спасибо!
robalan
57

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

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

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

t31os
источник
Я знаю, что это старый ответ, но для тех, кто пробует этот apparoach, он работает 'compare' => 'NOT LIKE'вместо 'NOT IN«
рукопожатие
3
Конечно, более эффективно использовать! = Вместо не в или не нравится. То же, что wordpress.stackexchange.com/a/10286/32863 (то есть мета-ключи, но тот же принцип)
Адам
5
Даже более чистое решение: как сказал Адам. Используется: 'value' => '', 'compare' => '!='
Мартейн ван Хоф
Если вам нужно проверить, чтобы убедиться, что это не пустой массив ...'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'
StephanieQ
10

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

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

Это доступно с WP> = 3.5.

Эренор Пас
источник
EXISTSпокажет пустые значения, что не то, что мы здесь. Лучшее решение - это то, 'value' => '', 'compare' => '!=' что касается моего тестирования.
Бен
1
@Ben Это именно то, что пытался ОП, но, похоже, безуспешно. Я добавил свое решение, чтобы люди, проходящие мимо в поисках метода для извлечения сообщений на основе существования meta_key, могли его найти. Поскольку значение мета может быть «что-то», «пусто» или «ноль» (в случае, если мета не существует), вероятно, лучшим решением будет объединение двух вариантов с отношением «И»
Erenor Paz
4

Это запрос, который работал для меня. Очень похоже на сравнение в ответе 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' => 'NOT LIKE' все же вытащило все сообщения для меня, но, вероятно, это как-то связано с тем, что Я создал мета-значение с помощью плагина Advanced Custom Fields (ACF).

Узнайте больше о параметрах пользовательских полей в кодексе .

Тесса
источник
3

Я что-то пропустил?

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

?>

Разве это не делает это?

Бесконечность Медиа
источник
Редактировать: из кодекса: $query = new WP_Query( 'meta_key=featured_image' ); смотрите здесь: codex.wordpress.org/Class_Reference/…
Infinity Media
Во-первых, вы всегда можете отредактировать вопрос или ответ вместо добавления комментария. Второе: не злоупотребляйте ответами вместо комментариев.
Кайзер
Если у вас есть новый вопрос, задайте его, нажав кнопку « Задать вопрос» . Включите ссылку на этот вопрос, если это помогает обеспечить контекст.
Кайзер
@ Кайзер - мне кажется, что он отвечал. Он не спрашивает, действителен ли его код, но я полагаю, что саркастически отвечаю на вопрос с тем, что, по его мнению, сработает.
Натан
@ Натан Это то, что комментарии для.
Кайзер