首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

DedeCMS 動態文檔跳轉靜態 URL 模板標籤實現教學

     編輯:PHP 綜合知識

DedeCMS (織夢) 預設動態瀏覽模式下,文檔 URL 為 view.php?aid=123 格式。若開啟靜態化或需在模板中輸出真實靜態 URL,需自訂標籤函式處理。本文提供完整實現方案,包含資料庫查詢邏輯與兩種模板調用方式。

核心邏輯:arcurlHtml 函式

在 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;
}
?>

模板調用方式一:function 屬性 (推薦)

<!-- 列表頁/首頁調用 -->
{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}

模板調用方式二:runphp 標籤

<!-- 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}

資料庫表結構說明

表名關鍵欄位說明
#@__archivesid, channel, title, arcurl主文檔表
#@__channeltypeid, 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 欄位是否為空、文檔是否已生成靜態
  • SQL 錯誤:確認表前缀 #@__ 正確、欄位名拼寫
  • 效能問題:列表頁大量調用會產生 N+1 查詢,建議加快取或預先關聯查詢
  • 多站點部署:靜態 URL 需包含完整域名,檢查 redirecturl 存儲格式

適用版本與注意事項

  • DedeCMS 5.7 / 5.8 通用
  • 需開啟「文檔動態瀏覽」且已生成靜態頁
  • 模型必須有 redirecturl 欄位(文章模型預設有)
  • PHP 7.4+ 建議加入型別宣告與嚴格模式

這個技巧讓動態模板也能正確輸出靜態 URL,避免搜尋引擎重複收錄動態/靜態兩版網址,有利於 SEO 優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved