Cum să afișezi doar articolele care au câmpul meta_value completat?

2 mar. 2011, 07:56:19
Vizualizări: 116K
Voturi: 51

Trei persoane au încercat deja să rezolve această problemă și nu am găsit soluția. Vreau să afișez doar articolele care au o valoare în meta_key 'featured_image'.

Deci... dacă 'featured_image' nu este gol, să se afișeze articolul. Iată codul:

      <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="Imagine articol" title="Imagine articol" />
            <?php else: ?>
              <img src="<?php bloginfo('template_directory'); ?>/timthumb.php?src=/wp-content/themes/ssv/images/review-default.gif&w=84&h=60" alt="Imagine implicită" title="Imagine implicită" />
            <?php endif; ?>
            </a>
          </article>
        </li>
      <?php
      endwhile;

      wp_reset_query();
      ?>
      </ul>

Am încercat literal fiecare combinație posibilă, inclusiv opțiunile meta_* depreciate, query_posts, get_posts, în loc de WP_Query... Nimic. Am afișat instrucțiunea select, dar nu apare niciun câmp meta value. Acesta există - pentru articole (pentru fiecare articol) și există în baza de date.

Am văzut toate articolele pe această temă până acum, inclusiv acestea:

query_posts și afișarea rezultatelor doar dacă un câmp personalizat nu este gol

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

Zero rezultate. Vă rugăm să ne ajutați...

3
Comentarii

Ce versiune de WordPress folosești?

MikeSchinkel MikeSchinkel
2 mar. 2011 08:09:02

@MikeSchinkel - Îmi pare rău Mike, nu am văzut acest lucru — Este versiunea 3.1.

robalan robalan
2 mar. 2011 08:32:02

WP 3.5 rezolvă această problemă și îți permite să folosești o metodă diferită de comparație

Erenor Paz Erenor Paz
6 dec. 2017 19:19:06
Toate răspunsurile la întrebare 10
4
65

Aceasta pare să funcționeze pentru a introduce valoarea în interogare, dar nu sunt sigur dacă returnează rezultate valide..

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

Nu am avut timp să creez câmpuri pentru a testa rezultatele, dar am observat interogările la care am lucrat astăzi și am văzut că NOT IN acceptă fără probleme un array gol.

4 mar. 2011 02:20:02
Comentarii

Știu că acesta este un răspuns vechi, dar pentru cei care încearcă această abordare, funcționează cu 'compare' => 'NOT LIKE' în loc de 'NOT IN'

handsofaten handsofaten
11 iul. 2012 20:10:59

Cu siguranță mai eficient este să folosești != în loc de not in sau not like. La fel ca http://wordpress.stackexchange.com/a/10286/32863 (este vorba despre meta keys, dar același principiu)

Adam Adam
9 sept. 2015 22:22:37

Soluție și mai elegantă: după cum a menționat deja Adam. Este să folosești: 'value' => '', 'compare' => '!='

Martijn van Hoof Martijn van Hoof
20 apr. 2018 11:32:16

Dacă trebuie să verificați pentru a vă asigura că nu este un array gol... 'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'

StephanieQ StephanieQ
14 aug. 2018 19:39:53
2
27

Aceasta este o întrebare veche, dar se pare că WordPress a remediat această "lipsă de funcționalitate": acum, conform WordPress Codex, este posibil să verifici existența (sau inexistența) a unei chei meta, astfel:

'meta_query' => array(
    array(
        'key' => 'featured_image',
        'compare' => 'EXISTS', //sau "NOT EXISTS", pentru inexistența acestei chei
    )
)

Această funcționalitate este disponibilă începând cu WordPress >= 3.5.

6 dec. 2017 19:18:27
Comentarii

EXISTS va afișa valori goale, ceea ce nu este ceea ce căutăm aici. Cea mai bună soluție este 'value' => '', 'compare' => '!=' din câte am testat.

Ben Ben
9 aug. 2019 16:28:59

@Ben Exact asta a încercat OP, dar fără succes, se pare. Am adăugat soluția mea pentru a mă asigura că oamenii care trec pe aici în căutarea unei metode pentru a prelua postări bazate pe existența meta_key o pot găsi. Deoarece valoarea unui meta poate fi "ceva", "goală" sau "null" (în cazul în care meta nu există), probabil cea mai bună soluție ar fi să combinăm cele două opțiuni cu o relație "AND"

Erenor Paz Erenor Paz
9 aug. 2019 19:06:24
2
16

Dacă dorești ca valoarea meta să existe și să aibă o valoare diferită de un șir gol:

      'meta_query' => [
        'relation' => 'AND',
        [
          'key' => 'some_key',
          'compare' => 'EXISTS',
        ],
        [
          'key' => 'some_key',
          'compare' => '!=',
          'value' => ''
        ]
      ]
8 sept. 2020 16:29:51
Comentarii

Acesta este singurul răspuns 100% corect conform testelor mele.

alexg alexg
5 ian. 2022 16:57:19

Am încercat toate soluțiile și doar aceasta a funcționat.

Sarathlal N Sarathlal N
1 aug. 2022 05:13:59
0

Aceasta este interogarea care a funcționat pentru mine. Foarte asemănătoare cu comparația din răspunsul lui t31os din 2011, dar deoarece cheia/valoarea meta este doar un simplu șir de text, nu este nevoie să fie un array meta_query.

$args = array(
    'posts_per_page' => 5, // înlocuiește 'showposts' în versiunea 2.1
    'meta_key' => 'featured_image',
    'meta_value' => array(''),
    'meta_compare' => 'NOT IN'
);

Din nu știu ce motiv, folosind 'meta_value' => '' (setat la un șir gol) și 'meta_compare' => '!=' sau 'meta_compare' => 'NOT LIKE' tot mi-a afișat toate articolele, dar probabil are legătură cu faptul că am creat valoarea meta folosind pluginul Advanced Custom Fields (ACF).

Deși folosirea EXISTS poate funcționa, aceasta nu verifică dacă valoarea este goală sau nu, așa că tot va afișa articolele care au câmpul meta chiar dacă valoarea meta este goală sau necompletată.

Citește mai multe despre parametrii câmpurilor personalizate în codex. Valori posibile pentru meta_compare:

  • =
  • !=
  • > - funcționează cu tipuri numerice, DATE și DATETIME pentru valori meta
  • >= - funcționează cu tipuri numerice, DATE și DATETIME pentru valori meta
  • < - funcționează cu tipuri numerice, DATE și DATETIME pentru valori meta
  • <= - funcționează cu tipuri numerice, DATE și DATETIME pentru valori meta
  • LIKE - poate funcționa cu un array de valori meta
  • NOT LIKE - poate funcționa cu un array de valori meta
  • IN - valoarea meta ar trebui să fie un array de valori
  • NOT IN - valoarea meta ar trebui să fie un array de valori
  • BETWEEN - funcționează cu tipuri numerice, DATE și DATETIME pentru valori meta, precum și cu un array de valori
  • NOT BETWEEN - funcționează cu tipuri numerice, DATE și DATETIME pentru valori meta, precum și cu un array de valori
  • EXISTS - nu este nevoie să specificați o valoare meta pentru versiunile WP 3.9 și mai noi
  • NOT EXISTS - nu este nevoie să specificați o valoare meta pentru versiunile WP 3.9 și mai noi
  • REGEXP
  • NOT REGEXP
  • RLIKE
10 ian. 2018 16:03:35
8

Salut @Rob:

Motivul pentru care nu reușești să-ți dai seama cum să faci asta este pentru că nu este posibil, cel puțin nu fără a recurge la SQL. Încearcă să adaugi următoarele în fișierul functions.php al temei tale:

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

Dacă ai câmpuri personalizate 'featured_image' cu valori goale, codul de mai sus le va filtra. Dacă problema ta este altceva, va trebui să vedem cum arată datele tale pentru a o rezolva.

Un lucru care mă intrigă: cum ai ajuns să ai valori goale pentru 'featured_image'? Interfața administrativă din WordPress 3.1 face tot posibilul să te împiedice să introduci valori goale. Sper că te ajută.

2 mar. 2011 08:05:21
Comentarii

Slavă Domnului... deci nu suntem doar noi. E bine de știut, presupun. Mulțumesc @MikeSchinkel - Chiar ar trebui să menționeze asta în codex... Aștept cu nerăbdare explicația. Mulțumesc!!

robalan robalan
2 mar. 2011 08:10:38

@Rob - Deci eu mă bazam pe cunoștințele mele din 3.0 și acum testez în 3.1 și se pare că funcționează. Am două postări și una cu un câmp personalizat featured_image iar interogarea ta funcționează perfect. Ce observi tu? Există vreo posibilitate ca interogarea ta să încarce postări care au câmpul featured_image dar unde valoarea acelui câmp este goală?

MikeSchinkel MikeSchinkel
2 mar. 2011 08:45:43

@MikeSchinkel - Glumești? Da, exact asta face — fiecare postare are câmpul featured_image, doar că nu toate sunt setate. Încarcă toate postările oricum.

robalan robalan
2 mar. 2011 09:20:39

@Rob - Vezi răspunsul meu actualizat.

MikeSchinkel MikeSchinkel
2 mar. 2011 09:48:58

@MikeSchinkel - Mulțumesc! Se pare că funcționează perfect, după ce am setat și post_type în interogare. Valorile goale sunt intenționate - nu toate articolele au această imagine reprezentativă (și știu despre post thumbnail, doar că nu este o opțiune bună pentru acest site). Mulțumesc mult!

robalan robalan
2 mar. 2011 17:14:10

@MikeSchinkel - Recunosc că m-am înșelat - funcționează la interogările la care doream, dar provoacă erori 404 peste tot în rest. Pagini individuale de articole, arhive... :o\ Ai vreo idee?

robalan robalan
2 mar. 2011 18:18:57

În exemplul de cod din întrebarea ta de mai sus, încearcă să plasezi apelul add_filter() chiar înainte de apelul tău WP_Query(), apoi pune remove_filter('posts_where','yoursite_posts_where'); chiar înainte să apelezi wp_reset_query().

Dougal Campbell Dougal Campbell
2 mar. 2011 19:05:04

Acel cod verifică TOATE câmpurile personalizate pentru a vedea dacă ORICARE dintre ele sunt goale? Ce se întâmplă dacă vreau ca interogarea să verifice doar un câmp special și să vadă dacă acesta este gol, indiferent de starea celorlalte?

Jens Törnell Jens Törnell
31 mai 2011 19:28:11
Arată celelalte 3 comentarii
8

Mi-a scăpat ceva?

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

?>

Asta nu ar fi suficient?

24 ian. 2014 23:47:40
Comentarii

Editează: din codex: $query = new WP_Query( 'meta_key=featured_image' ); vezi aici:http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

Infinity Media Infinity Media
24 ian. 2014 23:50:32

În primul rând, poți oricând să [editezi] o întrebare sau un răspuns în loc să adaugi un comentariu. În al doilea rând: Nu folosi greșit răspunsurile în locul comentariilor.

kaiser kaiser
25 ian. 2014 02:05:46

Dacă ai o întrebare nouă, te rugăm să o adresezi făcând clic pe butonul Pune o Întrebare. Include un link către această întrebare dacă ajută la oferirea de context.

kaiser kaiser
25 ian. 2014 02:05:56

@kaiser - mi se pare că el răspundea. Nu întreabă dacă codul său este valid, ci presupun că răspunde într-un fel sarcastic la întrebare cu ceea ce crede el că va funcționa.

Nathan Nathan
5 sept. 2016 07:19:14

@Nathan Pentru asta sunt comentariile.

kaiser kaiser
5 sept. 2016 10:42:03

@kaiser, Comentariile sunt pentru a posta răspunsuri și cod? Cum postezi cod într-un comentariu?

Nathan Nathan
5 sept. 2016 18:16:23

@Nathan Mă refeream la partea sarcastică a răspunsului. Codul ar trebui să fie un răspuns – incluzând și o explicație.

kaiser kaiser
5 sept. 2016 19:47:48

Există o eroare în WordPress dar acum este remediată. Acesta este modul corect de a face asta.

Ryan Taylor Ryan Taylor
4 dec. 2016 04:19:16
Arată celelalte 3 comentarii
0

Această problemă a fost rezolvată în WP 3.2-alpha:

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

3 mar. 2011 02:43:05
1

Sper că acest lucru vă poate ajuta. Puteți utiliza întotdeauna comparatorul 'EMPTY' (GOL) sau 'NOT EMPTY' (NU E GOL) în felul următor:

       'meta_query' => [
        'relation' => 'AND',
        [
          'key' => 'your_key',
          'compare' => 'NOT EMPTY',
        ],
     
      ]

Am folosit acest lucru cu unul dintre câmpurile mele checkbox ACF și pare să funcționeze foarte bine. În cazul meu, făceam opusul dumneavoastră și unele dintre postările pe care le interogam nu aveau o intrare pentru acest câmp meta, așa că am adăugat pur și simplu opțiunea NOT EXISTS (NU EXISTĂ) ca a doua comparație.

Interogarea postărilor care fie nu conțineau câmpul meta, fie conțineau un câmp gol:

 'meta_query' => [
        'relation' => 'AND',
        [
          'key' => 'your_key',
          'compare' => 'NOT EXISTS',
        ],
        [
          'key' => 'your_key',
          'compare' => 'EMPTY',
        ],
     
      ]
11 aug. 2021 13:13:42
Comentarii

Nu găsesc documentația pentru 'EMPTY' și 'NOT EMPTY'. Ai vreun link către ea?

Pikamander2 Pikamander2
23 iul. 2022 12:40:10
0

Deci am avut această problemă în special când foloseam ACF și când foloseam un câmp care conținea o selecție multiplă care anterior fusese populată și acum era goală.

Am întâmpinat problema că:

    'relation' => 'AND',
    array(
       'key' => 'field_name',
       'compare' => 'EXISTS'
    ),    
    array(
      'key' => 'field_name',
      'value' => '',
      'compare' => '!='
    ),

Întorcea toate articolele indiferent dacă meta era goală sau nu?

Așa că în schimb am verificat dacă câmpul conținea ghilimele duble:

    'key' => 'field_name',
    'value' => '"',
    'compare' => 'LIKE'

Deoarece ACF folosește ghilimele duble într-o structură de matrice pentru selecțiile multiple stocate în baza de date.

Sper că acest lucru îi va ajuta pe cei care au căzut în aceeași capcană ca mine :-)

7 ian. 2022 21:23:30
0
-4
!has_featured_image();

o linie și gata.

30 ian. 2012 13:39:09