Cum să afișezi doar articolele care au câmpul meta_value completat?
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...

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.

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

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)

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

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.

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

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
șiDATETIME
pentru valori meta>=
- funcționează cu tipuri numerice,DATE
șiDATETIME
pentru valori meta<
- funcționează cu tipuri numerice,DATE
șiDATETIME
pentru valori meta<=
- funcționează cu tipuri numerice,DATE
șiDATETIME
pentru valori metaLIKE
- poate funcționa cu un array de valori metaNOT LIKE
- poate funcționa cu un array de valori metaIN
- valoarea meta ar trebui să fie un array de valoriNOT IN
- valoarea meta ar trebui să fie un array de valoriBETWEEN
- funcționează cu tipuri numerice,DATE
șiDATETIME
pentru valori meta, precum și cu un array de valoriNOT BETWEEN
- funcționează cu tipuri numerice,DATE
șiDATETIME
pentru valori meta, precum și cu un array de valoriEXISTS
- nu este nevoie să specificați o valoare meta pentru versiunile WP 3.9 și mai noiNOT EXISTS
- nu este nevoie să specificați o valoare meta pentru versiunile WP 3.9 și mai noiREGEXP
NOT REGEXP
RLIKE

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

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

@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 - Glumești? Da, exact asta face — fiecare postare are câmpul featured_image, doar că nu toate sunt setate. Încarcă toate postările oricum.

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

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

Î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()
.

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

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

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

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

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

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

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',
],
]

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