DedeCMS (織夢) 預設動態瀏覽模式下,文檔 URL 為 view.php?aid=123 格式。若開啟靜態化或需在模板中輸出真實靜態 URL,需自訂標籤函式處理。本文提供完整實現方案,包含資料庫查詢邏輯與兩種模板調用方式。
在 include/extend.func.php 新增:
<?php
/**
* 動態文檔 URL 轉靜態 URL
* @param string $arcurl 動態 URL (view.php?aid=xxx)
* @return string 靜態 URL 或原動態 URL
*/
function arcurlHtml(string $arcurl): string {
// 1. 解析 aid 參數
if (!preg_match('/view\.php\?aid=(\d+)/', $arcurl, $matches)) {
return $arcurl; // 非標準動態格式,直接返回
}
$aid = (int)$matches[1];
// 2. 取得文檔對應的附加表名
global $dsql;
$row = $dsql->GetOne(
"SELECT ct.addtable
FROM `#@__channeltype` ct
LEFT JOIN `#@__archives` a ON a.channel = ct.id
WHERE a.id = {$aid}"
);
if (!$row || empty($row['addtable'])) {
return $arcurl;
}
// 3. 查詢附加表的 redirecturl 欄位
$redirect = $dsql->GetOne(
"SELECT redirecturl FROM `{$row['addtable']}` WHERE aid = {$aid}"
);
// 4. 返回靜態 URL 或原動態 URL
return ($redirect && !empty($redirect['redirecturl']))
? $redirect['redirecturl']
: $arcurl;
}
?>
<!-- 列表頁/首頁調用 -->
{dede:arclist titlelen='45' channelid='-1' limit='0,4' type='commend.' flag='c'}
<li class="RTLi">
<a href="[field:arcurl function='arcurlHtml(@me)'/]"
title="[field:title/]" target="_blank">
<img width="236" height="136" src="[field:picname/]" />
</a>
</li>
{/dede:arclist}
<!-- SQL 標籤調用 -->
{dede:sql sql="SELECT * FROM `#@__channeltype` a
LEFT JOIN `#@__archives` b ON a.id = b.channel
WHERE a.id = -1 ORDER BY b.pubdate DESC LIMIT 0,2"}
<a href="[field:id runphp='yes']
$id = @me;
@me = '';
$url = GetOneArchive($id);
@me = $url['arcurl'];
@me = arcurlHtml(@me);
[/field:id]"
class="s_contentRTPIA" target="_blank"
title="[field:title/]">
<img src="[field:litpic/]" alt="[field:title/]" width="218" height="124" class="mb5"/>
<span class="s_contentRTPIASpan">[field:title/]</span>
</a>
{/dede:sql}
| 表名 | 關鍵欄位 | 說明 |
|---|---|---|
#@__archives | id, channel, title, arcurl | 主文檔表 |
#@__channeltype | id, addtable | 模型類型表,記錄附加表名 |
#@__addonarticle 等 | aid, redirecturl, body | 各模型附加表,存靜態 URL |
function arcurlHtml(string $arcurl): string {
static $cache = []; // 請求級快取
if (isset($cache[$arcurl])) {
return $cache[$arcurl];
}
// ... 原查詢邏輯 ...
$cache[$arcurl] = $result;
return $result;
}
redirecturl 欄位是否為空、文檔是否已生成靜態#@__ 正確、欄位名拼寫redirecturl 存儲格式redirecturl 欄位(文章模型預設有)這個技巧讓動態模板也能正確輸出靜態 URL,避免搜尋引擎重複收錄動態/靜態兩版網址,有利於 SEO 優化。