我们一直希望 WordPress 的加载速度越快越好,而 WordPress 页面加载的内容越多速度就越慢,比如大量的数据库查询,CSS 样式文件和 JavaScript 文件调用、图片调用等,都会拖慢 WordPress 的速度。所以我们有个基本的原则:如果不需要某个文件,就不要加载它!
很多考虑周全的插件都已经这么做了。通常水景一页选用插件的时候就会考虑这个问题 —— 多数时候都会打开插件的文件,看看作者是怎么组织功能和代码实现的。比如,当你写一个用于管理后台(Dashboard)的插件时,就不需要在前台(首页,或者某个文章页面)调用相关的文件。例如,
if(is_admin()) { include("admin_plugin.php"); }
这是一个假设的程序片段,假设 admin_plugin.php 只在 WordPress 控制后台工作。那么利用上面的条件标签 is_admin() 来判断现在是否在控制面板中,如果在,然后才会调用 admin_plugin.php 文件。而在其它页面的时候则不会处理 admin_plugin.php 文件,这就不会拖慢其它页面的加载速度。
使用其它的 WordPress 条件标签¶
除了 is_admin() 之外,WordPress 中还有很多条件标签。有些在前面介绍条件控制的小工具和条件控制菜单显示中已经用到过了。我们可以通过查阅 WordPress 条件标签文档页面来了解有哪些函数,分别可以实现什么样的功能。
当然也可以在实现某个功能的时候多想一下:这个功能是在所有的页面都用到,还是只在特定的某些页面或某些类页面中采用到呢。有了这样的考虑再去查看是否有相关的条件控制函数来实现,从而有选择的启用功能或调用文件,从而使自己的设计简约快捷。
常用的条件标签¶
常用的条件标签函数还有:
- is_single() 用于判断是否是一个单一文章(post)页面;
- is_page() 用于判断是否一个单一静态页面(page)页面;
- is_attachment() 用于判断是否是一个单一附件页面;
- is_singular() 用于判断是否是上述三种页面之一;
- is_category() 用于判断是否是一个显示分类文章列表的页面;
- is_tag() 用于判断是否是一个显示某标签文章列表的页面,等等。
甚至可以在 () 中指定一些参数来进行更加精细的控制,也可以组合使用需要的条件控制标签函数。一切在于我们的设计……如果我们在主题或者插件中使用类似的方法进行控制按需加载需要的函数/文件,那将是所有用户的福气!
但是需要注意的是,象 is_single() 和 is_category() 之类的标签在插件内部函数的里面调用是不起作用的,因为 WordPress 在知道具体的页面类型之前就已经加载了插件。所以我们需要利用 WordPress 的钩子(wp-hook)来调用自己的内容,这样它就会在页面处理完内容后再调用 Hook 提供的功能进行修改,WordPress 此时就已经知道了页面的类型了。同时在调用钩子之前使用条件判断函数,这样才能实现我们的目的:不加载不需要的功能/文件。
用于插件¶
下面用个简单的例子来说明这一问题。在下面的代码中,一个函数 load_plugin() 被使用 WP-Hook 加入到 WordPress 中,该函数会引入一个插件文件 single_plugin.php 来执行一些功能,而该功能只在单一文章页面才需要:
add_action("wp", "load_plugin"); function load_plugin() { if(is_single()) { include("single_plugin.php"); } }
这样一来,WordPress 在处理 add_action 的时候就会先检查 is_single(),确认后才会调用该插件 single_plugsin.php。
用于主题模板¶
除了插件之外,我们在主题模板中更是可以多多使用类似的处理方法。比如我在水景一页的单一文章页面(post)和单一静态页面(page)加入了 Google +1 按钮和百度分享按钮,他们都需要调用自己的 JavaScript 来处理按钮的功能。为了不影响页面的加载速度,我将它们的 JavaScript 代码段都放到了所使用的 TwentyEleven(2011)主题的页脚模板 footer.php 文件中。该文件是会被所有 WordPress 页面调用的,可是我的网站首页、分类页面、标签页面、附件页面等都是不需要使用这些 JavaScript 代码的。或者说,我只需要在 post 或者 page 页面才输出这些代码。那么,下面的设计就可以了:
<?php // 在单一 post 或者 page 页面输出下面的代码 // 其中 || 表示“或者” if( is_single() || is_page() ) : ?> <script type="text/javascript"> // 也就是直接放入 Google 或 百度提供的那些 JavaScript 代码 ...... </script> <?php endif; // 关闭 if 函数 ?>
有人可能会说,多增加一个判断函数,就需要多一些时间和服务器资源来处理它。是的,可是处理这么一个或几个条件标签函数比处理要调用的内容来说应该是简单多了。况且,我们还可以使用 WP Super Cache 的预读(preload)功能来提前静态化动态页面呢。
如果是主题和插件开发者,可以多多检视自己的作品,看看是不是可以用类似的方法来优化设计;如果是终端用户,可以看看自己个性化的内容,或者使用的插件/主题是不是考虑周全,进行了优化设计。希望大家都能有个快速响应的 WordPress 站点。©
本文发表于水景一页。永久链接:<http://cnzhx.net/blog/conditional-loading-file-in-wordpress/>。转载请保留此信息及相应链接。
您写得很专业!
明白核心的意思,但只要涉及代码,我就头大!
呵呵,老朋友了,有什么需要可以把想法提出来,我帮你搞定,只要不是太复杂应该都没问题。
哈哈
谢谢老师!
如果以后碰到解决不了的,还得跟您这请教呢~
不用客气,相互学习吧,我在这方面也还算是新手,都是照着说明一点点扣的。
:)
最简单的方法是简化代码…
看了一个人的blog,代码简单到无语,效果却很好…
当然,他本人也是前端设计师和php工程师…
如果只放很少的东西,比如只有简单的导航、标题、内容,当然可以弄得很简单了。可是再加上乱七八糟的社会化分享、广告、头像、分类、标签,甚至想要给不同的标签加上不同的颜色等等,代码就不会简单到什么程度。咱需要的就是,在完成想要的所有的功能的时候尽量减少页面加载的代码和文件。