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óż...


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.


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


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.


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 .



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?


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.