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