web-dev-qa-db-fra.com

Renvoyer des pièces jointes à partir d'un type de message personnalisé

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>';
    }
}

}

2
natnai

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.

  1. Tirez votre portefeuille IDs-- notez l'argument fields.
  2. Ensuite, tirez vos pièces jointes avec ces IDs en tant que poste parent.
  3. Ensuite, vous ne passez en boucle que sur le tableau d’images.

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.

2
s_ha_dum