天天看點

phpcms文章内容頁如何自定義url

希望phpcms跟WordPress一樣,能夠在文章釋出頁面自定義url,進而提高SEO優化嗎?phpcms V9版本預設是不支援自定義網址的,不過隻要跟我一起稍微做下改動即可實作自定義url,甚至超過WordPress的固定連接配接功能。

添加字段

内容-模型管理-選擇你要修改的模型,一般是文章模型,然後是字段管理,添加字段

  • 作為主表字段,選擇 是,非常重要,否則在批量生成url中會無法生成自定義字段
  • 字段名為prefix 不建議修改,因為要跟後面的代碼關聯起來
  • 字段别名為 html檔案名 ,這個随意,好記即可
  • 值唯一選 是,你不希望2篇文章的url是同一個吧,這樣就會覆寫上一篇文章

其他保持預設即可

修改網址生成檔案

打開/phpcms/modules/content/classes/url.class.php

大概在 67行 找到

$day = date("d",$time);           

複制

在其下方插入

$tmp_id = $content_ishtml && $prefix ? $prefix : $id; //增加自定義HTML檔案名支援           

複制

代碼大概的意思是,如果純在字段prefix則使用該字段的值,如果不存在則直接顯示文章ID

緊接着下一行的代碼應該是

$urls = str_replace(array("{$categorydir}","{$catdir}","{$year}","{$month}","{$day}","{$catid}","{$id}","{$page}"),array($categorydir,$catdir,$year,$month,$day,$catid,$id,$page),$urlrule);           

複制

在第二個array中把id替換成tmp_id,完整代碼如下

$urls = str_replace(array("{$categorydir}","{$catdir}","{$year}","{$month}","{$day}","{$catid}","{$id}","{$page}"),array($categorydir,$catdir,$year,$month,$day,$catid,$tmp_id,$page),$urlrule);           

複制

這樣他就會判斷,如果prefix的值存在則取該值,不存在還是用原來的文章ID,非常友善不是。注意:該代碼隻有在純靜态下支援,在僞靜态中暫時沒有想到好的辦法。如果把tmp_id 這行中的 content_ishtml && 删除,那麼僞靜态後的網頁也是打不開的,因為動态網址後面跟的必須是文章ID,如果跟的是其他值就不存在該文章了。

修改生成HTML的檔案

打開/phpcms/modules/content/create_html.php,找到代碼

$urls = $this->url->show($r['id'], '', $r['catid'],$r['inputtime']);           

複制

共有三處,批量替換成

$urls = $this->url->show($r['id'], '', $r['catid'],$r['inputtime'],$r['prefix']);           

複制

因為PHPCMS生成内容HTML檔案共有三處,是以上面的替換就有三處。

  1. 建立或編輯内容時會生成HTML
  2. 内容管理裡下面有個“批量生成HTML”
  3. 釋出管理的“批量更新内容”他又包含了先擇模型生成和不選擇模型生成

享受戰果

背景-擴充-URL規則管理中,URL規則用 {$id} 即可,當prefix中有值,則文章url顯示prefix的值,沒有則調取預設的文章ID值。

補充

在定義$tmp_id之前加上以下代碼

$prefix = str_replace(" ","-",$prefix);
$prefix = strtolower($prefix);           

複制

把空格轉換成短橫杠,你不希望把翻譯好的英語詞組之間的空格手動填寫橫杠來區分吧。

把大小字母轉換成小寫字母,網址中有大寫字母總顯得不太美觀。

我新加的自定義字段,設定了判斷唯一值。但是當我不想填寫這個字段時,他也提示 重複。是以我想有沒有辦法讓他判斷,隻有在非空值時才判斷唯一值?

打開 /phpcms/modules/content/fields/content_input.class.php

查找

if($this->fields[$field]['isunique'] && $this->db->get_one(array($field=>$value),$field) && ROUTE_A != 'edit') showmessage($name.L('the_value_must_not_repeat'));           

複制

替換成

if($this->fields[$field]['isunique'] && $value && $this->db->get_one(array($field=>$value),$field) && ROUTE_A != 'edit') showmessage($name.L('the_value_must_not_repeat'));           

複制

如果我們希望實作在有prefix則調用prefix,無則用目前日期,該怎麼辦?

$diytime=date('YmdHi',$time);
$tmp_id = $content_ishtml && $prefix ? $prefix : $diytime; //增加自定義HTML檔案名支援
$tmp_id = $content_ishtml && $tmp_id ? $tmp_id : $id; //靜态頁面用上面判斷的$tmpid值,動态頁面則調用$id值           

複制

在原來的tam_id之前定義了一個時間變量,然後進行判斷。但是在動态頁面時,id值會變成時間,就無法顯示文章了,是以最後還加了一行,如果是靜态頁面則執行第二行的判斷,否則就調用ID.