我觉得没有早点注意到这一点有点莫名其妙,但我最终意识到,我电脑上的插件目录是指向另一个位置的符号链接,正如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
目录,并从基本插件文件调用。这两种情况似乎都由插件开发人员控制,尽管我很好奇是否有人有相反的想法。
其他链接: