Interroger les messages uniquement avec l'image sélectionnée

15

Je souhaite interroger 6 messages, mais uniquement ceux qui ont une image sélectionnée attachée. J'utilise la meta_keyméthode pour cela avec WP_Querycomme tel:

$args = array(
    'post_type'  => 'post',
    'meta_key' => '_thumbnail_id',
    'post_count' => 6 );
$query = new WP_Query($args);

Suivi par

<?php while($query->have_posts()) : $query->the_post(); ?>
    <h2><?php the_title(); ?></h2>
    <?php the_post_thumbnail('thumbnail'); ?>
<?php endwhile; ?>

Cela ne semble pas fonctionner. La requête renvoie plus de 6 messages et également ceux qui n'ont pas d'image en vedette. Des idées sur ce que je me trompe ici?

@chip: var_dump($query);donne un grand résultat donc je l'ai posté dans une boîte à pâte

Harry
la source
2
L'extrait de code a fonctionné pour moi comme prévu. Peut-être que l'erreur se trouve dans une autre partie du code.
Ralf912
D'où tirez-vous var_dump( $query )?
Chip Bennett
Comme une chose supplémentaire à laquelle j'ai pensé - les messages ont été importés sur mon serveur local à partir d'un site en direct en utilisant l'exportateur / importateur wordpress. Les messages originaux comportaient tous des images qui étaient manifestement perdues lors du processus d'importation. Cela pourrait-il signifier que même si les images présentées ont été supprimées, les métadonnées sont toujours restées, ce qui a gâché la requête?
Harry
Lorsque vous avez exécuté l'importation, avez-vous coché la case pour télécharger et joindre toutes les pièces jointes / supports? Si vous ne l'avez pas fait, vos images sélectionnées ne fonctionneront pas. Les messages auront une image en vedette, mais ils feront référence à une pièce jointe qui n'existe pas, et ne seront donc jamais affichés
Tom J Nowell
Oui, j'ai coché la case lors de l'importation.
Harry

Réponses:

3

Lorsque vous exécutez l'importateur, vous devez cocher la case pour télécharger et importer tous les supports / pièces jointes.

Si vous ne le faites pas, les articles auront toujours un ensemble d'images en vedette, mais la pièce jointe à laquelle ils se réfèrent sera invalide et toute tentative d'appel the_post_thumbnailéchouera. En utilisant votre code, vous obtiendrez uniquement le titre du message et pas de miniature. Cela donnerait l'impression que des publications qui n'ont pas d'image sélectionnée sont récupérées. Ce n'est pas le cas, elles ont une image sélectionnée, elle n'est tout simplement pas disponible en raison de l'erreur que vous avez commise lors de l'importation.

Supprimez vos messages et réimportez en utilisant les paramètres corrects.

Aussi pour démontrer le point, vous n'avez fait aucune tentative de vérifier réellement les messages, vérifiez toujours par exemple:

if ( $query->have_posts() ) { // you never checked to see if no posts were found
    while($query->have_posts()) { // alt style syntax doesn't work with most IDEs
        $query->the_post(); // individual statement should be on individual line
        ?><h2><?php the_title(); ?></h2><?php // you only need open/close tags here, not every line, save yourself some time typing
        if ( has_post_thumbnail() ) { // only print out the thumbnail if it actually has one
            echo '<p>post says it has a featured image</p>'; // double checking
            the_post_thumbnail('thumbnail');
        } else {
            echo '<p>this post does not have a featured image</p>';
        }
    }
} else {
    echo '<p>no posts found</p>';
}

Si vous n'avez pas coché la case, vous obtiendrez des images indiquant qu'elles ont une image sélectionnée, mais aucune image ne s'affiche

Tom J Nowell
la source
1
Je soupçonne que c'est la raison pour laquelle la réponse que j'ai fournie ne fonctionne pas comme prévu. le plugin WordPress Suicide est assez utile pour supprimer tout le contenu.
helgatheviking
J'ai bien coché cette case. Cependant, d'après mon expérience, cela n'a jamais fonctionné pour moi. Toutes les images ont été reliées au site externe. J'ai utilisé le plugin Importer des images externes ( wordpress.org/extend/plugins/import-external-images ) pour stocker les images localement et les attacher.
Harry
J'ai eu la même pensée, j'ai définitivement coché la case, pourquoi ça ne marche pas encore? Je l'ai reçu de clients, et il est si facile de se tromper, alors supprimez vos messages, réimportez et assurez-vous qu'il est vérifié, et si cela ne fonctionne toujours pas, vous pouvez l'exclure. Sinon, il y a un discours de Neil DeGrasse Tyson sur la faiblesse pathétique de la mémoire humaine. En ce moment, je pourrais vous demander de décocher la deuxième case et vous vous souviendrez probablement de l'avoir vu aussi (mais il n'y en a pas)
Tom J Nowell
et en attendant, terminez the_post_thumbnailavec un has_thumbnailappel et ajoutez un cas else pour que vous sachiez sans ambiguïté que le message n'a pas d'image en vedette
Tom J Nowell
Assurez-vous également que votre serveur est en mesure d'atteindre le serveur distant. Si votre serveur ne parvient pas à récupérer les requêtes distantes, il ne pourra pas importer. Vous devrez peut-être supprimer les pièces jointes déjà saisies
Tom J Nowell
24

Depuis WordPress 3.5, les paramètres Meta Query prennent en charge EXISTSet NOT EXISTScomparent les opérateurs. Dans le cas où vous les utilisez, vous pouvez omettre la valuepartie de la méta-requête. Essayez les arguments suivants pour votre requête:

$args = array(
   'post_type'  => 'post',
   'posts_per_page' => 6,
    'meta_query' => array(
        array(
         'key' => '_thumbnail_id',
         'compare' => 'EXISTS'
        ),
    )
);
helgatheviking
la source
Merci pour la suggestion. Je reçois maintenant les 6 messages, mais je reçois toujours des messages sans vignettes.
Harry
J'ai testé cela et cela a fonctionné pour moi. Mais j'ai remarqué qu'il retournera les entités qui ont le méta-ensemble, mais pour une raison quelconque, l'ID de pièce jointe n'est pas correct. Vérifiez donc à nouveau que vos publications contiennent les images sélectionnées. Sinon, je ne sais pas quel pourrait être le problème.
helgatheviking
Harry, pouvez-vous confirmer que vous utilisez la version 3.5 ou ultérieure?
Tom J Nowell
Oui, j'utilise la dernière version de WordPress - fraîchement installée sur mon serveur de développement local en tant que configuration réseau (multisite).
Harry
2
Juste quelques informations supplémentaires: il y a un bug non résolu, voir ticket trac 23268 , qui oblige à utiliser une valeur si NOT EXISTSest utilisé.
Nicolai