Сегодня я принял решение полностью, а не кусочками, копировать сообщения этого блога на LiveJournal.com (“Живой журнал”) и позволить пользователям ЖЖ комментировать сообщения там. Причина в том, что многие общаются не выходя из ЖЖ. Пусть тогда читают сообщения и комментируют там. Трудно заставить их переходить на сайт блога и заполнять поля для комментария, когда в ЖЖ они уже “залогинены”. Всё же дополнительные ценные комментарии важнее, чем просто посещения сайта.
В связи с этим пришлось срочно решить вопрос синхронизации комментариев между ЖЖ и этим отдельно стоящим (т.н. stand-alone) блогом. В Интернете было найдено практически готовое решение – плагин LJ Comments Import для WordPress. Этот плагин копирует и затем показывает комментарии ЖЖ среди других “родных” комментариев блога, соблюдая при этом древовидность реплик и ответов на них. Правда ЖЖ-комментарии не могут смешиваться с “местными”, потому что хранятся в разных таблицах. Это решение я нашел правильным – так легче включать/выключать плагин и легче соблюдать сохранность данных.
Во время работы с плагином нашел следующие проблемы. Сначала перечислю то, что я решил, а потом то, что еще не решено.
а) ссылка Reply в конце ЖЖ-комментариев неуместна. Если нажать на нее, то можно написать ответ, который пойдет в блог как “родной” комментарий, но не будет показан в дереве как потомок ЖЖ-комментария, да и не может быть так показан. Решение: убираем ссылку Reply, отредактировав wp-includes/comment-template.php – в функции get-comment-reply-link надо между двумя существующими условиями прописать следующее:
else if ( strpos($comment->comment_author_url, ".livejournal.com") && ($comment->comment_author_email == "@livejournal") ) $link = '';
б) модерировать ЖЖ-комментарии можно только из ЖЖ. Это ничего, даже правильно. Но удаленные на ЖЖ комментарии всё же появляются в блоге. К счастью, в таблице lj_comments_meta автор плагина предусмотрел и поле state, в котором при синхронизации комментариев появляется буковка ‘D’ для удаленных. Поэтому в функции lj_comments_insert в файле lj_comments_import.php запрос для выборки комментариев надо улучшить, чтобы использовалось это поле:
$rez = $wpdb->get_results('SELECT lj.*, u.`username` FROM `'.$table_prefix.'lj_comments` as lj LEFT JOIN `'.$table_prefix.'postmeta` as m ON lj.`jitemid` = m.`meta_value` LEFT JOIN `'.$table_prefix.'lj_comments_users` as u ON lj.`posterid` = u.`id` LEFT JOIN `'.$table_prefix.'lj_comments_meta` as ljmeta ON lj.`id` = ljmeta.`id` WHERE (m.`meta_key` = "ljID") and (m.`post_id` = '.$post->ID.') and (ljmeta.state <> "D") ...
в) код синхронизации в sync_lj_comments.php не использует глобальные настройки текущей инсталяции WordPress. Это не очень хорошо. Если все вручную прописывать, то скрипт можно вызывать из cron как shell-скрипт. Но можно вызывать и по адресу http://полный путь к плагину/sync_lj_comments.php. Поэтому лучше в начале скрипта, вместо всех define’ов и задания $table_prefix прописать следующее:
include $_SERVER['DOCUMENT_ROOT'].'/wp-config.php';
У меня на сервере блоги хостятся в общей базе и префиксами для таблиц автоматически становятся доменные буквы, например, для timh.ru это timhru_, а не стандартный wp_. А плагин может быть использован в разных блогах одновременно. Один общий префикс в скрипте синхронизации всё бы попортил.
г) еще нерешенная проблема: ЖЖ-комментарии не поступают в RSS-ленту комментариев блога. Это не очень хорошо для тех, кто подписан на эту ленту (это проблема хотя бы для Feedburner/Google и меня).
Я написал автору о своих доработках на его страничку. Не знаю, как быстро изменения войдут в официальный код. А пока мои исправления можно скачать тут – lj-comments-import.zip. Внимание: файл comment-template.php должен лечь в wp-includes.
UPD [2010/07/30] ЖЖ изменил алгоритм захода на сайт, и теперь для скачивания комментариев придется указывать чистый пароль. Наверное, пользователи плагина заметили, что комментарии больше не грузятся. У меня было то же самое. Вот исправленный код, который решает проблему – https://rus.timothyha.info/wp-content/plugins/lj-comments-import.zip
После развертывания архива, исправьте в коде sync_lj_comments.php путь к файлу с cookies – $COOKIES_FILE_PATH – укажите, где он у вас реально режит.
В Settings / LJ Comments Import исправлено сохранение пароля в базу – теперь в базе будет храниться не md5, а чистый пароль. Чтобы это состоялось, надо зайти в этот раздел настроек и ввести пароль еще раз и сохранить.
48 комментариев
Здравствуйте. Что-то никак не могу заставить этот скрипт работать, нужные базы создаются, sync_lj_comments.php выполняется без ошибок, но никакой синхронизации не происходит.
У вас всё с листа заработало, или пришлось допиливать ещё что-то, сверх описанного в посте?
Вы используете версию 0.95, или более раннюю?
Благодарствую.
Все, что нужно было доработать, я описал в блоговом сообщении. И вызываю скрипт вручную – AJAX-вариант я не стал использовать.
Ну, я пробовал и вручную – эффект один.
Кстати, как вижу, этот наш тред в ваш блог не импортировался.
Я дергаю http://timh.ru/wp-content/plugins/lj-comments-import/sync_lj_comments.php?s=пароль и тогда импортируется. И это обсуждение тоже.
Хм. А какая у вас версия, скажите точно?
Вся причина в том, что в исправленном архиве неверно указан путь к cookie.txt. Он ведь у всех разный. Исправьте на нужный и будет вам счастье.
Спасибо за информацию!
Уже давно исправил, спасибо)
А лучше вообще убрать пути и оставить так:
curl_setopt($ch, CURLOPT_COOKIEFILE,'cookie.txt'); //get cookie from file
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
тогда на любом блоге будет работать.
Есть идея сделать этот плагин ещё удобнее. Но php даётся туго, потому нужна помощь =)
Сделать удобнее в каком отношении? И тут есть два варианта:
- сделать список предложений автору плагина
- сделать изменения самому, и отдать все автору плагина
Я думаю, начать надо с первого пункта. Вдруг у автора время свободное и желание есть.
Мне кажется автор плагина забил на плагин. Сайта не осталось. Только ссылка на твиттер. Тем более я столкнулся с проблемой в плагине и отсюда родилась новая идея.
Тогда давайте список предложений сюда, я подумаю, смогу ли это сделать.
1. Проблема такова: если удалить коммент в ЖЖ (например спам), то в блоге основном он удаляется, НО общее количество комментариев остаётся (то есть комментариев четыре, а вордпресс пишет, что пять)
2. Переделать импорт комментариев в обычную таблицу. Имя и сайт ведь заполняется нормально. А поле e-mail сделать через имя_журнала@livejournal.com. Тогда комментарии можно будет модерировать и на вордпресс.
1. это починить не сложно, надо при синхронизации вычислять кол-во комментариев заново.
2. я думал об этом, но тогда модерировать придется в двух местах, как в ЖЖ, так и в WP – зачем делать это дважды. Удаленное в ЖЖ же “удаляется” и в WP. Возвращаемся к шагу 1.
А как первый вариант исправить?
Я должен посмотреть код. Отвечу, как смогу в этом разобраться. Если что, моя аська 8801791.
Кстати, в БД “удалённый” комментарий остаётся =) в phpmyadmin только что нашёл.
Как прошла доработка плагина?
Пока еще не занимался этим. Спасибо за напоминание.
У меня один раз обновились комментарии и перестали. Не знаю с чем связано. Пути исправил. Чтение/запись куки поставил. Какие еще могут быть нюансы?
Это нужно отлаживать, поставьте контрольные точки с выводом в какой-нибудь лог-файл. У меня обновляется все из ЖЖ. Я вообще ничего не менял в коде с тех пор, как написал о плагине.
Может быть, вы отключили или сменили плагин синхронизации самих сообщений? Логин и пароль берутся оттуда, насколько я помню.
Да нет… плагин синхронизации работает безотказно.
У меня сегодня тоже перестало обновляться, но только потому что я поменял пароль в ЖЖ, а не обновил его в настройках плагина WP.
Вот где настраивается: Settings / LJ Comments Import Options
В ЖЖ какие-то изменения произошли – опять столкнулся с тем, что комментарии не грузятся. Теперь уже нет параметра login_response в форме, где можно высылать md5-пароль. Надо высылать прямым текстом. Попробую подкорректировать сохранение пароля в базе и файл sync_lj_comments.php – пока сделал некоторым топорным путем вручную, для своего блога.
Обновил свой архив http://timh.ru/wp-content/plugins/lj-comments-import.zip
Исправьте в коде sync_lj_comments.php путь к файлу с cookies – $COOKIES_FILE_PATH
В Settings / LJ Comments Import исправлено сохранение пароля в базу – теперь хранится не md5, а чистый пароль.
Там у вас в файле дважды:
define('DB_NAME', 'blogdb'); // The name of the databasee.txt
define('DB_USER', 'bloguser'); // Your MySQL username
define('DB_PASSWORD', 'blogpass'); // …and passwordl
#define('DB_NAME', ''); // The name of the database
#define('DB_USER', ''); // Your MySQL username
#define('DB_PASSWORD', ''); // …and password
Это ошибка?
Пишет, что синхронизировал: Last successful sync: 30.07.2010 05:00
Но по факту ничего нет… и в таблицах базы пусто
Вы синхронизируете скриптом sync_lj_comments.php или нажимаете кнопку в Dashboard? Кнопка у меня не работает, и я ее не чинил еще.
Кнопкой… сейчас попробую скриптом.
не заметил символ #
В sync_lj_comments.php я использую wp-config.php — оттуда должны загрузиться актуальные логин и пароль базы.
А ничего страшного, что в вашем сохраненном варианте плагина: http://timh.ru/wp-content/plugins/lj-comments-import.zip вбит ваш пароль к БД?
Мне кажется, я его менял перед тем как делать доступный архив. Но в любом случае это не страшно, т.к. наружу MySQL не открыт. Спасибо за сообщение.
При попытке вручную запустить скрипт выдает вот такие ошибки:
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /home/deneoru/public_html/wp-content/plugins/lj_comments_import/sync_lj_comments.php on line 58
Fatal error: Maximum execution time of 30 seconds exceeded in /home/deneoru/public_html/wp-content/plugins/lj_comments_import/sync_lj_comments.php on line 138
Не знаете в какую сторону копать?
> Maximum execution time of 30 seconds
Слишком медленно работает соединение между вашим сервером и сервером ЖЖ.
Первый Warning не критичен, но проверьте, чтобы параметр open_basedir (если он установлен у вас), содержал и путь к той папке, где вы собирались сохранять кукис.
А может быть это из-за слишком большого количества записей в таблице wp_lj_comments? У меня их там 8967. Может этот плагин не успевает пересчитать их все и sql разрывает соединение с базой? Можно где-то увеличить время работы скрипта?
Я не уверен, что в этом проблема – можно замерить время до и после операции в базе данных.
Конечно, можно увеличить время работы скрипта, если ваш хостер это позволяет делать. В начале скрипта надо поставить set_time_limit(0) для работы без ограничений. См. http://php.net/manual/en/function.set-time-limit.php
Спасибо!
Спасибо за советы и время на меня потраченное. Скорее всего, виноваты какие-то другие плагины, коих у меня установлена целая масса. По-скольку я не программист, то думаю, что запустить работу скрипта корректно у меня не получится. Буду ждать чего-нибудь подобного дальше.
Всё. Плагин под wordpress 3.01 «поплыл». Не пашет другими словами.
Спасибо за информацию. Я пока еще не переходил на 3.0.1
Наверное, там надо хакать представление иным образом. В 3.* у вордпресса многое изменилось.
Тимофей, вы не разбирались с работой импорта в 3-м вордпрессе? А то я только сегодня обнаружил, что у меня комментарии перестали импортироваться. Самому ковырять код пока не было времени.
Нет, я не ставил еще 3-й, т.к. помнил, что надо будет плагин править
Как перейду, решу вопрос для себя и других. К сожалению, без личного перехода на 3-й вордпресс сделать это трудно. Спасибо за понимание.
На тройке WP хорошо работает связка:
LJ-XP + lj-comments-import-reloaded
Спасибо, Дмитрий, надо будет проверить. Я сообщил об этом отдельном сообщением в блоге, чтобы знали.
Хорошо, буду там отписываться о найденных багах.