Come posso mostrare post solo se meta_value non è vuoto


36

Tre persone hanno già provato a risolvere questo problema e stiamo arrivando a zero. Voglio mostrare solo i post che hanno un valore nel meta_key "optional_image".

Quindi ... se "optional_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="" />
            <?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>

Abbiamo provato letteralmente ogni combinazione a cui possiamo pensare, le opzioni deprecate meta_ *, query_posts, get_posts, invece di WP_Query ... Niente. Stampata l'istruzione select, non viene visualizzato alcun campo meta-valore. Esiste - per i post (per ogni post) ed esiste nel db.

Abbiamo visto tutti i post sull'argomento in questo momento, compresi questi:

query_posts e mostra i risultati solo se un campo personalizzato non è vuoto

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

Zilch. Per favore aiuto...


Quale versione di WordPress stai usando?
MikeSchinkel,

@MikeSchinkel - Mi dispiace Mike, non l'ho visto - Sono le 3.1.
Robalan,

WP 3.5 risolve questo problema e ti consente di utilizzare un metodo di confronto diverso
Erenor Paz,

Risposte:


6

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 functions.phpfile 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 disponi di 'featured_image'campi personalizzati con valori vuoti, i filtri precedenti li filtreranno. Se il tuo problema è qualcos'altro, dovremo vedere come appaiono i tuoi dati per risolverli.

Una cosa di cui sono curioso; come hai ottenuto valori vuoti per 'featured_image'? L'interfaccia utente di amministrazione in WordPress 3.1 fa del suo meglio per impedirti di inserire valori vuoti. Spero che sia di aiuto.


Grazie a dio ... quindi non siamo solo noi. Buono a sapersi, suppongo. Grazie @MikeSchinkel - Dovrebbero davvero inserirlo nel codice ... In attesa di una spiegazione. Grazie!!
Robalan,

@Rob - Quindi stavo andando fuori dalla mia conoscenza 3.0 e ora lo sto testando in 3.1 e sembra funzionare. Ho due post e uno con un featured_imagecampo personalizzato e la tua query funziona bene. Che cosa stai trovando? È possibile che la tua query stia caricando post con un featured_imagecampo personalizzato ma in cui il valore per quel campo è vuoto?
MikeSchinkel,

@MikeSchinkel - Non stai scherzando? Sì, è esattamente quello che sta facendo: ogni post ha il campo optional_image, non sono tutti impostati. Sta comunque caricando tutti i post.
Robalan,

@Rob - Vedi la mia risposta aggiornata.
MikeSchinkel,

@MikeSchinkel - Grazie! Sembra funzionare perfettamente, dopo aver impostato anche post_type nella query. I valori vuoti sono propositivi - non tutti i post hanno questa immagine in primo piano (e conosco la miniatura del post, non è solo una buona opzione per questo sito). Grazie mille!
Robalan,

57

Questo sembra funzionare per ottenere il valore nella query, non sono sicuro se tira risultati validi però.

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

Non ho avuto il tempo di creare campi per testare i risultati, ma ho guardato le query con cui ho lavorato oggi e ho notato che NOT INprenderanno felicemente una matrice vuota.


So che questa è una vecchia risposta, ma per coloro che provano questo approccio, funziona 'compare' => 'NOT LIKE'invece di 'NOT IN'
handsofaten l'

3
Sicuramente più efficiente da usare! = Invece di non entrare o no. Lo stesso di wordpress.stackexchange.com/a/10286/32863 (si tratta di meta-chiavi, ma stesso principio)
Adam

5
Soluzione ancora più pulita: come ha già affermato Adam. È da usare: 'value' => '', 'compare' => '!='
Martijn van Hoof il

Se devi controllare per assicurarti che non sia un array vuoto ...'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'
StephanieQ

10

Questa è una vecchia domanda, ma sembra che Wordpress abbia risolto questa "caratteristica mancante": ora, secondo Wordpress Codex è possibile verificare l'esistenza (o la non esistenza) della meta chiave, come questa

'meta_query' => array(
    array(
        'key' => 'featured_image',
        'compare' => 'EXISTS', //or "NOT EXISTS", for non-existance of this key
    )
)

Questo è disponibile a partire da WP> = 3.5.


EXISTSmostrerà valori vuoti che non sono ciò che stiamo cercando qui. La soluzione migliore è per 'value' => '', 'compare' => '!=' quanto riguarda i miei test.
Ben

1
@Ben È esattamente quello che ha provato l'OP, ma senza successo sembra. Ho aggiunto la mia soluzione per assicurarmi che le persone che passano alla ricerca di un metodo per recuperare i post basati sull'esistenza di meta_key possano trovarlo. Poiché il valore di una meta può essere "qualcosa", "vuoto" o "null" (nel caso in cui la meta non esista), probabilmente la soluzione migliore sarebbe quella di unire le due opzioni con una relazione "AND"
Erenor Paz

4

Questa è la domanda che ha funzionato per me. Molto simile al confronto nella risposta di t31os del 2011, ma poiché la meta chiave / valore è solo una semplice stringa di testo, non è necessario che sia una matrice 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'
);

Per qualunque motivo, usando 'meta_value' => '' e 'meta_compare' => '! =' O 'meta_compare' => 'NON MI PIACE' ho ancora preso tutti i post per me, ma probabilmente ha qualcosa a che fare con il fatto che Ho creato il mio meta valore utilizzando il plug-in Advanced Custom Fields (ACF).

Ulteriori informazioni sui parametri dei campi personalizzati nel codice .



3

Mi sto perdendo qualcosa?

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

?>

Non è quello?


Modifica: dal codice: $query = new WP_Query( 'meta_key=featured_image' ); guarda qui: codex.wordpress.org/Class_Reference/…
Infinity Media

Innanzitutto, puoi sempre modificare una domanda o una risposta invece di aggiungere un commento. Secondo: non abusare delle risposte invece dei commenti.
Kaiser

Se hai una nuova domanda, chiedila facendo clic sul pulsante Poni domanda . Includere un collegamento a questa domanda se aiuta a fornire un contesto.
Kaiser

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

@Nathan Ecco a cosa servono i commenti.
Kaiser

-3
!has_featured_image();

un liner ftw.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.