必须使用插件自动加载器:如何正确使用get_plugins()?

时间:2014-05-04 作者:Petr Cibulka

我的autoloader类负责加载必须使用的插件,这些插件不位于mu-plugins 文件夹要定位它们,我需要使用get_plugins() 作用According to Codex, 该函数接受一个参数:

$plugin\\u folder(string)(可选):单个插件文件夹的相对路径。

我的文件层次结构如下所示:

|-- /mu-plugins
|   |-- autoload.php                    // only includes wpmu/autoload.php
|   |-- /wpmu
|   |   |-- autoload.php                // uses **get_plugins()** and autoloads other MU plugins
|   |-- /mu-plugin-to-autoload-A
|   |   |-- plugin-file-to-autoload.php // this plugin file should be autoloaded
|   |-- /mu-plugin-to-autoload-B
|   |   |-- plugin-file-to-autoload.php // this plugin file should be autoloaded
我想我应该这样做:

// array to store plugins
$plugins = [];
// get mu-plugin folders
$plugin_dirs = glob(WPMU_PLUGIN_DIR . \'/*\' , GLOB_ONLYDIR);
// loop through mu-plugin folders
foreach ($plugin_dirs as $plugin_dir) {
    $plugins[] = get_plugins($plugin_dir);
}
然而,get\\u plugins()函数返回一个空数组。

我想实现与Sébastien Lavoie在his Gist on GitHub. 它的脚本应该位于WPMU文件夹的根上,因为它使用get_plugins(\'/../mu-plugins\'), 这我一点都不明白(它是否来回移动到wpmu插件文件夹?)。

$plugins = array();
foreach (get_plugins(\'/../mu-plugins\') as $plugin_file => $data) {
    if (dirname($plugin_file) != \'.\') { // skip files directly at root
        $plugins[] = $plugin_file;
    }
}
尽管如此,it works (正如我所测试的)。

我希望一切都有意义。:)

1 个回复
SO网友:gmazzap

“get\\u plugins”仅用于常规插件,它还会查看插件头,并仅返回具有有效插件的插件,如

/* Plugin Name: A plugin */
然而,mu插件即使没有这个头也可以工作。

还考虑到WP 3.9引入了功能wp_register_plugin_realpath 这应用于确保与symbolink链接文件夹的兼容性。

根据Ryan McCue on make.wordpress.org 一个简单但有效的mu插件加载程序应该是这样的:

<?php
$plugins = array(
    \'my-mu-plugin/my-mu-plugin.php\'
);
foreach ( $plugins as $plugin ) {
    $path = dirname( __FILE__ ) . \'/\' . $plugin;
    // Add this line to ensure mu-plugins subdirectories can be symlinked
    wp_register_plugin_realpath( $path );
    include $path;
}
The$plugins 这里的数组是硬编码的。诚然,我发现这种方法比glob + get_plugins

因为:

它速度更快,适用于没有任何插件头的mu插件。当然,每次安装新插件时都需要手动在阵列上添加一行,但这不是一个大问题,而且还可以轻松停用mu插件。

结束

相关推荐

Mu-plugins文件夹在多站点安装中是如何工作的?

我对什么时候应该将插件文件放入mu插件有点困惑。我知道它必须使用插件,而且我知道它们是自动启用的。但是,在网络设置中,这是否会强制在所有子博客中启用插件文件?这是有道理的,那么这是我唯一一次应该在网络中放置插件文件吗?我什么时候希望插件代码在每个子博客中运行?例如,如果我想自动设置一个新的缩略图大小,我应该在那里这样做吗?或者还有其他例子吗。那么网络激活呢?