Як я можу показувати пости, лише якщо мета-значення не порожнє


36

Троє людей вже намагалися вирішити це, і ми доходимо до нуля. Я хочу показувати лише публікації, які мають значення в мета-ключі "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, не відображається поле мета-значення. Він існує - для публікацій (для кожної публікації) і він існує у db.

Зараз ми бачили кожну публікацію з цієї теми, в тому числі:

query_posts і показувати результати лише в тому випадку, якщо спеціальне поле не порожнє

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

Зільч. Будь ласка, допоможіть...


Яку версію WordPress ви використовуєте?
MikeSchinkel

@MikeSchinkel - Вибачте, Майк, цього не бачив - це 3.1.
robalan

WP 3.5 виправляє цю проблему і дозволяє використовувати інший метод порівняння
Еренор Пас

Відповіді:


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 - Вони дійсно повинні вкласти це в кодекс ... Чекаючи пояснення. Спасибі!!
Робалан

@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, що з радістю займе порожній масив.


Я знаю, що це стара відповідь, але для тих, хто пробує цей аппарох, він працює 'compare' => 'NOT LIKE'замість 'NOT IN'
handsofaten

3
Безумовно, ефективніше використовувати! = Замість того, щоб не робити або не любити. Те саме, що wordpress.stackexchange.com/a/10286/32863 (тобто мета-клавіші, але той самий принцип)
Адам,

5
Ще більш чисте рішення: як це вже заявив Адам. Використовується: 'value' => '', 'compare' => '!='
Martijn van Hoof

Якщо вам потрібно перевірити, щоб переконатися, що це не порожній масив ...'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'
StephanieQ

10

Це старе питання, але, схоже, Wordpress виправив цю "відсутність функції": тепер, згідно Wordpress Codex , можна перевірити наявність (або відсутність) мета-ключа, як це

'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 Це саме те, що спробувала ОП, але без жодного успіху, здається. Я додав своє рішення, щоб переконатися, що люди, які проходять, шукаючи метод для отримання публікацій, заснованих на існуванні мета-ключа, зможуть його знайти. Оскільки значення мета може бути "щось", "порожнє" або "нулеве" (якщо мета не існує), мабуть, найкращим рішенням було б об'єднання двох варіантів із відношенням "І"
Еренор Пац

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' => 'НЕ ПОДОБАЙТЕ', все-таки витягували всі повідомлення для мене, але це, мабуть, має щось спільне з тим, що Я створив свою мета-значення за допомогою плагіну 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

По-перше, ви завжди можете редагувати питання або відповідь замість того, щоб додавати коментар. Друге: Не зловживайте відповідями замість коментарів.
кайзер

Якщо у вас є нове запитання, будь ласка, задайте його, натиснувши кнопку Задати питання . Додайте посилання на це питання, якщо це допомагає надати контекст.
кайзер

@kaiser - мені здається, він відповідав. Він не запитує, чи дійсний його код, але я вважаю, що саркастично відповів на питання тим, що, на його думку, спрацює.
Натан

@Nathan Це те, що стосується коментарів.
кайзер

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.