你正在浏览标签「 Themes 」下的文章

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

* WordPress / # , , , , / 2008年12月16日 / 37条评论

使用 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:\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('&laquo; Older Entries') ?></div>
	<div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></div>
<?php } ?>

看到了么? WP-PageNavi 和 Anjing 握手和解了诶!

1