Jak mogę wyświetlać posty tylko wtedy, gdy meta_value nie jest pusta

36

Trzy osoby próbowały już rozwiązać ten problem, a my zbliżamy się do zera. Chcę pokazywać tylko posty, które mają wartość w meta_key „featured_image”.

Więc ... jeśli 'featured_image' nie jest pusty, pokaż post. Oto kod:

      <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>

Wypróbowaliśmy dosłownie każdą kombinację, jaką możemy wymyślić, przestarzałe opcje meta_ *, query_posts, get_posts, zamiast WP_Query ... Nic. Wydrukowano instrukcję select, nie wyświetla się żadne pole wartości meta. Istnieje - dla postów (dla każdego postu) i istnieje w bazie danych.

W tej chwili widzieliśmy każdy post na ten temat, w tym:

query_posts i wyświetlaj wyniki tylko wtedy, gdy niestandardowe pole nie jest puste

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

Zilch. Proszę pomóż...

robalan
źródło
Z jakiej wersji WordPress korzystasz?
MikeSchinkel
@MikeSchinkel - Przepraszam Mike, nie widziałem tego - to 3.1.
robalan
WP 3.5 rozwiązuje ten problem i pozwala użyć innej metody porównywania
Erenor Paz,

Odpowiedzi:

6

Cześć @Rob:

Nie możesz dowiedzieć się, jak to zrobić, ponieważ nie jest to możliwe, przynajmniej nie bez użycia SQL. Spróbuj dodać następujące elementy do functions.phppliku motywu :

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;
}

Jeśli masz 'featured_image'pola niestandardowe z pustymi wartościami, powyższe je odfiltruje. Jeśli Twoim problemem jest coś innego, będziemy musieli zobaczyć, jak wyglądają Twoje dane, aby go rozwiązać.

Jedno mnie ciekawi; skąd masz puste wartości 'featured_image'? Interfejs administratora w WordPress 3.1 robi wszystko, aby nie wprowadzać pustych wartości. Mam nadzieję że to pomoże.

MikeSchinkel
źródło
Dzięki Bogu ... więc to nie tylko my. To chyba dobrze wiedzieć. Dziękuję @MikeSchinkel - Naprawdę powinni umieścić to w kodeksie ... Czekamy na wyjaśnienia. Dzięki!!
robalan
@Rob - Odszedłem od wiedzy 3.0, a teraz testuję ją w wersji 3.1 i wydaje się, że działa. Mam dwa posty i jeden z featured_imageniestandardowym polem, a twoje zapytanie działa dobrze. Co znajdujesz Czy istnieje szansa, że ​​zapytanie ładuje posty, które mają featured_imageniestandardowe pole, ale gdzie wartość tego pola jest pusta?
MikeSchinkel
@MikeSchinkel - Nie żartujesz? Tak, właśnie to robi - każdy post ma pole featured_image, po prostu nie wszystkie są ustawione. W każdym razie ładuje wszystkie posty.
robalan
@Rob - Zobacz moją zaktualizowaną odpowiedź.
MikeSchinkel
@MikeSchinkel - Dziękujemy! Wygląda na to, że działa idealnie, po ustawieniu typu post_type również w zapytaniu. Puste wartości są celowe - nie każdy post ma ten wyróżniony obraz (a wiem o miniaturze postu, to po prostu nie jest dobra opcja dla tej witryny). Dzięki wielkie!
robalan
57

Wydaje się, że działa to na uzyskanie wartości w zapytaniu, ale nie jestem pewien, czy pobiera prawidłowe wyniki.

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

Nie miałem czasu na tworzenie pól do testowania wyników, ale obserwowałem zapytania, z którymi pracowałem dzisiaj i zauważyłem, NOT INże z radością wezmę pustą tablicę.

t31os
źródło
Wiem, że to stara odpowiedź, ale dla tych, którzy wypróbowują tę metodę, działa 'compare' => 'NOT LIKE'zamiast 'NOT IN
handsofaten
3
Z pewnością bardziej wydajny w użyciu! = Zamiast nie w lub nie. To samo, co wordpress.stackexchange.com/a/10286/32863 (chodzi o meta-klucze, ale ta sama zasada)
Adam
5
Jeszcze czystsze rozwiązanie: jak już stwierdził Adam. Ma użyć: 'value' => '', 'compare' => '!='
Martijn van Hoof
Jeśli musisz sprawdzić, czy nie jest to pusta tablica ...'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'
StephanieQ
10

To stare pytanie, ale wydaje się, że Wordpress naprawił tę „brakującą funkcję”: teraz, zgodnie z Wordpress Codex, możliwe jest sprawdzenie istnienia (lub nieistnienia) meta-klucza, takiego jak ten

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

Jest dostępny od WP> = 3.5.

Erenor Paz
źródło
EXISTSpokaże puste wartości, których tu nie szukamy. Najlepszym rozwiązaniem jest 'value' => '', 'compare' => '!=' moje testowanie.
Ben
1
@Ben Właśnie tego próbował OP, ale wydaje się, że bez powodzenia. Dodałem swoje rozwiązanie, aby upewnić się, że ludzie przechodzący szukają metody pobierania postów na podstawie istnienia meta_key mogą go znaleźć. Ponieważ wartością meta może być „coś”, „pusty” lub „null” (w przypadku, gdy meta nie istnieje), prawdopodobnie najlepszym rozwiązaniem byłoby połączenie dwóch opcji ze stosunkiem „ORAZ”
Erenor Paz
4

To zapytanie działało dla mnie. Bardzo podobny do porównania w odpowiedzi t31os z 2011 roku, ale ponieważ meta klucz / wartość jest tylko prostym ciągiem tekstowym, nie musi to być tablica 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'
);

Z jakiegokolwiek powodu użycie „meta_value” => ” i „ meta_compare '=>'! = ' Lub „meta_compare' =>„ NOT LIKE ” nadal ściągało za mnie wszystkie posty, ale prawdopodobnie ma to coś wspólnego z faktem, że Utworzyłem moją wartość meta przy użyciu wtyczki Advanced Custom Fields (ACF).

Przeczytaj więcej o niestandardowych parametrach pola w kodeksie .

Tessa
źródło
3

Coś mi brakuje?

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

?>

Czy to nie zrobi tego?

Infinity Media
źródło
Edycja: z kodeksu: $query = new WP_Query( 'meta_key=featured_image' ); spójrz tutaj: codex.wordpress.org/Class_Reference/…
Infinity Media
Po pierwsze, zawsze możesz edytować pytanie lub odpowiedź zamiast dodawać komentarz. Po drugie: nie nadużywaj odpowiedzi zamiast komentarzy.
kaiser
Jeśli masz nowe pytanie, zadaj je, klikając przycisk Zadaj pytanie . Dołącz link do tego pytania, jeśli pomaga to w zapewnieniu kontekstu.
kaiser
@kaiser - wydaje mi się, że odpowiadał. Nie pyta, czy jego kod jest prawidłowy, ale przypuszczam, że w pewnym sensie sarkastycznie odpowiada na pytanie, co według niego zadziała.
Nathan
@Nathan Do tego służą komentarze.
kaiser
-3
!has_featured_image();

jedna wkładka ftw.

Tomek
źródło