WordPress: решаем проблему отображения неверного количества комментариев

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

Как выяснить, какие посты рассинхронизированы?

Запустите Вашу программу администрирования БД (я использовал PHPMyAdmin для этой задачи) и выполните следующий запрос к базе. Он предполагает, что база называется wordpress, а префикс базы wp_, так что отредактируйте это по своим нуждам.

SELECT wpp.id, wpp.post_title, wpp.comment_count, wpc.cnt
FROM wordpress.wp_posts wpp
LEFT JOIN
(SELECT comment_post_id AS c_post_id, count(*) AS cnt FROM wordpress.wp_comments
 WHERE comment_approved = 1 GROUP BY comment_post_id) wpc
ON wpp.id=wpc.c_post_id
WHERE wpp.post_type IN ('post', 'page')
      AND (wpp.comment_count!=wpc.cnt OR (wpp.comment_count != 0 AND wpc.cnt IS NULL));

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

Рекламная пауза: Если вас интересует широкоформатная печать, то стоит обратиться к профессионалам. Например, в компанию FeelDi.

Как исправить число комментариев автоматически?

Перед следующим действием ОБЯЗАТЕЛЬНО сделайте бэкап базы!!!

Данный запрос исправит число комментариев на верное:

UPDATE wordpress.wp_posts wpp
LEFT JOIN
(SELECT comment_post_id AS c_post_id, count(*) AS cnt FROM wordpress.wp_comments
 WHERE comment_approved = 1 GROUP BY comment_post_id) wpc
ON wpp.id=wpc.c_post_id
SET wpp.comment_count=wpc.cnt
WHERE wpp.post_type IN ('post', 'page')
      AND (wpp.comment_count!=wpc.cnt OR (wpp.comment_count != 0 AND wpc.cnt IS NULL));

Вот и все. Пишите в комментариях о результатах! :)
Огромное спасибо Artem Russakovskii за оригинал статьи.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.

  1. Google Chrome 40.0.2214.94 Windows 8.1 x64 Edition

    Добрый вечер!
    Подскажите, если БД называется по другому и префиксы изменены, то что следует менять?
    И где делать запросы в PHPMyAdmin?

    Заранее благодарю за ответ