wordpress改源码实现自定义URL到自定义页面

三月 12th, 2014 2,435 留下评论 阅读评论

wordpress对于新闻发布系统来说不能更优秀了,对于一般的门户和博客类网站的大部分需求都能符合,但其毕竟不是类似于joomla这样的自定义化程度更高的平台,在wordpress中只能依靠theme和plugin这两块很小地修改原本的功能和增加新的功能。一直有如此的需求,比如用wordpress搭建一个公司门户,需要一个产品列表的页面,这个页面需要完全自定义的程序去实现,无法实现为一篇文章或者一个页面,这在wordpress原来的系统中似乎很难实现。

其实这个功能唯一需求的地方,就是能够自定义一个URL然后映射到主题中自定义的一个页面中即可,对于数据库的读写还有其他的逻辑实现,完全可以在主题文件中用PHP代码随心所欲地实现,数据库表也可以随意建,这些都不是问题。但是wordpress就是没有提供额外的URL映射功能,有一个add_rewrite_rule()函数,只是可以自定义新的URL映射到原来的URL,并没有添加URL映射到主题文件的机制。

首先要开启wordpress的固定链接功能

只能从源码入手,很快可以找到在wp-includes/template-loader.php中,是URL路由到主题文件的入口,所以当我们设置一个新的URL,比如: /production,将它映射到主题目录下的production.php。wordpress会认为 /production 是一个Page的URL,但是扫描数据库后发现没有对应的Page的静态url符合,所以is_404()就返回了true,然后$template被设置为主题对应的404页面。

这样就简单了,在template-loader.php中一堆if和elseif的后面,include( $template );的前面,我们加入以下代码,就可以实现我们的目的:

43
44
45
46
47
48
49
50
51
52
53
54
55
56
else :
	$template = get_index_template();
endif;
// hacked
if(is_404()){								//新的URL一定会被认为是404页面
	if($wp_query->query_vars['pagename'] == 'production'){	//从404结果中找到我们的特殊URL
	或者if($wp_query->query_vars['name'] == 'production'){	//从404结果中找到我们的特殊URL
		$template = get_query_template('production');		//映射到自定义的主题文件
	}
}
// end
if ( $template = apply_filters( 'template_include', $template ) )
	include( $template );
return;

上面代码中,有2行if,因为在不同情况下发现这个参数名会不太一样,这个根据实际调试情况很容易就可以发现,print_r($wp_query)即可。

这样我们就从404的结果中,找到了我们自定义的URL路径,并将其映射到了主题目录中的production.php文件,这样就是完全自定义的URL和自定义的主题文件了,为所欲为吧亲! [em75]

Categories: Wordpress 标签:
  1. Nickshi | #沙发
    三月 9th, 2015 13:38

    首先,你这做法虽然暂时是解决问题,但其实是错误的做法。Wordpress的开发最好通过Themes/Plugins实现功能,不应该修改他的Core文件。

  2. 六月 18th, 2014 22:42

    噢这个恰好解决了我的需求!正好之前正在纠结如何建立个人页面呢~

  3. 三月 30th, 2014 19:41

    不错哦,但是改起来有点难。

icon_wink.gif icon_neutral.gif icon_mad.gif icon_twisted.gif icon_smile.gif icon_eek.gif icon_sad.gif icon_rolleyes.gif icon_razz.gif icon_redface.gif icon_surprised.gif icon_mrgreen.gif icon_lol.gif icon_idea.gif icon_biggrin.gif icon_evil.gif icon_cry.gif icon_cool.gif icon_arrow.gif icon_confused.gif icon_question.gif icon_exclaim.gif