Недавно обнаружил странную ситуацию – вдруг перестали загружаться  страницы сайта, на который размещены самые популярные и комментируемые статьи. Изучив изучил этот глюк wordpress и выяснил, что во всем виноваты комментарии, а точнее их большое количество, более 5000, из-за чего вы видите просто белое окно браузера. По сути, решить данную проблему можно двумя способами:

  1. Удалить все старые комментарии;
  2. Отображать лишь актуальные комментарии.

Конечно, первый случай достаточно радикальный, но с другой стороны, какая польза от записей 2-х летней давности, никто не будет смотреть даже 10 листов сообщений. Но все же мне захотелось изучить второй вариант решения проблемы.

Ставим перед собой задачу: отображать, например 500 последних комментариев на странице блога. Начнем сначала. В шаблоне single.php отображены комментарии страницы, в нем необходимо найти такую запись:

[php]<?php comments_template(); ?>[/php]

Она означает, что за комментарии в шаблоне отвечает файл comments.php, и все что нам нужно, находится именно там. Вы увидите приблизительно такой код:

[php]
<pre><?php if ((have_comments()) && (get_comments_number() > 0)) : ?>
<h3><?php comments_number(‘Нет комментариев’, ‘1 комментарий’, ‘Комментариев — %’ );?> к статье <strong><?php the_title(); ?></strong></h3>
<div style=»text-align: center;»><?php paginate_comments_links(); ?></div>
<ol>
<?php wp_list_comments(‘callback=mytheme_comment’); ?>
</ol>
<div style=»text-align: center;»><?php paginate_comments_links(); ?></div></pre>
[/php]

Это условие для проверки комментариев к посту, а функция paginate_comments_links нужна для вывода навигации, wp_list_comments – задает правильный формат изображения записей – где выводить аватар, как его выводить, имя автора, тексты. А определяется это с помощью функции mytheme_comment, ее можно найти в файле functions.php (немного запутано).

Для решения нашей проблемы нужно либо перед условием (if), либо после этой строки добавить get_comments:

[php]
<div>
<div>
<pre><?php $comments = get_comments( array( ‘number’ => 500, ‘order’ => ‘DESC’, ‘status’ => ‘approve’, ‘post_id’ => get_the_ID() ) ); ?></pre>
</div>
</div>
[/php]

Эту функцию используют для получения и отображения комментариев, рассмотрим подробно:

$status — выборка записей  указанного типа:

  •  ‘hold’ – не утвержденные,
  •  ‘approve’ – утвержденные,
  •  ‘spam’ – спам,
  •  ‘trash’ – удаленные.

$orderby – выставляется сортировка комментариев, дата (comment_date_gmt) – по умолчанию.

$order – определяем порядок сортировки ‘ASC’ и ‘DESC’,DESC – от новых к старым – по умолчанию.

$number —  количество комментариев для выборки.

$offset – смещение для последних комментариев –  выставляем число ($number) записей какое нужно «пропустить» перед выборкой.

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

Мы определили, что для вызова get_comments показывать надо лишь 500 комментариев  и только для текущего поста. За это отвечает функция get_the_ID. Еще укажите статус (status) для комментариев, чтобы туда не попал спам, или не подтвержденные записи.

Последнее что можно сделать, это в административной панели wordpress, в разделе «Параметры», найти вкладку «Обсуждение», там есть настройки для страниц с комментариями.

Сначала, в блоге было мною настроено так, что сверху отображались самые последние страницы, а по умолчанию загружалась последняя страница с комментариями. А после применения хака и функции get_comments все это стало криво работать. Поэтому, в настройках, в опции самой первой загрузки выбрал «старые комментарии сверху», и что самое интересное все стало работать правильно, т. е. сверху начал подгружаться новые комментарии, может глюк системы, а может странная специфика функции.