我的钩子卸载类函数可以访问在主插件文件中声明的全局变量吗?

时间:2014-03-08 作者:Dan

我当前的设置如下。。。

在主插件文件中,设置了以下两个挂钩(不在任何类中):

register_activation_hook(__FILE__, array(\'DG_Setup\', \'activation\'));
register_uninstall_hook(__FILE__, array(\'DG_Setup\', \'uninstall\'));
此主文件包括包含以下内容的文件DG_Setup:

include_once DG_PATH . \'inc/class-setup.php\';
并声明$dg_options:

define(\'DG_OPTION_NAME\', \'document_gallery\');
$dg_options = get_option(DG_OPTION_NAME);
我假设通过引用钩子的主插件文件,其中的所有设置都会在我的卸载钩子执行之前运行,但情况似乎并非如此。

在同一个文件中,设置了许多声明和变量。当卸载挂钩启动时,它似乎无法访问任何声明的值或变量。我已经尝试在卸载挂钩中显式地包含主插件文件,但这并没有改变任何事情。

class DG_Setup {
   public static function uninstall() {
      if (!current_user_can(\'activate_plugins\')) return;
      check_admin_referer(\'bulk-plugins\');

      include_once plugin_dir_path(__FILE__) . \'class-thumber.php\';

      $options = DG_Thumber::getOptions();
      var_dump($options); // null

      foreach ($options[\'thumbs\'] as $val) {
         if (false !== $val) {
            @unlink($val[\'thumb_path\']);
         }
      }

      delete_option(DG_OPTION_NAME);
   }
}

class DG_Thumber {
   public static function getOptions() {
      include_once plugin_dir_path(dirname(__FILE__)) . \'document-gallery.php\';

      global $dg_options;
      return $dg_options[\'thumber\'];
   }
}
显然,我可以重新声明所有这些值,但是我在多个地方声明相同的值,这非常un-DRY. 所以我的问题是,我如何才能干净地处理这个问题?

1 个回复
最合适的回答,由SO网友:J.D. 整理而成

问题是您没有声明$dg_options 此处为全球:

define(\'DG_OPTION_NAME\', \'document_gallery\');
$dg_options = get_option(DG_OPTION_NAME);
卸载期间,您不在全局范围内,您的文件将包含在uninstall_plugin().

因此,您需要在主插件文件的顶部添加以下内容:

global $dg_options;
实际上,任何时候如果希望变量是全局变量,都应该确保使用global 陈述不要认为范围是理所当然的。

结束

相关推荐

为什么不调用/触发“Plugins_Load”?

我正在打电话load_plugin_textdomain 然而,一旦加载了插件,就不会发生这种情况。我确实激活了一个插件,所以这不应该触发吗?add_action(\"plugins_loaded\", \"test_override\"); function init_localization() { echo \"init_localization<br>\"; load_plugin_textdomain (&#x