使用 WordPress 的过程可以说就是不断更换插件、主题的过程,可以说:世界因 WordPress 而美丽, WordPress 因扩展(插件、主题)而动人。同时,使用插件的方法不仅仅是安装独立插件,也可以通过主题内置的功能实现插件的效果。但有些时候,比如说 sofish 童鞋制作的“sofish牌主题”喜欢在主题中内置的翻页功能,同时如果我们也安装并启用了 WP-PageNavi 这个插件,就会发生这个冲突。在本文中,NetPuter 将告诉你如何和解这个冲突。
为什么需要在主题中内置功能实现插件效果
对主题制作者来说
- 可以极大地丰富主题的功能,可以方便做出自己想要的效果了。
- 阿瓦说:减少Function Hook,因为所有的插件都是Hook的方法,比较消耗CPU(不过如果你有Cache就好一些)。
- ……你觉得呢?
对主题使用者来说
- Prower说:使用主题时就不用为插件应该怎么添加、设置而发愁了。
- 减少后台使用的插件,提高 WordPress 运行速度(真的么?)。
- ……你觉得呢?
插件和主题之间为什么会产生冲突
就拿 sofish 童鞋的新作“Anjing”来说。如果要在页面中使用翻页效果,需要调用 wp_pagenavi() 这个过程函数。但当插件(WP-PageNavi)和主题(Anjing)都同时定义了这个名字的过程时,冲突就产生了,然后就是你一拳,我一脚,然后……(感觉解释得很生硬,好像说错了)
如何解决这个冲突
既然知道了冲突是因为同名的过程而产生的,那么解决这个问题就变得非常容易了——没错,只需要把插件或者主题中实现同个功能的那个过程改掉就行啦!鉴于插件相对于主题来说升级频率更高一些,为了方便,我们选择对主题进行修改。
要想在主题中实现某些功能,需要修改的是 functions.php 这个文件,WordPress 说它叫做“模板函数”。打开有冲突的主题中的这个文件,然后根据提示找到产生冲突的过程函数,比如同时启用了 WP-PageNavi 和 Anjing ,在主题预览的时候就会出现类似这样的一段话:
Fatal error: Cannot redeclare wp_pagenavi() (previously declared in F:\PHPnow\htdocs\wp-content\plugins\wp-pagenavi\wp-pagenavi.php:80) in F:\PHPnow\htdocs\wp-content\themes\Anjing_sofished\functions.php on line 99
OK,发现目标!冲突的幕后黑手就在 functions.php 的第 99 行啦,可是打开一看,只是一个“}”。不要失望,根据 PHP 语法顺藤摸瓜向上乱摸就会看到——“ function wp_pagenavi{ ”是的,就是这一段。
解决插件和主题之间的冲突
对于主题使用者来说
直接把这一段 function 过程函数删掉保存就可以了。
对于主题制作者来说
为了更好的兼容性,你只需要把这段 function 过程函数改名就可以啦,比如说把“wp_pagenavi”改成“sofish_pagenavi ”(sofish 童鞋专用插件?),然后到调用这个 function 过程函数的地方把“<?php wp_pagenavi(); ?>”改成“<?php sofish_pagenavi(); ?>”就可以啦!
对于追求玩美的主题制作者来说
当然咯,为了不要让已经启用了的 WP-PageNavi 被浪费,你完全可以在调用“wp_pagenavi”的地方这样写:
1 2 3 4 5 6 7 8 <?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } elseif(function_exists('sofish_pagenavi')) { sofish_pagenavi(); } else { ?> <div class="alignleft"><?php next_posts_link('« Older Entries') ?></div> <div class="alignright"><?php previous_posts_link('Newer Entries »') ?></div> <?php } ?>
看到了么? WP-PageNavi 和 Anjing 握手和解了诶!

自己作主题,自己用,嘿嘿~~~
晚修回来有问题请教, 为什么我的Trackback失效了, 郁闷中!
弟弟,我看不懂啊。囧個。
WORDPRESS很强大的说
地址里的 "plugins-with-themes-peaceful" 貌似拼写错误吧.. 应该是 adv 才对.. 不是 adj ..
:)~
@锐风, 是呢?这个标题我也是死硬憋出来的,这么说的话就是 peacefully 咯~但是为了邪恶的SEO,还是不改鸟^^
@bwskyer, 可以具体说说么(via Mail or GTalk).
方法不错哈!在做主题的时候的确用的上!
很不错的文章,学习了!
只停留在该主题的阶段,对于向主题中嵌入插件,以后再学习~
高二的朋友,了不起啊!加油!
说的有道理!
@默然, 纯技术的东西,- -,看来还也要弄弄Bus的说~
真不错,有道理
很好 学习了
值得收藏!
还没打过架 暂时不理它
呵呵..收藏.留着日后用WP.用..
好方法,一个条件语句就可以解决了!
在主题中内置功能实现插件效果的确不错,但如果更换主题后还想要那些效果的话就挺麻烦了 >_<
@SUNJIAN, 不打则已,一打惊人!
@sfox, 对滴,不过不妨考虑下换主题时不换 function.php 文件.但是这样 Sidebar 那里的定义就要修改咯!
好东西 哈哈
细致~~学习下!~
三种条件都被你用到了,wordpress condition 的确很好用。
@housne, 准确来说,应该是 PHP 的选择判断很好用,其实几乎每种语言都有这玩意儿~
来拜访一下
现在2.7中的一些功能都还没发挥出来啊~~需要改动代码
额
呵呵,学习了,保不齐那天出错了~~
哈哈,评论不少。我的主题一般写的很干净,要是插件需要在主题中加东西,我一般标注起来。目前还没发现与主题有冲突的插件,顶多是CSS的问题。这些调整下就好了
@gowers, 嗯,干净的代码的确是一个好习惯!
功能越复杂冲突的可能心越大!
@ice, 这就需要主题制作者谨慎咯~
关键是要选个好主题
有得主题做的很花哨,其实里面代码一塌糊涂
突然踩到 我博客第一位留言者的站了 呵呵~~
PrettyBlogs!