2010-05-29 10 views
1

Espérons que quelqu'un peut aider avec ceci. Ce que je veux est de afficher 5 pièces jointes, mais seulement 1 pièce jointe de chaque poste d'une catégorie spécifique dans la barre latérale, qui liens vers les postes permalink. J'utilise le code suivant jusqu'à présent qui obtient toutes les pièces jointes de tous les messages, mais certains messages ont plus de 1 pièce jointe et je veux juste montrer le premier, et le lier au permalink de la poste. Donc, bien que la limite est de 5 postes, si un poste a 4 pièces jointes, alors il en affichera 4 de l'un, et 1 de l'autre totalisant 5, alors que ce que je veux faire, c'est montrer 1 de chacun des 5 différents messages.WordPress Obtenez 1 pièce jointe par poste de catégorie X en dehors de la boucle

<?php 

$args = array(
    'post_type' => 'attachment', 
    'numberposts' => 5, 
    'post_status' => null, 
    'post_parent' => null, // any parent 
    'category_name' => 'work', 
    ); 
$attachments = get_posts($args); 
if ($attachments) { 
    foreach ($attachments as $post) { 
     setup_postdata($post); 
     the_title(); 
     the_permalink(); 
     the_attachment_link($post->ID, false); 
     the_excerpt(); 
    } 
} 

?> 

Cheers. Dave

Répondre

2

Bravo pour cela. Je ne l'ai pas encore testé mais j'ai réussi à le faire fonctionner en utilisant le code suivant. Je ne suis pas un programmeur PHP hardcore, je ne sais pas quelle méthode est la meilleure. Tout ce que je sais maintenant, c'est que ce que j'ai semble marcher.

<?php query_posts('category_name=work&posts_per_page=10'); ?> 
        <?php while (have_posts()) : the_post(); ?> 
         <?php 
         $args = array(
          'order'   => 'ASC', 
          'post_type'  => 'attachment', 
          'post_parent' => $post->ID, 
          'post_mime_type' => 'image', 
          'post_status' => null, 
          'numberposts' => 1, 
         ); 
         $attachments = get_posts($args); 
         if ($attachments) { 
          foreach ($attachments as $attachment) { 
           //echo apply_filters('post_title', $attachment->post_title); 
           echo "<li><a href='"; 
           echo the_permalink(); 
           echo "' title='"; 
           echo the_title(); 
           echo "'>"; 
           echo wp_get_attachment_image($attachment->ID, 'thumbnail', false, false); 
           echo "</a></li>"; 
          } 
         } 
         ?> 
        <?php endwhile;?> 

Merci d'avoir craqué!

Dave

0

D'accord, j'ai pris une fissure à ce sujet, je ne pense vraiment pas qu'il y ait un moyen élégant sans utiliser une requête personnalisée;

$attachment_IDs = $wpdb->get_col(
    "SELECT ID FROM $wpdb->posts WHERE 
     post_parent > 0 AND 
     post_type = 'attachment' 
    GROUP BY post_parent 
    ORDER BY post_date DESC 
    LIMIT 5" 
); 

if ($attachment_IDs) { 
    $attachments = get_posts(array('include' => implode(',', $attachment_IDs))); 
    // do what you like! 
} 

La requête obtient les cinq pièces jointes les plus récentes, chaque pièce jointe ayant un parent unique.

MISE À JOUR:

Désolé, juste que vous vouliez réalisé une requête par catégorie trop - ajouter ce grand vieux rejoindre après le SELECT;

INNER JOIN $wpdb->term_relationships ON 
    ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
INNER JOIN $wpdb->term_taxonomy ON 
    ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 

Et ajoutez ceci à la clause WHERE;

AND $wpdb->term_taxonomy.term_id IN (YOUR_CATEGORY_ID)