Импорт комментариев из ЖЖ в stand-alone блог на WordPress

Сегодня я принял решение полностью, а не кусочками, копировать сообщения этого блога на 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] ЖЖ изменил алгоритм захода на сайт, и теперь для скачивания комментариев придется указывать чистый пароль. Наверное, пользователи плагина заметили, что комментарии больше не грузятся. У меня было то же самое. Вот исправленный код, который решает проблему – http://timh.ru/wp-content/plugins/lj-comments-import.zip

После развертывания архива, исправьте в коде sync_lj_comments.php путь к файлу с cookies – $COOKIES_FILE_PATH – укажите, где он у вас реально режит.

В Settings / LJ Comments Import исправлено сохранение пароля в базу – теперь в базе будет храниться не md5, а чистый пароль. Чтобы это состоялось, надо зайти в этот раздел настроек и ввести пароль еще раз и сохранить.

Запись опубликована в рубрике Software с тэгами , , . Создать закладку наpermalink. Оставить комментарийили trackback:Trackback URL.

48 комментариев

  1. Опубликован 2010/04/06 в 04:56 | Прямая ссылка

    Здравствуйте. Что-то никак не могу заставить этот скрипт работать, нужные базы создаются, sync_lj_comments.php выполняется без ошибок, но никакой синхронизации не происходит.
    У вас всё с листа заработало, или пришлось допиливать ещё что-то, сверх описанного в посте?
    Вы используете версию 0.95, или более раннюю?

    Благодарствую.

  2. Опубликован 2010/05/18 в 04:50 | Прямая ссылка

    А лучше вообще убрать пути и оставить так:

    curl_setopt($ch, CURLOPT_COOKIEFILE,'cookie.txt'); //get cookie from file
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');

    тогда на любом блоге будет работать.

  3. Опубликован 2010/05/28 в 07:24 | Прямая ссылка

    Есть идея сделать этот плагин ещё удобнее. Но php даётся туго, потому нужна помощь =)

    • Опубликован 2010/05/28 в 07:28 | Прямая ссылка

      Сделать удобнее в каком отношении? И тут есть два варианта:

      - сделать список предложений автору плагина
      - сделать изменения самому, и отдать все автору плагина

      Я думаю, начать надо с первого пункта. Вдруг у автора время свободное и желание есть.

      • Опубликован 2010/05/28 в 07:31 | Прямая ссылка

        Мне кажется автор плагина забил на плагин. Сайта не осталось. Только ссылка на твиттер. Тем более я столкнулся с проблемой в плагине и отсюда родилась новая идея.

        • Опубликован 2010/05/28 в 07:32 | Прямая ссылка

          Тогда давайте список предложений сюда, я подумаю, смогу ли это сделать.

  4. Опубликован 2010/05/28 в 07:37 | Прямая ссылка

    1. Проблема такова: если удалить коммент в ЖЖ (например спам), то в блоге основном он удаляется, НО общее количество комментариев остаётся (то есть комментариев четыре, а вордпресс пишет, что пять)

    2. Переделать импорт комментариев в обычную таблицу. Имя и сайт ведь заполняется нормально. А поле e-mail сделать через имя_журнала@livejournal.com. Тогда комментарии можно будет модерировать и на вордпресс.

    • Опубликован 2010/05/28 в 07:41 | Прямая ссылка

      1. это починить не сложно, надо при синхронизации вычислять кол-во комментариев заново.

      2. я думал об этом, но тогда модерировать придется в двух местах, как в ЖЖ, так и в WP – зачем делать это дважды. Удаленное в ЖЖ же “удаляется” и в WP. Возвращаемся к шагу 1.

      • Опубликован 2010/05/28 в 07:44 | Прямая ссылка

        А как первый вариант исправить?

        • Опубликован 2010/05/28 в 07:45 | Прямая ссылка

          Я должен посмотреть код. Отвечу, как смогу в этом разобраться. Если что, моя аська 8801791.

          • Опубликован 2010/05/28 в 08:08 | Прямая ссылка

            Кстати, в БД “удалённый” комментарий остаётся =) в phpmyadmin только что нашёл.

  5. Опубликован 2010/07/12 в 01:16 | Прямая ссылка

    Как прошла доработка плагина?

    • Опубликован 2010/07/12 в 02:44 | Прямая ссылка

      Пока еще не занимался этим. Спасибо за напоминание.

      • Опубликован 2010/07/12 в 02:56 | Прямая ссылка

        У меня один раз обновились комментарии и перестали. Не знаю с чем связано. Пути исправил. Чтение/запись куки поставил. Какие еще могут быть нюансы?

        • Опубликован 2010/07/12 в 02:58 | Прямая ссылка

          Это нужно отлаживать, поставьте контрольные точки с выводом в какой-нибудь лог-файл. У меня обновляется все из ЖЖ. Я вообще ничего не менял в коде с тех пор, как написал о плагине.

        • Опубликован 2010/07/12 в 02:59 | Прямая ссылка

          Может быть, вы отключили или сменили плагин синхронизации самих сообщений? Логин и пароль берутся оттуда, насколько я помню.

          • Опубликован 2010/07/12 в 05:37 | Прямая ссылка

            Да нет… плагин синхронизации работает безотказно.

        • Опубликован 2010/07/14 в 02:32 | Прямая ссылка

          У меня сегодня тоже перестало обновляться, но только потому что я поменял пароль в ЖЖ, а не обновил его в настройках плагина WP.

          Вот где настраивается: Settings / LJ Comments Import Options

        • Опубликован 2010/07/29 в 14:46 | Прямая ссылка

          В ЖЖ какие-то изменения произошли – опять столкнулся с тем, что комментарии не грузятся. Теперь уже нет параметра login_response в форме, где можно высылать md5-пароль. Надо высылать прямым текстом. Попробую подкорректировать сохранение пароля в базе и файл sync_lj_comments.php – пока сделал некоторым топорным путем вручную, для своего блога.

          • Опубликован 2010/07/29 в 23:40 | Прямая ссылка

            Обновил свой архив http://timh.ru/wp-content/plugins/lj-comments-import.zip

            Исправьте в коде sync_lj_comments.php путь к файлу с cookies – $COOKIES_FILE_PATH

            В Settings / LJ Comments Import исправлено сохранение пароля в базу – теперь хранится не md5, а чистый пароль.

          • Опубликован 2010/07/30 в 04:37 | Прямая ссылка

            Там у вас в файле дважды:

            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

            Это ошибка?

          • Опубликован 2010/07/30 в 05:02 | Прямая ссылка

            Пишет, что синхронизировал: Last successful sync: 30.07.2010 05:00

            Но по факту ничего нет… и в таблицах базы пусто :(

          • Опубликован 2010/07/30 в 05:32 | Прямая ссылка

            Вы синхронизируете скриптом sync_lj_comments.php или нажимаете кнопку в Dashboard? Кнопка у меня не работает, и я ее не чинил еще.

          • Опубликован 2010/07/30 в 05:53 | Прямая ссылка

            Кнопкой… сейчас попробую скриптом.

          • Опубликован 2010/07/30 в 05:02 | Прямая ссылка

            не заметил символ #

          • Опубликован 2010/07/30 в 05:33 | Прямая ссылка

            В sync_lj_comments.php я использую wp-config.php — оттуда должны загрузиться актуальные логин и пароль базы.

  6. Опубликован 2010/07/12 в 06:55 | Прямая ссылка

    А ничего страшного, что в вашем сохраненном варианте плагина: http://timh.ru/wp-content/plugins/lj-comments-import.zip вбит ваш пароль к БД?

    • Опубликован 2010/07/12 в 06:56 | Прямая ссылка

      Мне кажется, я его менял перед тем как делать доступный архив. Но в любом случае это не страшно, т.к. наружу MySQL не открыт. Спасибо за сообщение.

  7. Опубликован 2010/07/12 в 07:07 | Прямая ссылка

    При попытке вручную запустить скрипт выдает вот такие ошибки:

    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

    Не знаете в какую сторону копать?

    • Опубликован 2010/07/12 в 07:10 | Прямая ссылка

      > Maximum execution time of 30 seconds
      Слишком медленно работает соединение между вашим сервером и сервером ЖЖ.

      Первый Warning не критичен, но проверьте, чтобы параметр open_basedir (если он установлен у вас), содержал и путь к той папке, где вы собирались сохранять кукис.

      • Опубликован 2010/07/14 в 01:37 | Прямая ссылка

        А может быть это из-за слишком большого количества записей в таблице wp_lj_comments? У меня их там 8967. Может этот плагин не успевает пересчитать их все и sql разрывает соединение с базой? Можно где-то увеличить время работы скрипта?

        • Опубликован 2010/07/14 в 02:36 | Прямая ссылка

          Я не уверен, что в этом проблема – можно замерить время до и после операции в базе данных.

          Конечно, можно увеличить время работы скрипта, если ваш хостер это позволяет делать. В начале скрипта надо поставить set_time_limit(0) для работы без ограничений. См. http://php.net/manual/en/function.set-time-limit.php

  8. Опубликован 2010/07/12 в 07:34 | Прямая ссылка

    Спасибо за советы и время на меня потраченное. Скорее всего, виноваты какие-то другие плагины, коих у меня установлена целая масса. По-скольку я не программист, то думаю, что запустить работу скрипта корректно у меня не получится. Буду ждать чего-нибудь подобного дальше.

  9. Опубликован 2010/08/06 в 17:02 | Прямая ссылка

    Всё. Плагин под wordpress 3.01 «поплыл». Не пашет другими словами.

    • Опубликован 2010/08/06 в 23:00 | Прямая ссылка

      Спасибо за информацию. Я пока еще не переходил на 3.0.1

      Наверное, там надо хакать представление иным образом. В 3.* у вордпресса многое изменилось.

  10. Опубликован 2010/11/07 в 16:43 | Прямая ссылка

    Тимофей, вы не разбирались с работой импорта в 3-м вордпрессе? А то я только сегодня обнаружил, что у меня комментарии перестали импортироваться. Самому ковырять код пока не было времени.

    • Опубликован 2010/11/07 в 17:02 | Прямая ссылка

      Нет, я не ставил еще 3-й, т.к. помнил, что надо будет плагин править :-)

      Как перейду, решу вопрос для себя и других. К сожалению, без личного перехода на 3-й вордпресс сделать это трудно. Спасибо за понимание.

    • Опубликован 2011/03/29 в 20:41 | Прямая ссылка

      На тройке WP хорошо работает связка:

      LJ-XP + lj-comments-import-reloaded

      • Опубликован 2011/03/30 в 05:36 | Прямая ссылка

        Спасибо, Дмитрий, надо будет проверить. Я сообщил об этом отдельном сообщением в блоге, чтобы знали.

Оставить комментарий

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

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Spam protection by WP Captcha-Free

Subscribe without commenting