Домой Каталог: Дополнения WP-Recall Private Message Экспорт сообщений из старого чата в новый
5ответ(ов) в теме
Shtirlitz
не в сети 4 года
На сайте с 20.07.2013
Участник
Тем 83
Сообщения 357
1
04:59

Возможен ли механизм экспорта сообщений из старого чата (аддон Private Message Wp-Recall (Личные сообщения), версия 3.2.0) в новый аддон Rcl Chat (Чат)?

0
Вова (Otshelnik-Fm)
не в сети 1 неделя
На сайте с 27.01.2013
Участник
Тем 43
Сообщения 18653
2
10:43

Я вижу как устроен новый чат и старые личные сообщения - логика таблиц разнится очень сильно. Это и понятно - старые лс не обладали гибкостью. Но нет в программировании невозможного. Ведь есть скрипты миграции с разных движков например форумов на bbpress... К чему это я - все возможно, но стоит усилий и времени. Ну и конечно понимания механизмов обоих систем. Лично я бы за эту задачу не взялся - нет столько свободного времени. Олимпиадникам то это было бы интересно, но не мне.
Так что - в теории - да. А вот кто возьмется за практику?

0
Андрей CS
не в сети 3 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16925
3
13:12

хз, стоило ли это делать после ваших слов в мой адрес, но я написал скрипт переноса сообщений из старого чата в новый.
Порядок действий следущий:

0. Обновляете плагин WP-Recall до версии 15.3.3
Делаете бекап таблиц rcl_chats, rcl_chat_users, rcl_chat_messages.
Это нужно, чтобы их можно было восстановить, если работа скрипта оборвется не дойдя до конца.

1. Размещаете в файле functions.php своего шаблона код:

add_action('wp','rcl_init_transfer_old_messages');
function rcl_init_transfer_old_messages(){
    if(isset($_GET['transfer_old_messages'])){
        $page = (isset($_GET['transfer_page']))? $_GET['transfer_page']: 1;
        rcl_transfer_old_messages($page);
    }
}

function rcl_transfer_old_messages($page){

    global $wpdb;
    
    $number = 3000;//кол-во обрабатываемых сообщений за один проход
    
    $offset = ($page - 1) * $number; 

    $messages = $wpdb->get_results("SELECT * FROM ".RCL_PREF."private_message ORDER BY author_mess DESC LIMIT $offset,$number");

    if(!$messages) wp_die('Сообщений больше нет! <a href="'.get_bloginfo('wpurl').'">На главную</a>');
    
    require_once RCL_PATH.'/add-on/rcl-chat/class-rcl-chat.php';

    $old_room = false;
    foreach($messages as $message){

        $chat_room = rcl_get_private_chat_room($message->author_mess,$message->adressat_mess);

        if($chat_room!=$old_room){
            $chat = new Rcl_Chat(array('chat_room'=>$chat_room,'chat_status'=>'private','user_id'=>$message->author_mess));
        }

        $result = rcl_insert_old_message($chat,$message);

        if(!$result) wp_die('Возникла ошибка!');

        $old_room = $chat_room;

    }
    
    $nextpage = $page + 1;
    
    wp_redirect(get_bloginfo('wpurl').'?transfer_old_messages=go&transfer_page='.$nextpage); exit;

} 

function rcl_insert_old_message($chat,$message){
    global $wpdb;

    $key = explode(':',$chat->chat_room);
    $private_key = ($key[1]==$message->author_mess)? $key[2]: $key[1];

    $message = array(
                'chat_id'=>$chat->chat_id,
                'user_id'=>$message->author_mess,
                'message_content'=>$message->content_mess,
                'message_time'=>$message->time_mess,
                'private_key'=>$private_key,
                'message_status'=>1,
            );

    $result = $wpdb->insert(
        RCL_PREF.'chat_messages',
        $message
    );

    return $result;
}

2. Запускаете работу скрипта, прописав в адресной строке браузера

ваш_домен.ру/?transfer_old_messages=go

После того как скрипт начнет работать индикатор загрузки страницы браузера начнет крутиться, это может продолжаться долго, все зависит от кол-ва сообщений в БД.

3. Если скрипт отработает до конца, то вы увидите надпись "Сообщений больше нет!", после этого можете код удалить.

Примечания: Причиной по которой скрипт может до конца не отработать может быть превышение лимита работы скриптов установленных на сервере. Если это произошло, то Не надо запускать скрипт несколько раз подряд, предварительно восстановите таблицы указанные в пункте 1, иначе в БД появятся дубли сообщений.
Во избежании превышения лимита работы, скрипт автоматически перезапускается обрабатывая за один проход по 3 тысячи сообщений, до тех пор, пока сообщения не закончатся. Вы можете уменьшить кол-во сообщений обрабатываемых за один проход, если сервер все равно останавливает работу скрипта из-за указанного ограничения. Для этого измените в коде строчку

$number = 3000;//кол-во обрабатываемых сообщений за один проход

Я проверил работу скрипта на локальном сервере, в результате было обработано 17 тыс. сообщений и создано около 1,5 тыс. чатов, скрипт отработал нормально.

0
Shtirlitz
не в сети 4 года
На сайте с 20.07.2013
Участник
Тем 83
Сообщения 357
4
14:55

Спасибо, Андрей, завтра попробую.

0
Андрей CS
не в сети 3 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16925
5
17:04

На этом сайте удачно восстановил все старые сообщения этим скриптом.

0
Тема закрыта. Публикация новых сообщений запрещена.