希望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檔案共有三處,是以上面的替換就有三處。
- 建立或編輯内容時會生成HTML
- 内容管理裡下面有個“批量生成HTML”
- 釋出管理的“批量更新内容”他又包含了先擇模型生成和不選擇模型生成
享受戰果
背景-擴充-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.