调试寄存器_ACTIVATION_HOOK()

时间:2011-09-22 作者:davidfrey

我很好奇WordPress或PHP是否存在已知的问题,环境可能会退化到WordPress忽略register\\u activation\\u hook()调用的程度。我在运行MAMP的本地环境中紧张地工作了一个小时,这时我让一位同事在她的机器上测试代码;完全相同的代码在一台机器上工作,但在另一台机器上不工作。

在本例中,我只是想将消息附加到日志文件中,我正在实时跟踪该日志文件。

error_log("Plugin code is being processed");

register_activation_hook( __FILE__, \'myplugin_activate\' );

function myplugin_activate()
{
    error_log("Attempting to activate");
    die("Should not activate");
}
我的机器上运行MAMP并单击我的插件下的“激活”链接的输出:

[22-Sep-2011 22:37:16] Plugin code is being processed
[22-Sep-2011 22:37:16] Plugin code is being processed

3 个回复
最合适的回答,由SO网友:davidfrey 整理而成

再想一想,我认为使用解析路径查找可能更安全:

function plugin_symlink_path( $file )
{
    // If the file is already in the plugin directory we can save processing time.
    if ( preg_match( \'/\'.preg_quote( WP_PLUGIN_DIR, \'/\' ).\'/i\', $file ) ) return $file;

    // Examine each segment of the path in reverse
    foreach ( array_reverse( explode( \'/\', $file ) ) as $segment )
    {
        // Rebuild the path starting from the WordPress plugin directory
        // until both resolved paths match.

        $path = rtrim($segment .\'/\'. $path, \'/\');       

        if ( __FILE__ == realpath( WP_PLUGIN_DIR . \'/\' . $path ) )
        {
            return WP_PLUGIN_DIR . \'/\' . $path;
        }
    }

    // If all else fails, return the original path.
    return $file;
}

SO网友:davidfrey

我觉得没有早点注意到这一点有点莫名其妙,但我最终意识到,我电脑上的插件目录是指向另一个位置的符号链接,正如Kunal Bhalla在symlinks with WP plugins. 自从__FILE__ 解析符号链接register_activation_hook() 正在尝试加载WordPress插件路径之外的文件。

如果你看看register_activation_hook() 插件中的函数。php你会看到魔术似乎发生在plugin_basename():

function register_activation_hook($file, $function) {
    $file = plugin_basename($file);
    add_action(\'activate_\' . $file, $function);
}
进一步检查表明:plugin_basename() 本质上是执行模式替换,试图将系统路径转换为my_plugin/my_plugin.php; 然而,自str_replace() 正在使用WP_PLUGIN_DIR 作为主题,WordPress插件目录之外的任何系统路径都不会生成匹配项来替换:

function plugin_basename($file) {
    $file = str_replace(\'\\\\\',\'/\',$file); // sanitize for Win32 installs
    $file = preg_replace(\'|/+|\',\'/\', $file); // remove any duplicate slash
    $plugin_dir = str_replace(\'\\\\\',\'/\',WP_PLUGIN_DIR); // sanitize for Win32 installs
    $plugin_dir = preg_replace(\'|/+|\',\'/\', $plugin_dir); // remove any duplicate slash
    $mu_plugin_dir = str_replace(\'\\\\\',\'/\',WPMU_PLUGIN_DIR); // sanitize for Win32 installs
    $mu_plugin_dir = preg_replace(\'|/+|\',\'/\', $mu_plugin_dir); // remove any duplicate slash
    $file = preg_replace(\'#^\' . preg_quote($plugin_dir, \'#\') . \'/|^\' . preg_quote($mu_plugin_dir, \'#\') . \'/#\',\'\',$file); // get relative path from plugins dir
    $file = trim($file, \'/\');
    return $file;
}
这个方法似乎有点短小,我发现了几种解决方案,包括在wp-config.php 硬编码插件的相对路径。相反,我认为更好的权宜之计可能是使用以下预先定义路径的模式plugin_basename() 正在尝试提取。这可以用来代替__FILE__ 作为的第一个参数register_activation_hook().

basename( dirname( __FILE__ ) ).\'/\'.basename( __FILE__ );
只有当插件在wp-content/plugins 目录,并从基本插件文件调用。这两种情况似乎都由插件开发人员控制,尽管我很好奇是否有人有相反的想法。

其他链接:

SO网友:T.Todua

我使用了这个方法:在插件中插入以下代码。然后激活它。

function save_error()
{
   file_put_contents(ABSPATH. \'wp-content/plugins/error_activation.html\', ob_get_contents());
}
add_action(\'activated_plugin\',\'save_error\');
激活后,打开您的站点。com/wp-content/plugins/error\\u激活。查看发生了什么错误。

结束

相关推荐

Switching Code plugins

我目前正在使用“Wordpress代码片段”为插入到帖子中的代码添加功能。这个插件的工作方式是将代码添加到设置中的插件库中,然后执行类似于[代码:1]的操作(我记不清确切的语法了)我真的不太喜欢它的风格,所以我希望使用谷歌的美化。停用此插件会有什么影响?我会丢失所有的代码片段吗?我是否需要浏览每一篇文章并编辑所有的代码片段(即[代码:1])?