WordPress Получите 1 вложение к сообщению из категории X вне цикла

Надеюсь, кто-то может помочь с этим. Я хочу отображать 5 вложений, но только 1 вложение из каждого сообщения из определенной категории на боковой панели, которая ссылается на постоянную ссылку на сообщения.

Пока я использую следующий код, который получает все вложения из всех сообщений, но некоторые сообщения имеют более 1 вложения, и я просто хочу показать первое и связать его с постоянной ссылкой сообщения.

Таким образом, хотя ограничение составляет 5 сообщений, если одно сообщение имеет 4 вложения, то в настоящее время оно будет показывать 4 из одного и 1 из другого, всего 5, когда я хочу, чтобы он просто показывал 1 из каждого из 5 разных сообщений.

<?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();
    }
}

?>

Ваше здоровье. Дэйв


person davebowker    schedule 29.05.2010    source источник


Ответы (2)


Спасибо за это. Я еще не тестировал его, но мне удалось заставить его работать, используя следующий код. Я ни в коем случае не хардкорный PHP-программист, поэтому я не уверен, какой метод лучше. Все, что я знаю прямо сейчас, это то, что то, что у меня есть, кажется, работает.

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

Спасибо, что разобрались!

Дэйв

person davebowker    schedule 30.05.2010

Хорошо, я попробовал это, я действительно не думаю, что есть какой-либо элегантный способ без использования пользовательского запроса;

$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!
}

Запрос получает пять самых последних вложений, причем каждое вложение имеет уникального родителя.

ОБНОВИТЬ:

Извините, только что понял, что вы хотите запросить и по категориям - добавьте это большое старое объединение после 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)

И добавьте это в предложение WHERE;

AND $wpdb->term_taxonomy.term_id IN (YOUR_CATEGORY_ID)
person TheDeadMedic    schedule 30.05.2010