Hướng dẫn chuyển thanks từ vbulletin sang xenforo 1.5.x - Convert thanks vbulletin to like xenforo 1.5.x

admin

Administrator
Staff member
Hôm nay tuoitreit.vn xin hướng dẫn các bạn cách chuyển đổi thanks từ vbulletin sang like cho xenforo
Sau khi bạn chuyển đổi mã nguồn sang xenforo thì vấn đề còn lại cần làm là làm sao có thể chuyển đổi thanks sang like được và giữ nguyên số lượng thanks từ vbulletin
Để giữ nguyên thanks và point từ vbulletin sang xenforo bạn làm như sau:
Trên database vbulletin bạn export lại 2 table đó là table postpost_thanks
Sau đó trên database của xenforo bạn import lại 2 table đó vào
Rồi chạy lệnh SQL sau:
Code:
INSERT INTO `xf_liked_content` (content_type, content_id, like_user_id, like_date, content_user_id)
   SELECT 'post', vl.postid, vl.userid, vl.date, post.userid
  FROM `post_thanks` AS vl
  LEFT JOIN `post` AS post ON (post.postid = vl.postid)
ON DUPLICATE KEY UPDATE
  content_id = VALUES(content_id);
Sau khi bạn chạy xong thì số like vẫn chưa cập nhật và chỉ hiển thị "you like this post" hoặc "1 person like this post"
Để hiển thị số like và tên người like bạn làm như sau:
Lưu file này với tên tuoitreit.php và chạy nó, bạn lưu ý là để thời gian time out trên server dài vào nhé, vì nếu lượng data của bạn lớn thì nó sẽ mất nhiều thời gian để chạy và bạn để time out ít thì sẽ không được

Code:
<?php

$startTime = microtime(true);
$fileDir = dirname(__FILE__);

require($fileDir . '/library/XenForo/Autoloader.php');
XenForo_Autoloader::getInstance()->setupAutoloader($fileDir . '/library');

XenForo_Application::initialize($fileDir . '/library', $fileDir);
XenForo_Application::set('page_start_time', $startTime);

####################

ini_set('max_execution_time', 5000);
ini_set('memory_limit', -1);
ini_set('display_errors', true);
ini_set('display_startup_errors', true);

$db = XenForo_Application::get('db');

$batchSize = 1000;

$contentTypes = array(
    'profile_post',
    'post'
);

echo "Dang rebuild lai tong so like cho thanh vien . . . ";

// REBUILD TONG SO LIKE CHO THANH VIEN
$db->query("
    UPDATE xf_user AS u
    SET u.like_count = (
        SELECT COUNT(*)
        FROM xf_liked_content AS lc
        INNER JOIN xf_user_authenticate AS ua ON (ua.user_id = lc.like_user_id)
        WHERE lc.content_user_id = u.user_id
    )
");

echo "Thanh cong!<br /><br />";

foreach ($contentTypes AS $contentType)
{
    echo "Dang rebuild lai tong so like cho {$contentType}s . . . ";

    // REBUILD LAI TONG SO LIKE CHO NOI DUNG
    $db->query("
        UPDATE xf_{$contentType} AS content
        SET content.likes = (
            SELECT COUNT(*)
            FROM xf_liked_content AS lc
            INNER JOIN xf_user AS u ON (u.user_id = lc.like_user_id)
            WHERE lc.content_type = ?
            AND lc.content_id = content.{$contentType}_id
        )
    ", $contentType);

    echo "Thanh cong!<br />";

    $totalIds = $db->fetchOne("
        SELECT COUNT(*)
        FROM xf_{$contentType}
        WHERE likes > 0
    ");

    echo "Dang rebuild lai cache cho {$contentType}s . . . ";

    // REBUILD SERIAL CACHE OF RECENT LIKERS

    // CHO 0 LIKE
    $db->query("
        UPDATE xf_{$contentType}
        SET like_users = 'a:0:{}'
        WHERE likes = 0
    ");

    // CHO LIKE KHAC 0
    for ($offset = 0; $offset < $totalIds; $offset += $batchSize)
    {
        $ids = $db->fetchCol("
            SELECT {$contentType}_id
            FROM xf_{$contentType}
            WHERE likes > 0
            ORDER BY {$contentType}_id
            ASC
            LIMIT {$offset}, {$batchSize}
        ");

        foreach ($ids AS $id)
        {
            $likes = $db->fetchAll("
                SELECT lc.like_user_id, u.username
                FROM xf_liked_content AS lc
                INNER JOIN xf_user AS u ON (u.user_id = lc.like_user_id)
                WHERE lc.content_type = ?
                AND lc.content_id = ?
                ORDER BY lc.like_date
                DESC
                LIMIT 0, 5
            ", array($contentType, $id));

            $writeVal = array();
            foreach ($likes AS $like)
            {
                $writeVal[] = array(
                    'user_id' => $like['like_user_id'],
                    'username' => $like['username']
                );
            }

            $writeVal = serialize($writeVal);

            $db->query("
                UPDATE xf_{$contentType}
                SET like_users = ?
                WHERE {$contentType}_id = ?
            ", array($writeVal, $id));

            unset($id, $likes, $like, $writeVal);
        }

        unset($ids);
    }

    echo "Thanh cong!<br /><br />";
}

echo "Tat ca da hoan tat roi, cam on ban da ung ho tuoitreit.vn!";
Mọi sao chép vui lòng ghi rõ nguồn tuoitreit.vn
Chúc các bạn thành công!
 
Last edited:

thaidt

New Member
Hình như code này giờ ko còn dùng được nữa phải không ads? Mình test trên server nginx thấy báo lỗi 500
 

Facebook Comments


New posts New threads New resources

Top