Упорядочивание сообщений Wordpress по последним комментариям - PullRequest
4 голосов
/ 30 марта 2009

Я хочу заказать Wordpress посты по последнему комментарию. Насколько я знаю, это невозможно при использовании объекта WP_Query, и для этого потребуется специальный запрос $ wpdb, который я могу легко написать. Однако тогда я не знаю, как настроить цикл для запуска этого объекта.

Кто-нибудь может помочь?

Ответы [ 9 ]

7 голосов
/ 30 марта 2009

Присвоить

select wp_posts.*, max(comment_date) as max_comment_date
from $wpdb->posts wp_posts
right join $wpdb->comments
on id = comment_post_id
group by ID
order by max_comment_date desc
limit 10

к некоторой переменной $ query. Вы можете возиться с 10 или самим запросом. (Я не ниндзя по оптимизации SQL.) Тогда ваш код будет выглядеть примерно так:

<?php
     $results = $wpdb->get_results($query) or die('!');
     foreach ($results as $result):
?>
[insert template here]
<?php endforeach ?>

Этот шаблон более подробно охвачен Кодексом .

3 голосов
/ 18 января 2012

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

    $args = array(
        'status' => 'approve',
        'number' => 6,
        'order' => 'DESC'
    );
    $comments = get_comments($args);

    foreach($comments as $comment) : $count++;

            $post_args = array(
                'post_type' => 'post',
                'p' => $comment->comment_post_ID,
                'posts_per_page' => 1
                );

            $posts = get_posts($post_args);

            foreach($posts as $post) : setup_postdata($post);

                the_title();
                the_excerpt();

            endforeach;

        echo $comment->comment_content;     
        echo $comment->comment_author;

    endforeach;
3 голосов
/ 16 октября 2010

ОК, ребята,

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

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

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

Вот модифицированная версия Captain Keytar, но она ограничивает результаты типом 'post' .. который был опубликован (чтобы избежать черновиков !!)

    select wp_posts.*,
    coalesce(
        (
            select max(comment_date)
            from $wpdb->comments wpc
            where wpc.comment_post_id = wp_posts.id
        ),
        wp_posts.post_date
    ) as mcomment_date
    from $wpdb->posts wp_posts
    where post_type = 'post'
    and post_status = 'publish' 
    order by mcomment_date desc
    limit 10
2 голосов
/ 29 октября 2014

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

Если вы используете фильтр posts_clauses , вы можете просто изменить основной запрос и при этом использовать Цикл и все обычные функции цикла.

function intercept_query_clauses( $pieces ) {
    global $wpdb;

    $pieces['fields'] = "wp_posts.*,
    (
        select max(comment_date)
        from " . $wpdb->comments ." wpc
        where wpc.comment_post_id = wp_posts.id AND wpc.comment_approved = 1
    ) as mcomment_date";
    $pieces['orderby'] = "mcomment_date desc";

    return $pieces;
}

add_filter( 'posts_clauses', 'intercept_query_clauses', 20, 1 );

Обратите внимание, что я немного изменил sql для своих собственных целей, но общая концепция та же.

2 голосов
/ 30 июля 2009

В качестве дополнения к ответу Хао Лиана, если вы используете следующий запрос:

select wp_posts.*,
coalesce(
    (
        select max(comment_date)
        from $wpdb->comments wpc
        where wpc.comment_post_id = wp_posts.id
    ),
    wp_posts.post_date
) as mcomment_date
from $wpdb->posts wp_posts
order by mcomment_date desc
limit 10

Смешение в постах, у которых еще нет комментариев, и сортировка по post_date и max (comment_date).

1 голос
/ 16 июля 2010

Код, предложенный Хао Ляном, прекрасно работает, за исключением того, что мы должны добавить следующее предложение WHERE, чтобы не вызывать POST с comment_count = 0, эта ситуация вызвана спам-комментариями.

Предложение WHERE для добавления выглядит следующим образом:

WHERE comment_approved = '1' AND comment_type = '' AND post_password = ''

Полный код после добавления предложения where должен выглядеть следующим образом:

select wp_posts.*, max(comment_date) as comment_date
from wp_posts 
right join wp_comments on id = comment_post_id
WHERE comment_approved = '1' AND comment_type = '' AND post_password = ''
group by ID    
order by comment_date desc
limit 6
0 голосов
/ 03 августа 2016

Это можно сделать, комбинируя WP_Comment_Query с WP_Query, например:

// For performance, limit the number of queried comments, 
// but make it be something big enough to account for "duplicate" posts.

$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( array(   'number' => '100'  ) );

if ( $comments ) {
    foreach ( $comments as $comment ) {

// You'll want to convert the dates from string to integer so you can sort them out later
$comment_utf = strtotime($comment->comment_date);

// Build an array of post IDs with the date of the last published comment
$latest_comments[$comment->comment_post_ID] = $comment_utf;
    }}

// Sort the array by date
arsort($latest_comments); foreach ($latest_comments as $key => $value) {    $posts_ordered[] = $key; }

// The nice thing is that WP_Query will remove duplicates by default
$args = array ( 'posts_per_page'         => '10',   'post__in'  => $posts_ordered, 'orderby' => 'post__in');
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();

// Do your stuff (add the template or whatever)

// If you want to add the comment itself, use this:
$comments = get_comments(array('number' => '1', 'post_id' => $post->ID));
foreach($comments as $comment) :
    echo $comment->comment_content;
endforeach;

// That's about it
    }}
wp_reset_postdata();
0 голосов
/ 01 апреля 2016

Получите 3 новейших комментария для пользовательского типа сообщения «вопрос» независимо от одобрения:

global $wpdb;

$results = $wpdb->get_results(
    "
    SELECT wp_posts.ID, MAX(comment_date) AS max_comment_date
    FROM wp_posts
    RIGHT JOIN wp_comments
    ON id = comment_post_id
    WHERE wp_posts.post_type = 'question'
    AND wp_posts.post_status = 'publish'
    GROUP BY ID
    ORDER BY max_comment_date DESC
    LIMIT 3
    "
);

foreach ($results as $result) {
    $posts_arr[] = $result->ID;
}

$args = array(
    'post_type' => 'question',
    'post__in'  => $posts_arr,
    'orderby'  => 'post__in',
);

$the_query = new WP_Query( $args );
0 голосов
/ 01 декабря 2009

Я думаю, что добавление в функцию max испортит ваши результаты. MySQL не собирается тянуть максимум от каждого. Это собирается вытащить максимум из полного набора. Это запрос, который даст вам ваши результаты:

select wp_posts.*, comment_date
from $wpdb->posts wp_posts
right join $wpdb->comments
on id = comment_post_id
group by ID
order by comment_date desc
limit 10

После этого, если вы хотите следовать соглашению WP, используйте это, и затем вы можете использовать функции, которые использует большинство ваших шаблонов (на основе цикла):

$results = $wpdb->get_results($query) or die('!');
     foreach ($results as $post):
    setup_postdata($post);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...