Come mostrare solo i post il cui campo meta_value non è vuoto?

2 mar 2011, 07:56:19
Visualizzazioni: 116K
Voti: 51

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

3
Commenti

Quale versione di WordPress stai utilizzando?

MikeSchinkel MikeSchinkel
2 mar 2011 08:09:02

@MikeSchinkel - Scusa Mike, non l'avevo visto — È la 3.1.

robalan robalan
2 mar 2011 08:32:02

WP 3.5 risolve questo problema e ti permette di utilizzare un metodo di confronto diverso

Erenor Paz Erenor Paz
6 dic 2017 19:19:06
Tutte le risposte alla domanda 10
4
65

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.

4 mar 2011 02:20:02
Commenti

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

handsofaten handsofaten
11 lug 2012 20:10:59

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)

Adam Adam
9 set 2015 22:22:37

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

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

Se hai bisogno di verificare che non sia un array vuoto... 'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'

StephanieQ StephanieQ
14 ago 2018 19:39:53
2
27

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.

6 dic 2017 19:18:27
Commenti

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

Ben Ben
9 ago 2019 16:28:59

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

Erenor Paz Erenor Paz
9 ago 2019 19:06:24
2
16

Se vuoi che il valore meta esista e abbia un valore diverso da una stringa vuota:

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

Questa è l'unica risposta corretta al 100% secondo i miei test.

alexg alexg
5 gen 2022 16:57:19

Ho provato tutte le soluzioni e questa è l'unica che ha funzionato.

Sarathlal N Sarathlal N
1 ago 2022 05:13:59
0

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 e DATETIME
  • >= - funziona con valori meta numerici, DATE e DATETIME
  • < - funziona con valori meta numerici, DATE e DATETIME
  • <= - funziona con valori meta numerici, DATE e DATETIME
  • LIKE - può funzionare con un array di valori meta
  • NOT LIKE - può funzionare con un array di valori meta
  • IN - il meta valore dovrebbe essere un array di valori
  • NOT IN - il meta valore dovrebbe essere un array di valori
  • BETWEEN - funziona con valori meta numerici, DATE, DATETIME e con un array di valori
  • NOT BETWEEN - funziona con valori meta numerici, DATE, DATETIME e con un array di valori
  • EXISTS - non è necessario specificare un meta valore per le versioni di WP 3.9 e superiori
  • NOT EXISTS - non è necessario specificare un meta valore per le versioni di WP 3.9 e superiori
  • REGEXP
  • NOT REGEXP
  • RLIKE
10 gen 2018 16:03:35
8

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.

2 mar 2011 08:05:21
Commenti

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

robalan robalan
2 mar 2011 08:10:38

@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 MikeSchinkel
2 mar 2011 08:45:43

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

robalan robalan
2 mar 2011 09:20:39

@Rob - Vedi la mia risposta aggiornata.

MikeSchinkel MikeSchinkel
2 mar 2011 09:48:58

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

robalan robalan
2 mar 2011 17:14:10

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

robalan robalan
2 mar 2011 18:18:57

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

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

Quel codice controlla TUTTI i campi personalizzati per verificare se QUALCUNO di essi è vuoto? E se volessi che la query controlli solo un campo speciale e verifichi se è vuoto, indipendentemente dagli altri?

Jens Törnell Jens Törnell
31 mag 2011 19:28:11
Mostra i restanti 3 commenti
8

Mi manca qualcosa?

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

?>

Non è sufficiente?

24 gen 2014 23:47:40
Commenti

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

Infinity Media Infinity Media
24 gen 2014 23:50:32

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

kaiser kaiser
25 gen 2014 02:05:46

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 kaiser
25 gen 2014 02:05:56

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

Nathan Nathan
5 set 2016 07:19:14

@Nathan Questo è il motivo per cui esistono i commenti.

kaiser kaiser
5 set 2016 10:42:03

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

Nathan Nathan
5 set 2016 18:16:23

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

kaiser kaiser
5 set 2016 19:47:48

C'era un bug in WordPress ma ora è stato risolto. Questo è il modo corretto per farlo.

Ryan Taylor Ryan Taylor
4 dic 2016 04:19:16
Mostra i restanti 3 commenti
0

Questo problema è stato risolto in WP 3.2-alpha:

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

3 mar 2011 02:43:05
1

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',
        ],
     
      ]
11 ago 2021 13:13:42
Commenti

Non riesco a trovare la documentazione per 'EMPTY' e 'NOT EMPTY'. Hai un link a riguardo?

Pikamander2 Pikamander2
23 lug 2022 12:40:10
0

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

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

una riga per la vittoria.

30 gen 2012 13:39:09