Comment puis-je afficher les publications uniquement si meta_value n'est pas vide

36

Trois personnes ont déjà essayé de résoudre ce problème et nous montons nul. Je souhaite afficher uniquement les publications qui ont une valeur dans la méta_key 'Featured_image'.

Alors ... si 'Featured_image' n'est pas vide, affichez le message. Voici le 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>

Nous avons littéralement essayé toutes les combinaisons possibles, les options obsolètes meta_ *, query_posts, get_posts, au lieu de WP_Query ... Rien. Imprimé l’instruction select, aucun champ de méta-valeur n’est affiché. Il existe - pour les messages (pour chaque message) et il existe dans la base de données.

Nous avons vu tous les articles sur le sujet actuellement, y compris ceux-ci:

query_posts et n'affiche les résultats que si un champ personnalisé n'est pas vide

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

Rien. S'il vous plaît aider ...

robalan
la source
Quelle version de WordPress utilisez-vous?
MikeSchinkel
@ MikeSchinkel - Désolé, Mike, je n'ai pas vu cela - c'est 3.1.
robalan
WP 3.5 corrige ce problème et vous permet d'utiliser une méthode de comparaison différente
Erenor Paz

Réponses:

6

salut @Rob:

Si vous ne savez pas comment faire, c'est parce que c'est impossible, du moins sans recourir à SQL. Essayez d’ajouter ce qui suit au functions.phpfichier de votre thème :

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

Si vous avez des 'featured_image'champs personnalisés avec des valeurs vides, ce qui précède va les filtrer. Si votre problème est autre chose, nous devrons voir à quoi ressemblent vos données pour le résoudre.

Une chose qui m'intrigue comment avez-vous obtenu des valeurs vides 'featured_image'? L'interface utilisateur d'administration dans WordPress 3.1 fait de son mieux pour vous empêcher d'entrer des valeurs vides. J'espère que cela t'aides.

Mike Schinkel
la source
Merci mon dieu ... alors ce n'est pas juste nous. C'est bon à savoir, je suppose. Merci @MikeSchinkel - Ils devraient vraiment mettre cela dans le codex ... Dans l'attente de l'explication. Merci!!
robalan
@Rob - Donc, je partais de ma connaissance de la 3.0 et maintenant je la teste en 3.1 et cela semble fonctionner. J'ai deux messages et un avec un featured_imagechamp personnalisé et votre requête fonctionne bien. Que trouves-tu? Y a-t-il une chance que votre requête charge des publications qui ont un featured_imagechamp personnalisé mais où la valeur de ce champ est vide?
MikeSchinkel
@MikeSchinkel - Sans blague? Oui, c'est exactement ce que nous faisons. Chaque publication comporte le champ Featured_image. Elles ne sont tout simplement pas définies. De toute façon, ça charge tous les posts.
robalan
@Rob - Voir ma réponse mise à jour.
MikeSchinkel
@MikeSchinkel - Merci! Cela semble fonctionner parfaitement, après avoir défini le post_type dans la requête également. Les valeurs vides sont utiles - toutes les publications ne comportent pas cette image (et je connais la vignette de la publication, ce n'est tout simplement pas une bonne option pour ce site). Merci beaucoup!
robalan
57

Cela semble fonctionner pour obtenir la valeur dans la requête, mais vous ne savez pas si elle génère des résultats valides.

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

Pas eu le temps de créer des champs pour tester les résultats, mais je suis en train de regarder les requêtes avec lesquelles j'ai travaillé aujourd'hui et j'ai remarqué que NOT INje prendrais volontiers un tableau vide.

t31os
la source
Je sais que c'est une vieille réponse, mais pour ceux qui tentent cette apparoach, il fonctionne avec au 'compare' => 'NOT LIKE'lieu de 'NOT IN'
handsofaten
3
Sûrement plus efficace à utiliser! = Au lieu de pas dans ou pas comme. Identique à wordpress.stackexchange.com/a/10286/32863 (c'est à propos des clés méta, mais le même principe)
Adam
5
Même solution plus propre: comme Adam l'a déjà dit. Est à utiliser: 'value' => '', 'compare' => '!='
Martijn van Hoof
Si vous avez besoin de vérifier pour vous assurer que ce n'est pas un tableau vide ...'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'
StephanieQ
10

C'est une vieille question, mais il semble que Wordpress ait corrigé cette "fonctionnalité manquante": désormais, selon Wordpress Codex, il est possible de vérifier l'existence (ou la non-existence) de la méta-clé, comme ceci

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

Ceci est disponible à partir de WP> = 3.5.

Erenor Paz
la source
EXISTSmontrera des valeurs vides qui ne sont pas ce que nous recherchons ici. La meilleure solution est 'value' => '', 'compare' => '!=' dans la mesure où mes tests vont.
Ben
1
@Ben C'est exactement ce que l'OP a essayé, mais sans aucun succès, semble-t-il. J'ai ajouté ma solution pour m'assurer que les personnes qui passaient en recherchant une méthode pour récupérer des publications basées sur l'existence de meta_key puissent la trouver. Puisque la valeur d'une méta peut être "quelque chose", "vide" ou "null" (au cas où la méta n'existe pas), la meilleure solution serait probablement de fusionner les deux options avec une relation "ET"
Erenor Paz
4

C'est la requête qui a fonctionné pour moi. Très similaire à la comparaison dans la réponse de t31os à partir de 2011, mais comme la méta clé / valeur est juste une simple chaîne de texte, il n'est pas nécessaire que ce soit un tableau 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'
);

Pour une raison quelconque, en utilisant 'meta_value' => '' et 'meta_compare' => '! =' Ou 'meta_compare' => 'NOT LIKE' même tiré tous les messages pour moi, mais cela a probablement quelque chose à voir avec le fait que J'ai créé ma méta-valeur à l'aide du plugin Advanced Custom Fields (ACF).

En savoir plus sur les paramètres de champ personnalisés dans le codex .

Tessa
la source
3

Est-ce que je manque quelque chose?

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

?>

Ça ne va pas le faire?

Infinity Media
la source
Edit: du codex: $query = new WP_Query( 'meta_key=featured_image' ); regardez ici: codex.wordpress.org/Class_Reference/…
Infinity Media
Tout d'abord, vous pouvez toujours modifier une question ou une réponse au lieu d'ajouter un commentaire. Deuxièmement: ne pas utiliser les réponses à la place de commentaires.
Kaiser
Si vous avez une nouvelle question, posez-la en cliquant sur le bouton Poser une question . Incluez un lien vers cette question si cela permet de fournir un contexte.
Kaiser
@ Kaiser - Il me semble qu'il répondait. Il ne demande pas si son code est valide, mais je suppose qu'il répond de manière sarcastique à la question avec ce qui, à son avis, fonctionnera.
Nathan
@Nathan Voici à quoi servent les commentaires.
Kaiser
-3
!has_featured_image();

une doublure ftw.

à M
la source