web-dev-qa-db-fra.com

Répertorie les téléchargements d'images les plus récents, mais uniquement pour un type d'article personnalisé

Je peux obtenir une liste des pièces jointes les plus récentes, comme ceci:

$attachments = get_posts( array(
    'post_type' => 'attachment',
    'posts_per_page' => $number,
    'post_mime_type' => 'image'
) );

Cela renvoie toutes les images récemment téléchargées, qu'elles soient attachées à un message ou à une page, ou non attachées via le menu Multimédia.

Ce que j'aimerais, c'est limiter cette liste aux seules images attachées à un type de publication personnalisé que j'ai créé. (Le type de message personnalisé n'est pas si important; la même question pourrait être: "uniquement des images attachées à des messages" ou "uniquement des images attachées à des pages".)

Je me rends compte que je pourrais tester chaque image après avoir exécuté la requête ci-dessus et éliminer celles dont le parent n'est pas le bon type de publication, mais je souhaite renvoyer un nombre spécifique d'images ($number), et cette méthode pourrait éliminer tout ou partie des images renvoyées !

5
Doug

Avez-vous essayé d'ajouter un filtre à get_posts. Ce n'est pas testé, juste une pensée après un peu de recherche:

 function my_filter( $query )
 {
      if( is_home() ) //Example, if u want to display recent images on home
      {
           $query->set( 'post_type', array( 'attachment', 'my_cpt' ) );
      }
 }
 add_filter( 'pre_get_posts', 'my_filter' );

EDIT: Après la relecture, je ne pense pas que cela accomplisse ce que vous essayez de faire, je pense qu'il affichera les pièces jointes et les publications de votre CPT.

Je suppose que je vais le laisser ici au cas où cela vous donnerait des idées.

EDIT 2: Le seul autre moyen en dehors du filtrage dans PHP auquel je peux penser serait une requête SQL personnalisée, puis la configuration des données de publication. EX:

$sql = "SELECT * FROM wp_posts
        WHERE post_type = 'attachment'
        AND post_parent IN (SELECT ID FROM wp_posts WHERE post_type = 'your-cpt')
        //ORDER BY";

 $posts = $wpdb->get_results( $sql, OBJECT );

 //loop - setup_postdata

Plus d'infos: Codex Wordpress

1
Shane

D'abord, vous obtenez les derniers messages modifiés pour votre CPT uniquement. Ensuite, obtenez leurs pièces jointes. Bien sûr, vous pouvez avoir une certaine logique pour limiter le nombre de pièces jointes.

$mycpt = get_posts(array(
                 'post_type'=>'mycpt',
                  'posts_per_page'=>-1,
                  'orderby'=>'modified'
                 ));

$attachments = array();
foreach($mycpt as $mycpt)
{
  $post_attachements = get_posts( array(
    'post_parent'       => $mycpt->ID,
    'post_type'         => 'attachment',
    'post_mime_type'    => 'image',   
    'posts_per_page'    => -1
) );
   foreach($post_attachements as $post_attachements){
     $attachments[] = $post_attachements;
    }

}
1
Rajeev Vyas