wordpress對于新聞發(fā)布系統(tǒng)來說不能更優(yōu)秀了,對于一般的門戶和博客類網(wǎng)站的大部分需求都能符合,但其畢竟不是類似于joomla這樣的自定義化程度更高的平臺,在wordpress中只能依靠theme和plugin這兩塊很小地修改原本的功能和增加新的功能.
一直有如此的需求,比如用wordpress搭建一個公司門戶,需要一個產(chǎn)品列表的頁面,這個頁面需要完全自定義的程序去實現(xiàn),無法實現(xiàn)為一篇文章或者一個頁面,這在wordpress原來的系統(tǒng)中似乎很難實現(xiàn).
其實這個功能唯一需求的地方,就是能夠自定義一個URL然后映射到主題中自定義的一個頁面中即可,對于數(shù)據(jù)庫的讀寫還有其他的邏輯實現(xiàn),完全可以在主題文件中用PHP代碼隨心所欲地實現(xiàn),數(shù)據(jù)庫表也可以隨意建,這些都不是問題,但是wordpress就是沒有提供額外的URL映射功能,有一個add_rewrite_rule()函數(shù),只是可以自定義新的URL映射到原來的URL,并沒有添加URL映射到主題文件的機制.
只能從源碼入手,很快可以找到在wp-includes/template-loader.php中,是URL路由到主題文件的入口,所以當我們設(shè)置一個新的URL,比如: /production,將它映射到主題目錄下的production.php,wordpress會認為 /production 是一個Page的URL,但是掃描數(shù)據(jù)庫后發(fā)現(xiàn)沒有對應(yīng)的Page的靜態(tài)url符合,所以is_404()就返回了true,然后$template被設(shè)置為主題對應(yīng)的404頁面.
這樣就簡單了,在template-loader.php中一堆if和elseif的后面,include( $template );的前面,我們加入以下代碼,就可以實現(xiàn)我們的目的:
- else :
- $template = get_index_template();
- endif;
- // hacked
- if(is_404()){ //新的URL一定會被認為是404頁面
- if($wp_query->query_vars['pagename'] == 'production'){ //從404結(jié)果中找到我們的特殊URL
- $template = get_query_template('production'); //映射到自定義的主題文件
- }
- } //www.companysz.com
- // end
- if ( $template = apply_filters( 'template_include', $template ) )
- include( $template );
- return;
這樣我們就從404的結(jié)果中,找到了我們自定義的URL路徑,并將其映射到了主題目錄中的production.php文件,這樣就是完全自定義的URL和自定義的主題文件了.
新聞熱點
疑難解答
圖片精選