phpcms遷移ujcms,欄目遷移

<?php
/**
 * PHPCMS 欄目數(shù)據(jù)遷移到 UJCMS 腳本(適配 ujcms_channel 表)
 * 注意:執(zhí)行前務必備份 UJCMS 數(shù)據(jù)庫!
 */

// 1. 基礎配置
$phpcms_db = [
    'host' => '127.0.0.1',
    'user' => 'root',
    'pwd' => '',
    'dbname' => 'test2',
    'charset' => 'utf8mb4'
];

$ujcms_db = [
    'host' => '127.0.0.1',
    'user' => 'root',
    'pwd' => '',
    'dbname' => 'test3',
    'charset' => 'utf8mb4'
];

$default_config = [
    'site_id_' => 1,
    'channel_model_id_' => 12,
    'article_model_id_' => 11,
    'performance_type_id_' => null,
    'default_alias_prefix' => 'cat_'
];

// 2. 數(shù)據(jù)庫連接
function connectDB($config) {
    $conn = mysqli_connect(
        $config['host'],
        $config['user'],
        $config['pwd'],
        $config['dbname']
    );
    if (!$conn) die("數(shù)據(jù)庫連接失?。? . mysqli_connect_error());
    mysqli_set_charset($conn, $config['charset']);
    return $conn;
}
$phpcms_conn = connectDB($phpcms_db);
$ujcms_conn = connectDB($ujcms_db);


// 3. 關鍵調(diào)整:臨時關閉UJCMS外鍵約束(避免子欄目先導入的問題)
mysqli_query($ujcms_conn, "SET FOREIGN_KEY_CHECKS = 0");


// 4. 獲取UJCMS最大ID(避免主鍵沖突)
$max_id_sql = "SELECT IFNULL(MAX(id_), 0) as max_id FROM ujcms_channel";
$max_id_result = mysqli_query($ujcms_conn, $max_id_sql);
$max_id_row = mysqli_fetch_assoc($max_id_result);
$new_id = $max_id_row['max_id'] + 1;


// 5. 讀取PHPCMS欄目(按層級排序:先一級,再二級...)
// 先查所有啟用的欄目,再按層級排序
$phpcms_sql = "SELECT * FROM co_category ORDER BY parentid ASC, catid ASC";
$phpcms_result = mysqli_query($phpcms_conn, $phpcms_sql);
if (mysqli_num_rows($phpcms_result) == 0) die("PHPCMS無可用欄目");


// 6. 數(shù)據(jù)遷移(記錄ID映射)
$migrate_success = 0;
$migrate_fail = 0;
$fail_list = [];
$id_map = []; // 存儲:PHPCMS的catid → UJCMS的新id_


while ($row = mysqli_fetch_assoc($phpcms_result)) {
    // 1. 處理別名(確保唯一)
    $base_alias = !empty($row['catdir']) 
        ? strtolower(preg_replace('/[^a-zA-Z0-9_]/', '', $row['catdir'])) 
        : $default_config['default_alias_prefix'] . $row['catid'];
    $check_alias_sql = "SELECT COUNT(*) as count FROM ujcms_channel WHERE alias_ = '{$base_alias}' AND site_id_ = '{$default_config['site_id_']}'";
    $check_result = mysqli_query($ujcms_conn, $check_alias_sql);
    $check_row = mysqli_fetch_assoc($check_result);
    if ($check_row['count'] > 0) $base_alias .= '_' . rand(100, 999);


    // 2. 字段映射(關鍵:父ID用映射后的UJCMS新ID)
    $channel_data = [
        'id_' => $row['catid'], // 用UJCMS自增新ID,避免沖突
        'site_id_' => $default_config['site_id_'],
        // 父ID轉(zhuǎn)換為UJCMS的新ID(如果父欄目已遷移)
        'parent_id_' => isset($id_map[$row['parentid']]) ? $id_map[$row['parentid']] : null,
        'channel_model_id_' => $default_config['channel_model_id_'],
        'article_model_id_' => $default_config['article_model_id_'],
        'performance_type_id_' => $default_config['performance_type_id_'],
        'name_' => mysqli_real_escape_string($ujcms_conn, $row['catname']),
        'alias_' => mysqli_real_escape_string($ujcms_conn, $base_alias),
        'seo_title_' => null,
        'seo_keywords_' => null,
        'seo_description_' => null,
        'type_' => $row['type'] == 1 ? 2 : 1,
        'article_template_' => 'article',
        'channel_template_' => 'channel',
        'channel_static_path_' => null,
        'image_' => null,
        'link_url_' => null,
        'process_key_' => null,
        'target_blank_' => '0',
        'book_' => '0',
        'real_' => '1',
        'nav_' => '1',
        'page_size_' => 20,
        'order_desc_' => '1',
        'allow_comment_' => '1',
        'allow_contribute_' => '0',
        'allow_search_' => '1',
        'mains_json_' => null,
        'clobs_json_' => null,
        'created_' => date('Y-m-d H:i:s'),
        'modified_' => date('Y-m-d H:i:s'),
        'depth_' => 1,
        'order_' => $row['sort'] ?: 999999,
        'views_' => 0,
        'self_views_' => 0
    ];


    // 3. 插入UJCMS
    $insert_sql = "INSERT INTO ujcms_channel (
        id_, site_id_, parent_id_, channel_model_id_, article_model_id_,
        performance_type_id_, name_, alias_, seo_title_, seo_keywords_,
        seo_description_, type_, article_template_, channel_template_,
        channel_static_path_, image_, link_url_, process_key_, target_blank_,
        book_, real_, nav_, page_size_, order_desc_, allow_comment_,
        allow_contribute_, allow_search_, mains_json_, clobs_json_,
        created_, modified_, depth_, order_, views_, self_views_
    ) VALUES (
        '{$channel_data['id_']}',
        '{$channel_data['site_id_']}',
        " . ($channel_data['parent_id_'] === null ? "NULL" : "'{$channel_data['parent_id_']}'") . ",
        '{$channel_data['channel_model_id_']}',
        '{$channel_data['article_model_id_']}',
        " . ($channel_data['performance_type_id_'] === null ? "NULL" : "'{$channel_data['performance_type_id_']}'") . ",
        '{$channel_data['name_']}',
        '{$channel_data['alias_']}',
        " . ($channel_data['seo_title_'] === null ? "NULL" : "'{$channel_data['seo_title_']}'") . ",
        " . ($channel_data['seo_keywords_'] === null ? "NULL" : "'{$channel_data['seo_keywords_']}'") . ",
        " . ($channel_data['seo_description_'] === null ? "NULL" : "'{$channel_data['seo_description_']}'") . ",
        '{$channel_data['type_']}',
        " . ($channel_data['article_template_'] === null ? "NULL" : "'{$channel_data['article_template_']}'") . ",
        " . ($channel_data['channel_template_'] === null ? "NULL" : "'{$channel_data['channel_template_']}'") . ",
        " . ($channel_data['channel_static_path_'] === null ? "NULL" : "'{$channel_data['channel_static_path_']}'") . ",
        " . ($channel_data['image_'] === null ? "NULL" : "'{$channel_data['image_']}'") . ",
        " . ($channel_data['link_url_'] === null ? "NULL" : "'{$channel_data['link_url_']}'") . ",
        " . ($channel_data['process_key_'] === null ? "NULL" : "'{$channel_data['process_key_']}'") . ",
        '{$channel_data['target_blank_']}',
        '{$channel_data['book_']}',
        '{$channel_data['real_']}',
        '{$channel_data['nav_']}',
        '{$channel_data['page_size_']}',
        '{$channel_data['order_desc_']}',
        '{$channel_data['allow_comment_']}',
        '{$channel_data['allow_contribute_']}',
        '{$channel_data['allow_search_']}',
        " . ($channel_data['mains_json_'] === null ? "NULL" : "'{$channel_data['mains_json_']}'") . ",
        " . ($channel_data['clobs_json_'] === null ? "NULL" : "'{$channel_data['clobs_json_']}'") . ",
        '{$channel_data['created_']}',
        '{$channel_data['modified_']}',
        '{$channel_data['depth_']}',
        '{$channel_data['order_']}',
        '{$channel_data['views_']}',
        '{$channel_data['self_views_']}'
    )";


    if (mysqli_query($ujcms_conn, $insert_sql)) {
        $migrate_success++;
        // 記錄ID映射:PHPCMS的catid → UJCMS的新id_
        $id_map[$row['catid']] = $channel_data['id_'];
    } else {
        $migrate_fail++;
        $fail_list[] = "欄目【{$row['catname']}】導入失?。? . mysqli_error($ujcms_conn);
    }
}


// 7. 恢復外鍵約束
mysqli_query($ujcms_conn, "SET FOREIGN_KEY_CHECKS = 1");


// 8. 輸出結(jié)果
echo "===== 遷移結(jié)果 =====\n";
echo "成功導入:{$migrate_success} 個欄目\n";
echo "導入失敗:{$migrate_fail} 個欄目\n";
if (!empty($fail_list)) {
    echo "失敗詳情:\n";
    foreach ($fail_list as $fail) echo "- {$fail}\n";
}


// 9. 關閉連接
mysqli_close($phpcms_conn);
mysqli_close($ujcms_conn);
?>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容