Пользовательский запрос комментариев WP с разбиением на страницы и порядком?


Я пытаюсь настроить пользовательский WP_Comment_Query, который упорядочен по мета-ключу. (Возможно, стоит упомянуть, что эти комментарии извлекаются с помощью AJAX.)

Все это работает нормально, пока я не добавлю разбивку на страницы в аргументы запроса.

$orderby = 'top-comments';

$args = array(
    'post_id' => $post_id,
    'type' => 'comment',
    'status' => 'approve',
    'hierarchical' => true
);

if ( $orderby == 'top-comments' ) {
    $args['meta_key'] = 'comment_rating';
    $args['orderby'] = 'meta_value_num';
    $args['order'] = 'ASC';
}

// $comments_query = new WP_Comment_Query;
// $comments = $comments_query->query($args);

// Works fine up until I add the pagination args

$number = 5;
$paged = 1;

$args['number'] = $number;
$args['paged'] = $paged;

$comments_query = new WP_Comment_Query;
$comments = $comments_query->query($args);

// Gets the 5 latest comments, then orders those by meta_key

Результаты без аргументов разбиения на страницы работают идеально и упорядочивают комментарии именно так, как я этого хочу.

Однако, как только аргумент number будет установлен, он получит самые новые 5 комментариев, а затем упорядочит их по meta_key => 'comment_rating'.

Поведение, которое я ожидаю, - это WP_Comment_Query , сначала применяющий orderby, а затем возвращающий 5 лучших результатов.

Что я делаю не так?

Author: Swen, 2017-04-12

2 answers

Цель состояла в том, чтобы разбить комментарии на страницы, показав сначала комментарии с наибольшим comment_rating мета-значением.

Благодаря ответу cjbj и комментариям Мило и биргире я нашел довольно неинтуитивное решение этой проблемы.

С помощью number и offset Я смог сделать результаты в правильном порядке, но разбивка на страницы была странной, и каждые 5 сообщений, казалось бы, "переворачивались" на каждой странице.

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

$orderby = 'top-comments';

$args = array(
    'post_id' => $post_id,
    'type' => 'comment',
    'status' => 'approve',
    'hierarchical' => true
);

if ( $orderby == 'top-comments' ) {
    $args['meta_key'] = 'comment_rating';
    $args['orderby'] = 'meta_value_num';
    $args['order'] = 'ASC';
}

// 5 Comments per page
$comments_per_page = $number = 5; 

// Get the comment count to calculate the offset
$comment_count = wp_count_comments($post_id)->approved;

// Currently page 1 (set with AJAX in my case)
$page = 1;

// Rather unintuitively, we start with the total amount of comments and subtract
// from that number 
// This is nessacary so that comments are displayed in the right order
// (highest rated at the top, lowest rated at the bottom)

// Calculate offset
$offset = $comments_count - ($comments_per_page * $page);

// Calculate offset for last page (to prevent comments being shown twice)
if ( $offset < 0 ) {
    // Calculate remaining amount of comments (always less than 5)
    $comments_last_page = $comments_count % $comments_per_page;

    // New offset calculated from the amount of remaining comments
    $offset = $offset + $comments_per_page - $comments_last_page;

    // Set how many comments the last page shows
    $number = $comments_last_page; 
}

// Then we pass the $number and the $offset to our query args
$args['number'] = $number;
$args['offset'] = $offset;

$comments_query = new WP_Comment_Query;
$comments = $comments_query->query($args);

// Result: 5 comments, starting with the highest rating at the top, and the
// lowest rated at the bottom
 4
Author: Swen, 2017-04-19 16:23:40

Если вы взглянете на wp_comment_query класс, вы увидите, что параметра paged нет. Если вы затем посмотрите на wp_list_comments, который позволяет разбивать страницы на страницы, вы увидите, что он вызывает длинную функцию walker для разбиения комментариев на страницы.

Итак, если вы хотите сами разбить комментарии на страницы, вы занимаетесь нетривиальным программированием. Основой будут параметры number и offset, доступные с помощью wp_comments_query. Если вам нужно пять комментариев на страницу, вам понадобится параметры, подобные этому:

page 1: offset=0, number=5
page 2: offset=5, number=5
page 2: offset=10, number=5

В принципе, вам нужно будет получить страницу из query_var вашей страницы, а затем рассчитать желаемое смещение. Имейте в виду, что в wp_comment_query также нет параметра max_num_pages, поэтому будет трудно узнать, сколько комментариев содержится в вашем выборе.

Возможно, было бы проще каждый раз получать полный список комментариев и решать разбиение на страницы в PHP, а не в запросе.

 2
Author: cjbj, 2017-04-18 08:34:09