web-dev-qa-db-fra.com

obtenir des pièces jointes pour tous les messages d'un type particulier

Je crée un widget qui affiche un ensemble d'images issues de publications personnalisées récentes. Je veux exécuter la requête suivante:

SELECT p.* 
FROM wp_posts p
WHERE post_type='attachment'
AND post_mime_type LIKE 'image%'
AND post_parent IN (
  SELECT ID
  FROM wp_posts
  WHERE post_type ='my_custom_post_type'
)
ORDER BY post_date DESC
LIMIT 10;

et recevoir un tableau d'objets d'attachement. Je ne suis pas clair sur la méthode canonique WordPress pour faire quelque chose comme ça. Où devrais-je commencer?

5
dnagirl

Cela semble être un peu un gaspillage de parcourir deux boucles simplement pour utiliser des fonctions d'API intégrées qui n'étaient pas conçues pour un cas d'utilisation comme celui-ci.

Je pense que vous feriez mieux d’utiliser votre code SQL combiné avec la classe wpdb - - plus rapide et plus propre.

Exemple (avec SQL modifié):

<?php
function wpse52315_get_attach()
{
    global $wpdb;
    $res = $wpdb->get_results("select p1.*
        FROM {$wpdb->posts} p1, {$wpdb->posts} p2
        WHERE p1.post_parent = p2.ID 
           AND p1.post_mime_type LIKE 'image%'
           AND p2.post_type = 'your_cpt'
        ORDER BY p2.post_date
        LIMIT 10;"
    );
    return $res;
}
5
chrisguitarguy

Ce que je recommande est une instance de WP_Query pour parcourir toutes les publications personnalisées de type publication, puis get_posts() pour récupérer les pièces jointes de chaque publication. Voici un extrait de code non testé qui devrait faire ce que vous voulez:

// Setup array for storing objects
$my_attachment_objects = array();

// Arguments for custom WP_Query loop
$my_cpts_args = array(
    'post_type' => 'my_custom_post_type',
    'posts_per_page' => 10
);

// Make the new instance of the WP_Query class
$my_cpts = new WP_Query( $my_cpts_args );

// And Loop!
if( $my_cpts->have_posts() ) : while( $my_cpts->have_posts() ) : $my_cpts->the_post();

    // arguments for get_posts
    $attachment_args = array(
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'post_status' => null, // attachments don't have statuses
        'post_parent' => $post->ID
    );
    // get the posts
    $this_posts_attachments = get_posts( $attachment_args );
    // append those posts onto the array
    $my_attachment_objects[$post->ID] = $this_posts_attachments; // make an array with the post_id as the key, just in case that's useful

endwhile; endif; wp_reset_postdata();

J'espère que cela t'aides.

3
mrwweb

Si tout ce qui vous intéresse, c'est le nombre de pièces jointes pour un type de message particulier, vous pouvez légèrement modifier la fonction de Chris:

<?php
function myprefix_image_count() {
    global $wpdb;
    $res = $wpdb->get_var("select COUNT(*)
        FROM {$wpdb->posts} p1, {$wpdb->posts} p2
        WHERE p1.post_parent = p2.ID
           AND p1.post_mime_type LIKE 'image%'
           AND p2.post_type = 'your_cpt_name'
        ORDER BY p2.post_date;"
    );
    $imageCount = (int)$res;
    return $imageCount;
}
?>
0
Philip Downer

Peut-être quelque chose comme ça:

<?php
  $args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10 );
  $loop = new WP_Query( array ( 'orderby' => 'title', 'order' => 'DESC' ) );  
  while ( $loop->have_posts() ) : $loop->the_post();
    the_title();
    echo '<div class="entry-content">'; the_content();
    echo '</div>';
  endwhile;
  ?>
0
Jeremy Jared