Wordpress register_activation_hook()+全局变量+类:无法重新声明

时间:2009-07-28 15:56:07

标签: php wordpress

我正在编写我的第一个wordpress插件,我正在尝试创建一个在插件激活时调用的函数。

目前它看起来像这样:

class ThumbsUp {

...

}

global $thumbs;
function thumbs_install() {
    //global $thumbs;
    $thumbs = new ThumbsUp();    /* Line 160 */
    $thumbs->installThumbsUp();
}                                /* Line 162 */

// When plugin is activated -> install.
register_activation_hook(__FILE__,'thumbs_install');

但是当我激活插件时,我收到以下错误:

  

无法激活插件,因为它触发了致命错误。

     

致命错误:无法在第162行的thumbs_install()重新声明/dev/site/wp-content/plugins/thumbs-up/thumbs-up.php:160(之前在/dev/site/wp-content/plugins/thumbs-up/thumbs-up.php中声明)

我用Google搜索并查看它被称为可变范围问题,但我找不到答案的任何示例,我的php不够强大,无法将讨论转化为代码。

the solution described by John Blackbourn中的WP-hackers ML

  

要在register_activation_hook()调用的函数内引用的任何全局变量必须在插件主体内显式声明为全局变量(即此函数的外部) )。插件文件是include() - 在激活点的另一个函数内部编辑,与插件文件只是include()编辑的其他时间不同。唷。有点奇怪的是让你的头,但我们去。

我以为我已经完成了所描述但我仍然得到了错误。我还尝试了其他可能放置全局$thumbs ...

的组合

2 个答案:

答案 0 :(得分:1)

这个问题有一个更通用的答案:从注册register_activation_hook的函数运行的代码中出现的每个错误都将显示为“cannot redeclare ...”而不是实际错误。我怀疑这是因为WordPress在调用激活钩子时包含插件文件的方式。

答案 1 :(得分:0)

注意:如果您是通过搜索引擎到达此处获取有关Wordpress的register_activation_hook()global变量的结果,请跳到此答案的第二部分。

此错误消息背后的基本原理是thumbs_install名称首先在include()编辑一次,然后再创建一次。

其中一次,来自/wp-admin/includes/plugin.php on line 560include()范围activate_plugin();另一个很可能是你做的:Wordpress不包含任何尚未激活的插件,只包含activate_plugin()中的插件文件一次。

此外,我无法使用您在问题中粘贴的代码重现该问题,但我对ThumbsUp类的以下版本产生了错误:

class ThumbsUp {
    function installThumbsUp() {
        include(__FILE__);
    }
}

但是,由于您没有与我们分享ThumbsUp课程的代码,我无法帮助您进一步了解这一直接问题。

值得注意的是,activate_plugin()函数中插件的第一个(在激活之前)旨在防止Wordpress因未激活的插件而崩溃;因此,额外的include()require()很可能发生在插件代码中的其他位置(不一定在本地范围内)。

关于在传递给global的回调函数中使用register_activation_hook()变量;主要是因为插件的第一个include()(在激活期间)发生在函数的范围activate_plugin())中,因此有必要声明这些变量global在插件的每个位置都可以访问它们。

这意味着:他们需要在插件文件的范围内显式设置global (通常认为变量已经是全局的)。

这是因为在第一次激活期间,所述变量在activate_plugin()范围内定义,除非明确设置为全局,否则它们将不存在于全局范围

示例:

<?php
global $myvar;
$myvar = 'some value';

function using_myvar() {
    global $myvar;
    some_processing_with($myvar);
}

register_activation_hook(__FILE__, 'using_myvar');

Nota bene:自从第一次激活后,该插件被认为是安全的&#39;全球include();只需要将上述回调使用的变量在文件范围内声明为全局。