У меня где-то с десяток действующих сайтов на WP, и 4 из них ежедневно генерят комментарии. Я против предмодерации и регистрации, поэтому у меня на сайтах на WP может писать кто угодно что угодно и когда угодно. Но потом прихожу я и удаляю плохие комментарии :) В последнее время этих комментариев становится по 150-250 в день, и постмодерировать их средствами WP становится очень неудобно. (Скажу сразу две вещи: 1) готового скрипта по сабжу в посте нет :) 2) мне захотелось подробно описать процесс придумывания очередной фичи, поэтому ниже много букв.)

Судите сами — открываю почтовую программу, в папке с комментариями с утра около 120 писем с каментами. Тыркаю на первое письмо, читаю коммент, если норм иду дальше, если нет — тыркаю на ссылку «trash it». Иду дальше, смарю след. письмо-коммент. Прокликав все письма иду в браузер (да-да, после тырка на «trash-it» для каждого удаляемого коммента открываеца отдельная страница с подтверждением данного действа), в котором открыто 30-50 вкладок (именно столько удаляется комментариев), прохожу их всех, кликая на кнопку «да, в корзину».

На каждый удаляемый коммент тратица 4 клика — это нихуя не правильно. И я решил сделать свою админку для постмодерации комментариев WP, с блекджеком и шлюхами!

Итак, чего хочеца — чтоб все комменты были одним списком, и одним кликом бы удалялись. И чтоб все каменты были со всех блогов, в одном месте.

Идем в БД WP и смотрим, как там что происходит. Есть таблица «wp-comments», в которой лежат все комментарии, привязанные к таблице с постами «wp_posts» через поле «comment_post_ID». Также есть поле в таблице с постами «comment_count», которое, судя по названию, отображает кол-во комментариев к посту (сделано, видимо, чтоб сэкономить на запросах к БД). Чтобы удалить комментарий, нам нада удалить строку в таблице «wp-comments» и уменьшить на единицу значение в поле «comment_count» у соответствующего поста. Все просто :)

Хотя нет, есть еще один момент — как мы будем определять, какой комментарий прошел проверку, а какой нет? Можно сделать по-разному, но я решил сделать по-простому — мы будем хранить только одно значение — id последнего (наибольшее значение) комментария, который мы проверили. Данный подход имеет много плюсов — не изменяется БД, все поля комментариев юзаюца по назначению, не создается дополнительных таблиц и колонок. Минус как мне кажеца только один — довольно неочевидная обработка этого значения в процессе модерации.

Где мы будем хранить это значение? тут тоже можно выбрать — либо в файле, либо где-то в БД. В файле мне не нравится — зачем создавать доп.сущности. А вот в БД есть одно место, где этот параметр будет вполне в тему — таблица «wp_settings». Там хранятся все основные настройки блога, туда же можно впихнуть любые переменные, что мы и сделаем.

Отлично, теоретическая база по механизму готова, осталось придумать, как это будет на веб-морде. Идеальный вариант — када выводится скажем 100 комментариев, мы их скроллим, читаем, напротив каждого камента — ссылка/кнопка «удалить», по нажатии которой коммент удаляется без перезагрузки страницы. Да, круто, но есть один косяк — как мы определим, какие комментарии проверены, а какие нет? Ставить напртив каждого камента галочки? Хрень ведь, лишний клик…

Я решил организовать немного по-другому — список комментариев, напртив каждого большая галка «удалить?». Читаем каменты, находим для удаления, отмечаем галкой. А внизу списка кнопка типа «принять». После ее нажатия происходит удаление помеченных записей из таблицы «wp_comments», уменьшается на единицу счетчик каментов в «wp_posts», записывается максимальное ID из показанных комментариев в «wp_settings» и происходит запрос к БД — есть ли комментарии, старше максимального в «wp_settings». Если есть — выводим в том же виде. И так далее, пока не будут проверены все комментарии.

Выводить комментарии лучше с названием темы и названием блога, а чекбоксы на удаление делать большими, чтоб легче было попасть мышой.

Есть еще один вариант — установить php-класс для работы с pop3 и принимать им почту в виде комментариев, и уже обрабатывать таким образом. Этот вариант подходит тем, у кого много блогов и они на разных серверах, а удаленный коннект к БД не поддерживается. У меня основные WP-сайты на одном сервере, так что мне было проще сделать как я писал выше.