WordPress 技巧:解决冲突,插件主题不打架

使用 WordPress 的过程可以说就是不断更换插件、主题的过程,可以说:世界因 WordPress 而美丽, WordPress 因扩展(插件、主题)而动人。同时,使用插件的方法不仅仅是安装独立插件,也可以通过主题内置的功能实现插件的效果。但有些时候,比如说 sofish 童鞋制作的「 sofish 牌主题」喜欢在主题中内置的翻页功能,同时如果我们也安装并启用了 WP-PageNavi 这个插件,就会发生这个冲突。在本文中, NetPuter 将告诉你如何和解这个冲突。

为什么需要在主题中内置功能实现插件效果?对主题制作者来说……

  1. 可以极大地丰富主题的功能,可以方便做出自己想要的效果了。
  2. 阿瓦说:减少 Function Hook ,因为所有的插件都是 Hook 的方法,比较消耗 CPU (不过如果你有 Cache 就好一些)。
  3. ……你觉得呢?

对主题使用者来说……

  1. Prower 说:使用主题时就不用为插件应该怎么添加、设置而发愁了。
  2. 减少后台使用的插件,提高 WordPress 运行速度(真的么)。
  3. ……你觉得呢?

插件和主题之间为什么会产生冲突

就拿 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 握手和解了诶!