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 отличается от реального числа. Слева отображаются кэшированное, справа — реальное число комментов.
Как исправить число комментариев автоматически?
Перед следующим действием ОБЯЗАТЕЛЬНО сделайте бэкап базы!!!
Данный запрос исправит число комментариев на верное:
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.
Еще по теме:


