我遇到了一个新的,现成的,我刚刚完成定制的wordpress主题的问题。当我在我的生产机器上安装它(有很多插件)时,网站会抛出一个错误:
致命错误:无法重新声明admin_init()
以及两个实例的路径。当我查找它们时,我看到在主题文件中声明了这个函数:
add_action('admin_init', 'admin_init');
function admin_init()
{....
并在插件文件中声明了这个:
add_action("admin_init", "admin_init");
function admin_init(){...
显然错误表明这是不允许的。但我的问题是,解决这个问题的最佳方式是什么,所以主题和插件都能获得他们需要的工作?在这种情况下,我会将“最佳”定义为在更新时需要最少量保姆的解决方案(插件和主题...认为插件可能比主题更频繁地更新)。
谢谢!
答案 0 :(得分:0)
开发WordPress主题时,the Codex says:
主题需要使用独特的slug作为任何内容的前缀 public命名空间,包括所有自定义函数名,类, 钩子,公共/全局变量,数据库条目(主题选项,帖子 自定义元数据等。)
因此,问题的标准解决方案是根据主题的名称使用唯一的slug为公共函数添加前缀。
add_action('admin_init', 'my_theme_slug_admin_init');
function my_theme_slug_admin_init()
{....
如果您熟悉PHP类和OOP,那么人们用来最小化更改(并输入slu!!)的一种方法是将自定义函数包装在一个类中。这种方法(如here所述,在某种程度上在the answers to this (slightly annoyed!) question中将自定义函数封装在一个类中,因此只有类名本身出现在全局名称空间中。