首页 > 新闻资讯 > 简析WordPress主题的功能文件 functions.php

简析WordPress主题的功能文件 functions.php

28条评论
标签:
更多

functions.php文件是一个所有主题都需要配备的文件,很多时候我们可以在里面添加各种函数以实现我们对WordPress的不同需求。不过大多数主题中的functions.php文件的编码都不尽如人意,有待改善。

这些functions.php文件的主要问题是:

  • 代码在文件中随意分布
  • 不使用WordPress提供的hooks

通过下面这篇文章,主题开发者可以学习如何创建一个代码简洁优美、富有逻辑性的functions.php文件,普通WordPress用户则可以了解一下functions.php文件的大致结构


什么是功能文件?


在WordPress里,所有主题都会有一个叫做functions.php的文件,这个文件负责为主题调用各种PHP函数。functions.php与插件功能类似。此外,每当某个主题被激活,WordPress都会自动加载functions.php文件。使用父/子主题时设置时,则会同时加载父/子主题de functions.php文件。

只要有足够的想象力和PHP技巧,我们可以通过functions.php文件实现自己需要的所有WordPress效果。

虽然功能文件的工作机制类似于插件,但它并不是插件。


创建主题功能文件


首先在主题里新建一个空白的functions.php文件。所有的自定义代码都会装入这个文件。新建文件后,在文件里添加下面的代码:

<?php
/* 自定义代码 */

/* 自定义代码*/
?>

给函数名称添加前缀


在进行下一步前有一件事需要我们注意:给所有函数添加前缀。

这是一个简单而实际的规则,虽然有很多主题制作者并没有这样的习惯。假设你有一个自定义主题函数comment_output(),它的常见形式通常是:

function comment_output() {
	/* 自定义代码 */
}

这段代码存在不安全因素。如果某天WordPress或者某个插件添加了一个同样名为comment_output()的函数,而它们没有为自己使用的函数添加前缀的习惯,那么我们就会遇到致命错误。

假设你的主题名是Browncoats,你可以在所有自定义函数前加上bowncoats_。那么上面那段代码应该是:

function browncoats_comment_output() {
	/* 自定义代码 */
}

这是一个简单的变化,也是预防将来出现问题的有效措施。

这个规则不仅适用于函数名称,对全局变量、常量以及类名称也同样适用。


新建一个主题设置功能


这里我们想要达到下面几个目标:

  • 正确执行某个WordPress hook的功能
  • 更好地规划功能文件

WordPress有一个叫做after_setup_theme的动作hook。一旦父/子主题的功能文件加载完毕,这个hook也会被执行。after_setup_theme是一个非常实用的hook,WordPress默认主题TwentyTen也使用了这个hook。

add_action( 'after_setup_theme', 'browncoats_theme_setup' );

function browncoats_theme_setup() {
	/* 添加各种过滤器(filter),动作(action),以及主题支持的功能 */
}

这样我们就开始了对functions.php文件的整理。上面这段代码可以用来:

  • 为动作hook添加自定义动作
  • 为过滤器hook添加自定义过滤器
  • 登记对主题支持功能的支持

下面我们来看一个比较规范的functions.php文件:

<?php

add_action( 'after_setup_theme', 'browncoats_theme_setup' );

function browncoats_theme_setup() {

	/* 添加主题支持的给你功能 */
	add_theme_support( 'automatic-feed-links' );

	/* 添加自定义动作 */
	add_action( 'widgets_init', 'browncoats_register_sidebars' );

	/* 添加自定义过滤器 */
	add_filter( 'the_content', 'browncoats_highlight_words' );
}

function browncoats_register_sidebars() {
	/* 示例 */
}

function browncoats_highlight_words( $content ) {
	return $content;
}

?>

上面的代码其实很简单,涉及三个操作:

  • 为after_setup_theme动作hook添加主题设置功能browncoats_theme_setup()
  • 主题设置功能为主题支持的功能登记支持,为一个动作hook添加动作,为过滤器hook添加过滤器
  • browncoats_register_sidebars()与browncoats_highlight_words()在特定hooks上执行

规范功能文件小贴士


1. 给所有必要内容添加前缀

总是给自定义的函数添加唯一标识符可以避免很多潜在问题。这篇文章里给函数添加的前缀Browncoats是一个主题的名称,其他主题可以改成对应名称。

2. 使用hook

WordPress提供了一种可以使开发者在WordPress工作流程中某些特定点执行操作的hook(钩子)。

functions.php文件中的所有代码都应该被一个自定义函数围绕,而这个自定义函数应该添加在一个动作hook或过滤器hook上。

通过从hook上添加各种内容,功能文件结构会更有条理,用户也可以通过remove_action()或remove_filter()函数删除文件里的内容。同时可以保证各个函数在WordPress工作过程中的适当时机执行。

3. 保持函数简单清爽

让一个函数执行复杂的操作没有错,可是没有必要只通过一个函数来实现多个功能。如果要执行多次操作,请使用多个函数。

4. 尽可能使用WordPress内置函数

编写代码时尽量使用WordPress核心代码函数,好处有二:

  • 减少维护和除BUG的代码
  • 很多插件依赖于WordPress函数提供的hooks。如果你不使用正确的函数,插件就会出错。(这也是插件作者有时背了主题作者黑锅的原因。)

functions.php文件示例


下面是一个符合WordPress主题检测规范的functions.php文件示范,文件中使用了hooks并编写了主题的一些常用功能。

<?php

add_action( 'after_setup_theme', 'browncoats_theme_setup' );

function browncoats_theme_setup() {
	global $content_width;

	/* 为嵌入的视频等设置$content_width */
	if ( !isset( $content_width ) )
		$content_width = 600;

	/* 使主题支持自动feed链接 */
	add_theme_support( 'automatic-feed-links' );

	/* 使主题支持文章缩略图(推荐图片) */
	add_theme_support( 'post-thumbnails' );

	/* 使主题支持自定义背景 */
	add_custom_background();

	/* 向 'init' 动作hook添加导航菜单功能 */
	add_action( 'init', 'browncoats_register_menus' );

	/* 向 'widgets_init' 动作hook添加侧栏功能 */
	add_action( 'widgets_init', 'browncoats_register_sidebars' );

	/* 在 'template_rediret' 动作hook上加载JS文件 */
	add_action( 'template_redirect', 'browncoats_load_scripts' );
}

function browncoats_register_menus() {
	/* 通过register_nav_menu() 
或register_nav_menus() 登记导航菜单 */
}

function browncoats_register_sidebars() {
	/* 通过register_sidebar()登记动态侧栏 */
}

function browncoats_load_scripts() {
	/* 通过wp_enqueue_script()存储自定义JAVASCRIPT */

	/* 加载评论回复javascript */
	if ( is_singular() && get_option( 'thread_comments' ) && comments_open() )
		wp_enqueue_script( 'comment-reply' );
}

?>

原文

WordPress啦编译

* 版权声明:作者WordPress啦! 转载请注明出处。

#1
总结的不错,以前我写function.php时就是没章法,看来要改善一下了。
#2
翻译的不错,尤其是注意函数起名字的时候不要和官方的冲突了。
#3
在这儿能实现很多的功能!
#4
不错 很使用的功能
#5
太专业了,对我这个不懂的人来说,真得好好学习了。
#6
呵呵,还不是很懂,估计得多看几遍
#7
LZ解析的很透彻,functions.php这个文件要是能吃透,那么对WP就不会感到生疏。
#8
过来学习下。
#9
谢谢博主分享 继续支持
#10
嗯,不错,来关注学习了!
#11
相当专业的分析,虽然我不懂,不过还是能从中明白一点点
#12
懂一半,但还有一些没有看懂。还得研究一下下
#13
FUNCTION是可以添加很多东西,我就添加了不少,但考虑会不会太肥肿。
#14
这个文件真的不能碰啊,错一点博客就大不了哦,我是怕了它了
#15
恩恩,赞同
#16
博主,我想拜你为师,WordPress很多东西还不明白,能不能交交我
#17
博主,我想拜你为师,WordPress很多东西还不明白,能不能交交我
#18
功能代码那么多啊
#19
很好,学习了。虽然我不做主题,看看也有助于理解
#20
总结的很好。学习了。。常来你网站看看
#21
:D好专业。。。
#22
Well down
#23
well done,干得漂亮,刚才失误, 很好的文章
#24
怎么设置自定呢
#25
你好,我在修改了这个文件后,网站白屏了。有什么解决的办法吗?
#26
你没有做备份吗?
#27
无阿,以前总是觉得不需要备份,所以.....我可以用新文件覆盖吗?或者有什么更好的办法?
#28
而且我连站里面都登陆不到了!登陆界面无显示,白屏了!