web-dev-qa-db-fra.com

Exclut les publications qui n'ont pas de pièces jointes dans the_content ()

J'essaie d'écrire une boucle qui exclut les publications qui n'ont pas de pièces jointes dans leur zone de contenu.

J'ai 200 messages dans un type de message personnalisé appelé "étudiants". Je dois interroger tous les étudiants avec une galerie ou une pièce jointe dans leur zone de contenu. PAS leur image sélectionnée.

Cela peut-il être fait? C'est ce qui se passe avec ma boucle jusqu'à présent. Ne fonctionnant pas du tout, je suppose que $gotimages ne génère pas de publications avec pièces jointes ...


** FINAL EDIT: La boucle ici fonctionne parfaitement, le problème que j'ai trouvé est que vous ne pouvez attribuer des images qu'une seule fois. Ce qui signifie que si vous téléchargez des images dans un message, puis réutilisez les mêmes images pour un autre message, seule la première image du message s'affiche. Cette boucle fonctionne par association à la poste.

Chargez à nouveau vos images pour chaque message afin que cela fonctionne et que vous disposiez d'images uniques. **

EDIT: En utilisant la boucle de s_ha_dum ♦, cela se rapproche de la chose que je cherche, bien que cela ne produise qu'un résultat dans la boucle.

<?php
$args = array( 
  'post_type'      => 'attachment',
  'post_mime_type' => 'image',
  'post_status' => 'inherit',
  'posts_per_page' => -1,
  'post_parent__not_in' => array(0),
  'meta_query' => array(
    array(
      'key' => '_thumbnail_id',
      'value' => 'x',
      'compare' => 'NOT EXISTS'
    )
  ),
  'fields' => 'post_parent'
);
$atts = new WP_Query($args);

$parents = array_unique(wp_list_pluck($atts->posts,'post_parent'));

//var_dump($parents);

// get your students posts
$args = array( 
    'post_type' => 'student',
    'post__in' => $parents
);
$students = new WP_Query($args);

// lets see some results
//var_dump($students->request);
//var_dump($students->posts);

echo '<hr />';

// Looping through the students
// I need to pull a random image from the post' gallery / attachements
// Unsure of how I do this
if ( $students->have_posts() ) {
    while ( $students->have_posts() ) {
        $students->the_post();

        echo get_the_title();
        echo '<hr />';
    }
} else {
    // no posts found
    echo 'No students exist';
}
/* Restore original Post Data */
wp_reset_postdata();

?>

3
Andrew Lazarus

Tout d'abord, s'il vous plaît , n'utilisez pas query_posts() (c'est moi qui souligne)!

Remarque: Cette fonction n'est pas destinée à être utilisée par des plugins ou des thèmes . Comme expliqué plus tard, il existe de meilleures options plus performantes pour modifier la requête principale. query_posts() est trop simpliste et problématique moyen de modifier la requête principale d’une page en la remplaçant par une nouvelle instance de la requête. Il est inefficace (ré-exécute les requêtes SQL) et échouera carrément dans certaines circonstances (surtout lorsqu'il s'agit de pagination de messages). Tout code WP moderne devrait utiliser des méthodes plus fiables, comme utiliser le crochet pre_get_posts, à cet effet .

http://codex.wordpress.org/Function_Reference/query_posts

Deuxièmement, cela ne va pas marcher:

$gotimages = get_children( array(
  'post_type'      => 'attachment',
  'post_mime_type' => 'image',
  'post_parent'    => get_the_ID()
)),

array(
  'key' => implode(', ', $gotimages),
  'compare' => '='
),

Cette ligne...

 'post_parent'    => get_the_ID()

... ce sera probablement un problème, car elle renverra l'identifiant de publication actuel dans la boucle, mais votre boucle ne commencera que plus tard. Compte tenu de la façon dont votre code est écrit, je pense que vous essayez de construire une sorte de sous-requête, mais cela ne fonctionne pas comme ça.

Cette ligne ...

'key' => implode(', ', $gotimages),

... sera certainement un problème. $gotimages, s'il a des résultats, sera un tableau d'objets. Lorsque vous essayez d'imploser, vous obtiendrez quelque chose comme:

Erreur fatale capturable: l'objet de la classe WP_Post n'a pas pu être converti en chaîne ...

Essayez-le avec un identifiant de poste sachant avoir des pièces jointes:

$gotimages = get_children( array(
    'post_type'      => 'attachment',
    'post_mime_type' => 'image',
    'post_parent'    => 1
));
var_dump(implode(', ', $gotimages));

De plus, je suis à peu près sûr que l'argument key d'un meta_query ne prend pas une chaîne délimitée par des virgules, même si cet objet était correctement à implode().

Troisièmement, get_children() va renvoyer toutes les pièces jointes, dont l'une est l'image sélectionnée, mais WordPress gère également les pièces jointes. Une fois qu'une image est jointe à une publication, il est difficile de la détacher. Vous obtiendrez des images qui, une fois affichées dans le corps du message, ne sont plus affichées. Donc, logiquement, même si tout le code fonctionnait, ce que vous tenteriez ne fonctionnerait pas.

En fait, ce que vous essayez de faire est complexe et demande beaucoup de travail, car il faudra un regex sur le corps du message pour rechercher des images. Si vous avez des galeries impliquées, cela devient encore plus compliqué.

Alors, à quelle distance puis-je vous obtenir?

Je dois interroger tous les étudiants avec une galerie ou une pièce jointe dans leur zone de contenu. PAS leur image sélectionnée.

Ceci, si j'ai bien fait les choses, devrait vous rapprocher de "tous les étudiants ayant une galerie ou une pièce jointe dans leur zone de contenu":

$args = array( 
  'post_type'      => 'attachment',
  'post_mime_type' => 'image',
  'post_status' => 'inherit',
  'posts_per_page' => -1,
  'post_parent__not_in' => array(0),
  'meta_query' => array(
    array(
      'key' => '_thumbnail_id',
      'value' => 'x',
      'compare' => 'NOT EXISTS'
    )
  ),
  'fields' => 'post_parent'
);
$atts = new WP_Query($args);

$parents = array_unique(wp_list_pluck($atts->posts,'post_parent'));

// get your students posts
$args = array( 
  'post_type' => 'students',
  'post__in' => $parents
);
$students = new WP_Query($args);

// see some results
var_dump($students->request);
var_dump($students->posts);

Ce qu'il ne fait pas c'est:

  • Compenser les cas où des images ont été attachées, puis supprimées du corps du message. Ceux-ci vont toujours apparaître.
  • Et les cas où les images étaient écrites manuellement dans le corps de la publication. Ceux-ci ne se présenteront pas.

Votre autre option serait de rechercher dans votre type de message une chaîne identifiable de manière plausible:

$args = array( 
  'post_type' => 'students',
  's' => '<img '
);
$students = new WP_Query($args);

Je ne sais pas à quel point cela sera robuste, mais cela donne des résultats raisonnables lorsque je l'essaie.

2
s_ha_dum