Автономная страница комментариев Wordpress — с нумерацией страниц

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


Я не уверен, как это сделать, но вот некоторые из функций, которые я изучил до сих пор:

  1. get_comments – если post_id не передано, возвращаются все комментарии. Однако я не вижу способа разбить их на страницы (есть варианты offset и number, с которыми можно повозиться, но это очень утомительно делать вручную).

  2. wp_list_comments — документация по этому вопросу довольно плохая, но исходный код предполагает, что мы можем перебрать все комментарии если используется вместе с get_comments, путем передачи массива get_comments в качестве второго аргумента. Это, однако, по-прежнему будет использовать get_comments, чтобы на самом деле... ну, получить комментарии, и, похоже, нет способа разбить это на страницы.

  3. previous_comments_link & next_comments_link — похоже, они работают только в сочетании с wp_list_comments (без второго аргумента).

  4. paginate_comments_links — также похоже, что это работает только с wp_list_comments (без второго аргумента).


Что я пробовал:

  1. Просто используя аргумент number в get_comments:

    $comments = get_comments(array(
        'status'    => 'approve',
        'number'    => '2'
    ));
    
    wp_list_comments(array(
        'callback' => 'my_rendering_function'
    ), $comments);
    
    paginate_comments_links();
    

    Это не отображает никаких ссылок на страницы.

  2. Метод, предлагаемый здесь: Показать последние комментарии на странице с нумерацией страниц< /сильный>

    $comments = get_comments(array(
        'status' => 'approve'
    ));
    
    wp_list_comments('per_page=2', $comments);
    
    paginate_comments_links();
    

    Это тоже не работает (показывает первые 2 комментария, но без разбиения на страницы). Кроме того, я съёживаюсь, когда get_comments загружаю в память все комментарии.


Вопрос:

Как разбить на страницы все комментарии?


P.S. Я использую WordPress 3.4.1 и PHP 5.3.2.


person MegaHit    schedule 03.09.2012    source источник
comment
я не вижу прямого способа сделать это, и вам, в конце концов, нужно использовать offset и number, чтобы получить необходимые комментарии для отображения. Взгляните на плагин SEO pager, и вы можете получить там функциональность разбивки на страницы, иначе используйте пользовательские циклы WordPress для достижения вашей функциональности.   -  person Umesh Awasthi    schedule 03.09.2012
comment
@UmeshAwasthi. Вы читали публикацию со ссылкой? Кажется, должен быть способ сделать это. Я что-то неправильно понимаю?   -  person MegaHit    schedule 03.09.2012


Ответы (2)


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

Я построил ниже то, что буду использовать, дайте мне знать, если это поможет.

#Config here.
define('DEFAULT_COMMENTS_PER_PAGE',100);

$page = (int) (!isset($_REQUEST["page"]) ? 1 : $_REQUEST["page"]);
$limit = DEFAULT_COMMENTS_PER_PAGE;
$offset = ($page * $limit) - $limit;
$param = array(
    'status'=>'approve',
    'offset'=>$offset,
    'number'=>$limit,
);
$total_comments = get_comments(array('status'=>'approve'));
$pages = ceil(count($total_comments)/DEFAULT_COMMENTS_PER_PAGE);
$comments = get_comments($param);
foreach($comments as $comment) {
    // ECHO THE AUTHOR AND COMMENT
    echo("<strong>{$comment->comment_author}</strong> - {$comment->comment_content}");
}
$args = array(
'base'         => 'https://example.com/all-comments/%_%',
'format'       => '?page=%#%',
'total'        => $pages,
'current'      => $page,
'show_all'     => False,
'end_size'     => 1,
'mid_size'     => 2,
'prev_next'    => True,
'prev_text'    => __('&laquo; Previous'),
'next_text'    => __('Next &raquo;'),
'type'         => 'plain');
// ECHO THE PAGENATION 
echo paginate_links( $args );
person PsyKzz    schedule 11.09.2012
comment
Просто чтобы улучшить мой предыдущий ответ, вам не нужно физически извлекать все комментарии, но вы должны хотя бы знать x перед тем, где вы находитесь. Например, на странице 25 вы можете захотеть показать что-то вроде 1,2,3,4,... и поэтому вам нужно знать, достаточно ли у вас комментариев, чтобы заполнить эти страницы, или вы должны остановиться раньше. просто получение 4x25 поможет вам узнать эту информацию. Если вы хотите узнать общее количество страниц, вам все равно нужно знать общее количество комментариев. - person PsyKzz; 11.03.2014
comment
Этот код работает, но в строке 14 @PsyKzz, вероятно, имел в виду: $comments = get_comments($param); - person lflier; 04.05.2019
comment
И в строке 20 вы также можете указать базовый URL-адрес для функции разбивки на страницы, например. 'base' => 'https://example.com/all-comments/%_%'. Дополнительную информацию см. в справочнике по функциям для paginate_links(). Разбиение на страницы не сработало бы для меня, если бы я не сделал этого. - person lflier; 04.05.2019

Мы должны беспокоиться о производительности, используя get_comments() для получения общего количества комментариев. Должен использовать смещение параметра как ложное и считаться истинным, например:

$comments_per_page = 2;
$page = 2;

//MYSQL: LIMIT offset, number
$params = array(
    'post_id' => $post_id,
    'offset' => (--$page) * $comments_per_page,
    'number' => $comments_per_page,
);

$comments = get_comments( $params );
$total_comments = get_comments(
    array_merge($params, 
            array(
                'count' => true,
                'offset' => 0,
                'number' => 0
            )
    )
);


$args = array(
    'total'     => ceil( $total_comments / $comments_per_page ),
    'current'   => max( 1, $page ),
);

$pagination = paginate_links( $args );

Добавьте любой параметр, который вам нужен. Вы можете использовать wp_list_comments() как weel, но если вы хотите настроить выходной HTML, используйте foreach для $comments:

foreach ( $comments as $comment ) :

    echo $comment->comment_date;
    echo '<br>';
    echo $comment->comment_author;
    echo '<br>';
    echo $comment->comment_content;

endforeach;
person Leo Caseiro    schedule 23.01.2015