Come mostrare solo i post il cui campo meta_value non è vuoto?
Tre persone hanno già provato a risolvere questo problema, senza successo. Voglio mostrare solo i post che hanno un valore nel meta_key 'featured_image'.
Quindi... se 'featured_image' non è vuoto, mostra il post. Ecco il codice:
<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="Immagine in evidenza" />
<?php else: ?>
<img src="<?php bloginfo('template_directory'); ?>/timthumb.php?src=/wp-content/themes/ssv/images/review-default.gif&w=84&h=60" alt="Immagine predefinita" />
<?php endif; ?>
</a>
</article>
</li>
<?php
endwhile;
wp_reset_query();
?>
</ul>
Abbiamo provato letteralmente ogni combinazione possibile, le opzioni meta_* deprecate, query_posts, get_posts, invece di WP_Query... Niente. Abbiamo stampato la query SELECT, ma non viene mostrato alcun campo meta value. Esiste - per i post (per ogni post) ed esiste nel database.
Abbiamo visto tutti i post sull'argomento fino ad ora, inclusi questi:
query_posts e mostra solo risultati se un campo personalizzato non è vuoto
http://scribu.net/wordpress/advanced-metadata-queries.html
Nulla. Per favore aiutate...

Sembra che questo funzioni per inserire il valore nella query, non sono sicuro però se restituisca risultati validi..
'meta_query' => array(
array(
'key' => 'some_key',
'value' => array(''),
'compare' => 'NOT IN'
)
)
Non ho avuto tempo di creare campi per testare i risultati, ma ho osservato le query su cui ho lavorato oggi e ho notato che NOT IN
accetta tranquillamente un array vuoto.

So che questa è una risposta vecchia, ma per chi sta provando questo approccio, funziona con 'compare' => 'NOT LIKE'
invece di 'NOT IN
'

Sicuramente più efficiente usare != invece di not in o not like. Lo stesso di http://wordpress.stackexchange.com/a/10286/32863 (che riguarda le meta key, ma lo stesso principio)

Soluzione ancora più pulita: come Adam ha già detto. È usare:
'value' => '',
'compare' => '!='

Questa è una domanda vecchia, ma sembra che WordPress abbia risolto questa "mancanza": ora, secondo il WordPress Codex è possibile verificare l'esistenza (o la non esistenza) della meta key, in questo modo
'meta_query' => array(
array(
'key' => 'featured_image',
'compare' => 'EXISTS', // oppure "NOT EXISTS", per la non esistenza di questa chiave
)
)
Questa funzionalità è disponibile a partire da WP >= 3.5.

EXISTS
mostrerà valori vuoti, il che non è quello che vogliamo qui. La soluzione migliore, per quanto ho potuto testare, è 'value' => '', 'compare' => '!='
.

@Ben Questo è esattamente quello che ha provato l'OP, ma sembra senza successo. Ho aggiunto la mia soluzione per assicurarmi che le persone che passano di qui cercando un metodo per recuperare post basati sull'esistenza di meta_key possano trovarla. Dato che il valore di un meta può essere "qualcosa", "vuoto" o "null" (nel caso il meta non esista), probabilmente la soluzione migliore sarebbe unire le due opzioni con una relazione "AND".

Questa è la query che ha funzionato per me. Molto simile al confronto nella risposta di t31os del 2011, ma poiché la chiave/valore meta è una semplice stringa di testo, non necessita di essere un array meta_query.
$args = array(
'posts_per_page' => 5,//sostituisce 'showposts' nella versione 2.1
'meta_key' => 'featured_image',
'meta_value' => array(''),
'meta_compare' => 'NOT IN'
);
Per qualche motivo, usando 'meta_value' => ''
(impostato come stringa vuota) e 'meta_compare' => '!='
o 'meta_compare' => 'NOT LIKE'
continuavo a ottenere tutti i post, ma probabilmente ha a che fare con il fatto che ho creato il mio meta valore utilizzando il plugin Advanced Custom Fields (ACF).
Anche se usare EXISTS
potrebbe funzionare, non verifica se il valore è vuoto o meno, quindi continuerebbe a recuperare post che hanno il campo meta anche se il valore meta è vuoto o nullo.
Leggi di più sui parametri dei campi personalizzati nel codex. Valori possibili per meta_compare
:
=
!=
>
- funziona con valori meta numerici,DATE
eDATETIME
>=
- funziona con valori meta numerici,DATE
eDATETIME
<
- funziona con valori meta numerici,DATE
eDATETIME
<=
- funziona con valori meta numerici,DATE
eDATETIME
LIKE
- può funzionare con un array di valori metaNOT LIKE
- può funzionare con un array di valori metaIN
- il meta valore dovrebbe essere un array di valoriNOT IN
- il meta valore dovrebbe essere un array di valoriBETWEEN
- funziona con valori meta numerici,DATE
,DATETIME
e con un array di valoriNOT BETWEEN
- funziona con valori meta numerici,DATE
,DATETIME
e con un array di valoriEXISTS
- non è necessario specificare un meta valore per le versioni di WP 3.9 e superioriNOT EXISTS
- non è necessario specificare un meta valore per le versioni di WP 3.9 e superioriREGEXP
NOT REGEXP
RLIKE

Ciao @Rob:
Il motivo per cui non riesci a capire come farlo è perché non è possibile, almeno non senza ricorrere a SQL. Prova ad aggiungere quanto segue al file functions.php
del tuo tema:
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;
}
Se hai campi personalizzati 'featured_image'
con valori vuoti, il codice sopra li filtrerà. Se il tuo problema è diverso, dovremo vedere come sono strutturati i tuoi dati per risolverlo.
Una cosa che mi incuriosisce: come hai ottenuto valori vuoti per 'featured_image'
? L'interfaccia di amministrazione in WordPress 3.1 fa del suo meglio per evitare che vengano inseriti valori vuoti.
Spero che questo ti aiuti.

Grazie a Dio... quindi non siamo solo noi. È un sollievo saperlo, suppongo. Grazie @MikeSchinkel - Dovrebbero davvero metterlo nel codex... Non vedo l'ora di leggere la spiegazione. Grazie!!

@Rob - Quindi stavo basandomi sulla mia conoscenza della 3.0 e ora sto testando in 3.1 e sembra funzionare. Ho due post e uno con un campo personalizzato featured_image
e la tua query funziona bene. Cosa stai scoprendo? C'è la possibilità che la tua query stia caricando post che hanno effettivamente il campo personalizzato featured_image
ma dove il valore di quel campo è vuoto?

@MikeSchinkel - Davvero? Sì, è esattamente quello che sta facendo — ogni post ha il campo featured_image, solo che non tutti sono impostati. Sta caricando comunque tutti i post.

@MikeSchinkel - Grazie! Sembra funzionare perfettamente, dopo aver impostato anche il post_type nella query. I valori vuoti sono intenzionali — non tutti i post hanno questa immagine in evidenza (e so riguardo alla miniatura del post, semplicemente non è un'opzione valida per questo sito). Grazie mille!

@MikeSchinkel - Mi correggo - funziona sulle query per cui lo volevo, ma sta causando errori 404 ovunque. Pagine di singoli post, archivi... :o\ Hai qualche idea?

Nel campione di codice nella tua domanda sopra, prova a inserire la chiamata add_filter()
appena prima della tua chiamata WP_Query()
, poi inserisci remove_filter('posts_where','yoursite_posts_where');
appena prima di chiamare wp_reset_query()
.

Modifica: dal codex: $query = new WP_Query( 'meta_key=featured_image' );
guarda qui:http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

Primo, puoi sempre [modificare] una domanda o risposta invece di aggiungere un commento. Secondo: Non abusare delle risposte al posto dei commenti.

Se hai una nuova domanda, per favore fai clic sul pulsante Fai una domanda. Includi un link a questa domanda se può aiutare a fornire contesto.

@kaiser - mi sembra che stesse rispondendo. Non sta chiedendo se il suo codice è valido, ma suppongo che stia rispondendo in modo sarcastico alla domanda con ciò che crede funzionerà.

@kaiser, I commenti sono per pubblicare risposte e codice? Come si pubblica il codice in un commento?

@Nathan Mi riferivo alla parte sarcastica della risposta. Il codice dovrebbe essere una risposta – includendo qualche spiegazione.

Questo problema è stato risolto in WP 3.2-alpha:

Spero che questo possa aiutare. Puoi sempre utilizzare i comparatori 'EMPTY' o 'NOT EMPTY' in questo modo:
'meta_query' => [
'relation' => 'AND',
[
'key' => 'your_key',
'compare' => 'NOT EMPTY',
],
]
Ho utilizzato questo approccio con uno dei miei campi checkbox ACF e funziona molto bene. Nel mio caso, stavo facendo l'opposto di te e alcuni dei post che stavo interrogando non avevano un valore per questo campo meta, quindi ho semplicemente aggiunto l'opzione NOT EXISTS come secondo confronto.
Interrogare i post che non contenevano il campo meta o contenevano un campo vuoto:
'meta_query' => [
'relation' => 'AND',
[
'key' => 'your_key',
'compare' => 'NOT EXISTS',
],
[
'key' => 'your_key',
'compare' => 'EMPTY',
],
]

Quindi mi sono imbattuto in questo problema specificamente quando utilizzavo ACF e quando usavo un campo che conteneva una selezione multipla che in precedenza era stata popolata e ora era vuota.
Ho riscontrato il problema che:
'relation' => 'AND',
array(
'key' => 'field_name',
'compare' => 'EXISTS'
),
array(
'key' => 'field_name',
'value' => '',
'compare' => '!='
),
Stava restituendo tutti i post indipendentemente dal fatto che il meta fosse vuoto o meno?
Così invece ho verificato se il campo conteneva una virgoletta:
'key' => 'field_name',
'value' => '"',
'compare' => 'LIKE'
Poiché ACF utilizza le virgolette in una struttura ad array per le selezioni multiple memorizzate nel database.
Spero che questo aiuti qualcuno che è caduto nella stessa trappola in cui sono caduto io :-)
