Wie kann ich Beiträge nur anzeigen, wenn meta_value nicht leer ist?

36

Drei Leute haben bereits versucht, das zu lösen, und wir kommen gleich auf Null. Ich möchte nur Posts anzeigen, die einen Wert im meta_key 'featured_image' haben.

Also ... wenn 'featured_image' nicht leer ist, zeige den Beitrag. Hier ist der Code:

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

Wir haben buchstäblich jede denkbare Kombination ausprobiert, die veralteten meta_ * -Optionen, query_posts, get_posts anstelle von WP_Query ... Nichts. Die Select-Anweisung wurde gedruckt, es wird kein Meta-Wert-Feld angezeigt. Es existiert - für die Beiträge (für jeden Beitrag) und es existiert in der Datenbank.

Wir haben jeden Beitrag zu diesem Thema gesehen, einschließlich dieser:

query_posts und zeige nur Ergebnisse, wenn ein benutzerdefiniertes Feld nicht leer ist

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

Zilch. Bitte helfen Sie ...

robalan
quelle
Welche Version von WordPress verwenden Sie?
MikeSchinkel
@ MikeSchinkel - Sorry Mike, habe das nicht gesehen - Es ist 3.1.
robalan
WP 3.5 behebt dieses Problem und lässt Sie eine andere Vergleichsmethode verwenden
Erenor Paz

Antworten:

6

Hallo @Rob:

Der Grund, warum Sie nicht herausfinden können, wie es geht, ist, dass es nicht möglich ist, zumindest nicht ohne Rückgriff auf SQL. Fügen Sie der functions.phpDatei Ihres Themas Folgendes hinzu :

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

Wenn Sie benutzerdefinierte 'featured_image'Felder mit leeren Werten haben, werden diese durch die obigen Angaben herausgefiltert. Wenn Ihr Problem etwas anderes ist, müssen wir sehen, wie Ihre Daten aussehen, um es zu lösen.

Eine Sache, auf die ich neugierig bin; Wie sind Sie zu leeren Werten gekommen 'featured_image'? Die Admin-Benutzeroberfläche in WordPress 3.1 versucht, Sie daran zu hindern, leere Werte einzugeben. Hoffe das hilft.

MikeSchinkel
quelle
Gott sei Dank ... also sind es nicht nur wir. Das ist wohl gut zu wissen. Danke @MikeSchinkel - Sie sollten das wirklich in den Kodex aufnehmen ... Freue mich auf die Erklärung. Vielen Dank!!
robalan
@Rob - Also habe ich mein 3.0-Wissen aufgegeben und jetzt teste ich es in 3.1 und es scheint zu funktionieren. Ich habe zwei Posts und einen mit einem featured_imagebenutzerdefinierten Feld und Ihre Abfrage funktioniert einwandfrei. Was findest du? Besteht die Möglichkeit, dass Ihre Abfrage Posts lädt, die ein featured_imagebenutzerdefiniertes Feld haben, deren Wert jedoch leer ist?
MikeSchinkel
@MikeSchinkel - Kein Scherz? Ja, genau das macht es - jeder Post hat das featured_image-Feld, sie sind einfach nicht alle gesetzt. Es lädt sowieso alle Beiträge hoch.
robalan
@Rob - Siehe meine aktualisierte Antwort.
MikeSchinkel
@MikeSchinkel - Danke! Es scheint perfekt zu funktionieren, nachdem post_type auch in der Abfrage gesetzt wurde. Die leeren Werte sind zweckmäßig - nicht jeder Beitrag hat dieses Bild (und ich weiß über die Beitragsminiatur, es ist nur keine gute Option für diese Website). Vielen Dank!
robalan
57

Dies scheint zu funktionieren, um den Wert in die Abfrage zu übernehmen. Sie sind sich jedoch nicht sicher, ob er gültige Ergebnisse liefert.

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

Ich hatte keine Zeit, Felder zu erstellen, um die Ergebnisse zu testen, aber ich habe Abfragen beobachtet, mit denen ich heute gearbeitet habe, und festgestellt NOT IN, dass ein leeres Array glücklich ist.

t31os
quelle
Ich weiß , das ist eine alte Antwort, aber für diejenigen , die diese apparoach versuchen, funktioniert es mit 'compare' => 'NOT LIKE'statt 'NOT IN'
handsofaten
3
Sicher effizienter zu nutzen! = Statt nicht in oder nicht mögen. Dasselbe wie wordpress.stackexchange.com/a/10286/32863 (das sind Metaschlüssel, aber dasselbe Prinzip)
Adam
5
Noch sauberere Lösung: wie Adam bereits sagte. Verwendungszweck: 'value' => '', 'compare' => '!='
Martijn van Hoof
Wenn Sie überprüfen müssen, um sicherzustellen, dass es kein leeres Array ist ...'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'
StephanieQ
10

Dies ist eine alte Frage, aber es scheint, dass Wordpress diese "fehlende Funktion" behoben hat: Laut Wordpress Codex ist es jetzt möglich, die Existenz (oder Nichtexistenz) des Metaschlüssels auf diese Weise zu überprüfen

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

Dies ist verfügbar ab WP> = 3.5.

Erenor Paz
quelle
EXISTSzeigt leere Werte an, nach denen wir hier nicht suchen. Die beste Lösung ist 'value' => '', 'compare' => '!=' meines Erachtens.
Ben
1
@Ben Genau das hat das OP versucht, aber ohne Erfolg, so scheint es. Ich habe meine Lösung hinzugefügt, um sicherzustellen, dass Passanten, die nach einer Methode suchen, um Beiträge basierend auf dem Vorhandensein von meta_key abzurufen, diese finden können. Da der Wert eines Metas "etwas", "leer" oder "null" sein kann (falls das Meta nicht existiert), wäre es wahrscheinlich die beste Lösung, die beiden Optionen mit einer "UND"
-Relation zu verbinden
4

Dies ist die Abfrage, die für mich gearbeitet hat. Sehr ähnlich wie der Vergleich in der t31os-Antwort von 2011, aber da der Metaschlüssel / -wert nur eine einfache Textzeichenfolge ist, muss es sich nicht um ein meta_query-Array handeln.

$args = array(
    'posts_per_page' => 5,//replaced 'showposts' in version 2.1
    'meta_key' => 'featured_image',
    'meta_value' => array(''),
    'meta_compare' => 'NOT IN'
);

Aus irgendeinem Grund hat die Verwendung von 'meta_value' => '' und 'meta_compare' => '! =' Oder 'meta_compare' => 'NOT LIKE' immer noch alle Posts für mich abgerufen , aber es hat wahrscheinlich etwas damit zu tun Ich habe meinen Metawert mit dem ACF-Plugin (Advanced Custom Fields) erstellt.

Weitere Informationen zu benutzerdefinierten Feldparametern finden Sie im Codex .

Tessa
quelle
3

Vermisse ich etwas?

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

?>

Tut das nicht?

Infinity Media
quelle
Edit: aus dem Codex: $query = new WP_Query( 'meta_key=featured_image' ); siehe hier: codex.wordpress.org/Class_Reference/…
Infinity Media
Erstens können Sie immer eine Frage oder Antwort bearbeiten , anstatt einen Kommentar hinzuzufügen. Zweitens: Do not Missbrauch Antworten statt Kommentare.
Kaiser
Wenn Sie eine neue Frage haben, fragen Sie es bitte durch Klicken Frage stellen Taste. Fügen Sie einen Link zu dieser Frage hinzu, wenn dies zur Bereitstellung des Kontexts beiträgt.
Kaiser
@kaiser - scheint mir, als hätte er geantwortet. Er fragt nicht, ob sein Code gültig ist, aber ich nehme an, dass er die Frage sarkastisch mit dem beantwortet, von dem er glaubt, dass es funktionieren wird.
Nathan
@ Nathan Dies ist, was Kommentare sind für.
Kaiser
-3
!has_featured_image();

Einzeiler ftw.

tom
quelle