PHPCMS V9 將內容分散存儲於 v9_news、v9_product 等模型表,需導出全站所有欄目的內容鏈接時,單純後台匯出無法滿足。本文提供一支獨立 PHP 腳本,連接資料庫、遍歷 v9_category,以 UNION ALL 合併多模型內容,輸出「欄目名 + 內容 URL」清單,可直接導向 CSV 或站點地圖生成器。
| 表名 | 用途 | 關鍵欄位 |
|---|---|---|
v9_category | 欄目表 | catid, catname, modelid |
v9_news | 文章模型 | id, catid, title, url |
v9_product | 產品模型 | id, catid, title, url |
實際專案可能還有v9_picture、v9_download等模型,腳本中可動態根據modelid組裝 UNION。
<?php
/**
* PHPCMS 全站欄目內容鏈接導出
* 輸出格式:欄目名 | 內容標題 | 內容URL
* 可重定向 > urls.csv 直接生成 CSV
*/
// === 設定區 ===
$dbConfig = [
'host' => 'localhost',
'user' => 'db_user',
'pass' => 'db_pass',
'name' => 'phpcms_db',
'charset' => 'utf8',
'prefix' => 'v9_'
];
// 模型表對應表(可擴充)
$modelTables = [
1 => 'news', // 文章模型
2 => 'product', // 產品模型
// 3 => 'picture',
// 4 => 'download',
];
// === 連線 ===
$mysqli = new mysqli($dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['name']);
if ($mysqli->connect_errno) {
die("DB Connect Failed: {$mysqli->connect_error}");
}
$mysqli->set_charset($dbConfig['charset']);
// === 取得所有欄目 ===
$cats = $mysqli->query("SELECT catid, catname, modelid FROM {$dbConfig['prefix']}category");
if (!$cats) die("Category Query Failed: {$mysqli->error}");
// === 輸出標頭(CSV 格式) ===
echo "catname,title,url\n";
while ($cat = $cats->fetch_assoc()) {
$catname = $cat['catname'];
$catid = (int)$cat['catid'];
$modelid = (int)$cat['modelid'];
// 找對應模型表
if (!isset($modelTables[$modelid])) {
// 模型不在對應表,略過或記錄警告
continue;
}
$table = $dbConfig['prefix'] . $modelTables[$modelid];
// 聯合查詢:標題 + URL,按 id 降序
$sql = "SELECT title, url FROM {$table} WHERE catid = {$catid} ORDER BY id DESC";
$res = $mysqli->query($sql);
if (!$res) continue;
while ($row = $res->fetch_assoc()) {
// CSV 轉義:雙引號轉雙雙引號、欄位包雙引號
$title = '"' . str_replace('"', '""', $row['title']) . '"';
$url = '"' . str_replace('"', '""', $row['url']) . '"';
$cname = '"' . str_replace('"', '""', $catname) . '"';
echo "{$cname},{$title},{$url}\n";
}
$res->free();
}
$cats->free();
$mysqli->close();
?>
$ php export_urls.php > urls.csv
# 或
$ php export_urls.php | gzip > urls.csv.gz
catname,title,url
"最新消息","PHPCMS V9 釋出","https://example.com/news/1.html"
"最新消息","版本更新說明","https://example.com/news/2.html"
"產品中心","旗艦手機 X","https://example.com/product/10.html"
"產品中心","輕薄筆記型","https://example.com/product/11.html"
v9_model 表的 tablename 欄位,免維護陣列。LIMIT offset, size 或 WHERE id > last_id 避免記憶體溢位。pcntl_fork 或 GNU Parallel 多程序加速。id 或 updatetime,僅導出新增/異動內容。show_url($catid, $id) 函數動態生成(需載入 PHPCMS 核心)。mysqli::change_user 切換資料庫。這支腳本零依賴、單檔案、可直接在 CLI 執行,適合納入排程任務每日更新站點地圖或提供 SEO 團隊審核。核心邏輯為「遍歷欄目 → 依模型查表 → UNION/多查詢合併 → CSV 輸出」,可依專案模型數量彈性擴充。