Вниз

12 Июль 2010

4

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 за оригинал статьи.

Еще из рубрики Комповое
4 комментария Прокомментировать

  1. 15 Апр 2014
    Google Chrome 34.0.1847.116 Windows 8.1 x64 Edition

    То, что врач прописал! Спасибо!

  2. Артем
    4 Фев 2015
    Google Chrome 40.0.2214.94 Windows 8.1 x64 Edition

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

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

  3. 10 Окт 2016
    Google Chrome 53.0.2785.143 Windows 10 x64 Edition

    Огромное спасибо, выручили! Я уж собирался вручную как-то всё менять, это была бы жесть! А так 5 минут, и готово.

  4. 10 Окт 2016
    Google Chrome 53.0.2785.143 Windows 10 x64 Edition

    @ Артем:
    На будущее, если у кого ещё вопросы будут. wordpress в данном примере — это имя бд. wp_ — это префикс. Заменяете на свои — и вуаля!

Поделись своими мыслями!

(обязательно)
(обязательно)

Почтовые адреса не публикуются.

Подпишись на комментарии