WordPress 技巧:解决冲突,插件主题不打架
使用 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:PHPnowhtdocswp-contentpluginswp-pagenaviwp-pagenavi.php:80) in F:PHPnowhtdocswp-contentthemesAnjing_sofishedfunctions.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()
的地方这样写:
<?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 握手和解了诶!