Je suis un nouveau développeur WP. J'essaie de faire en sorte que mon portfolio.php
affiche toutes les images attachées à mon type de message personnalisé 'portfolio', puis les affiche dans un format de maçonnerie. J'ai réussi à les faire afficher sans la requête $post->post_type
, mais je n'ai pas eu beaucoup de succès lorsque j'essayais de limiter WP à la récupération d'images attachées à mon type d'article personnalisé. Toute aide sera grandement appréciée et merci d'avance!
<?php get_header(); ?>
<div id="portfolio-wrapper">
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php if ( $post->post_type == 'portfolio' ) {
$attachments = get_posts( array (
'post_type' => 'attachment',
'numberposts' => -1,
'post_parent' => $post->ID
) );
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
$imgurl = wp_get_attachment_url ($attachment->ID);
echo '<div class="portfolio-item">';
echo '<a href="'.$imgurl.'" rel="lightbox[portfolio-home]"><img class="portfolio" src="'.$imgurl.'"></a>';
echo '</div>';
}
}
}
?>
</div>
<?php endwhile; endif; ?>
<?php get_footer(); ?>
Comme demandé, ma solution. Pas très élégant, mais ça marche:
$query = new WP_Query( array( 'post_type' => 'portfolio', 'posts_per_page' => -1 ) );
if( $query->have_posts() ){
while($query->have_posts()){
$query->the_post();
$image_query = new WP_Query( array( 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_mime_type' => 'image', 'posts_per_page' => -1, 'post_parent' => get_the_ID(), 'order' => 'DESC' ) );
while( $image_query->have_posts() ) {
$image_query->the_post();
$imgurl = wp_get_attachment_url( get_the_ID() );
echo '<div class="portfolio-item">';
echo '<a href="'.$imgurl.'" rel="lightbox[portfolio-home]"><img class="portfolio" src="'.$imgurl.'"></a>';
echo '</div>';
}
}
}
Votre solution (modifiée de manière incorrecte dans la question) devrait être réalisable, mais vous devriez pouvoir accomplir la même chose avec moins de requêtes.
ID
s-- notez l'argument fields
.ID
s en tant que poste parent.Cela équivaut à deux requêtes principales. En être témoin:
$query = new WP_Query(
array(
'post_type' => 'portfolio',
'posts_per_page' => -1,
'fields' => 'ids'
)
);
$image_query = new WP_Query(
array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'post_mime_type' => 'image',
'posts_per_page' => -1,
'post_parent__in' => $query->posts,
'order' => 'DESC'
)
);
if( $image_query->have_posts() ){
while( $image_query->have_posts() ) {
$image_query->the_post();
$imgurl = wp_get_attachment_url( get_the_ID() );
echo '<div class="portfolio-item">';
echo '<a href="'.$imgurl.'" rel="lightbox[portfolio-home]"><img class="portfolio" src="'.$imgurl.'"></a>';
echo '</div>';
}
}
La façon dont vous le faites signifierait une requête pour les publications portfolio
, plus une autre requête d’image pour chaque résultat portfolio
. Cela pourrait signifier des dizaines, des centaines, voire davantage de requêtes en fonction de la taille de votre base de données.