我正在编写一个需要另一个插件的插件。因此,我必须首先检查其他插件的版本是否正确。
如果是,我想在插件页面中添加一个子菜单页面,但这里的代码似乎不起作用。
我认为问题是,我只能用延迟挂钩(admin\\u init)检查其他插件的存在。但要添加子菜单,我必须使用早期的挂钩(admin\\u菜单)。如何解决这个问题?
class acf_multisite_sync {
function __construct() {
add_action(\'admin_init\', array($this, \'acf_sync_init\'));
}
function acf_sync_init() {
$plugins = get_plugins();
if (isset($plugins[\'advanced-custom-fields-pro/acf.php\'])) {
if ($plugins[\'advanced-custom-fields-pro/acf.php\'][\'Version\'] >= 5
&& is_plugin_active(\'advanced-custom-fields-pro/acf.php\')
&& is_main_site()) {
add_action(\'admin_menu\', array($this, \'acf_sync_submenu\'));
}
}
}
function acf_sync_submenu() {
add_submenu_page(
\'edit.php?post_type=acf-field-group\',
\'Multisite\',
\'Multisite\',
\'manage_options\',
\'acf-sync\',
array($this, \'acf_sync_callback\')
);
}
function acf_sync_callback() {
echo \'My Submenu Content\';
}
}
new acf_multisite_sync();
最合适的回答,由SO网友:Philipp Kühn 整理而成
好的,我知道了。解决方案是使用早期的钩子来检查插件。但是函数get\\u plugins()不可用,因此我必须将其包括在内以供使用。工作代码:
class acf_multisite_sync {
function __construct() {
add_action(\'plugins_loaded\', array($this, \'acf_sync_init\'));
}
function acf_sync_init() {
if (!function_exists(\'get_plugins\')) {
require_once ABSPATH . \'wp-admin/includes/plugin.php\';
}
$plugins = get_plugins();
if (isset($plugins[\'advanced-custom-fields-pro/acf.php\'])) {
if ($plugins[\'advanced-custom-fields-pro/acf.php\'][\'Version\'] >= 5
&& is_plugin_active(\'advanced-custom-fields-pro/acf.php\')
&& is_main_site()) {
add_action(\'admin_menu\', array($this, \'acf_sync_submenu\'), 100);
}
}
}
function acf_sync_submenu() {
add_submenu_page(
\'edit.php?post_type=acf-field-group\',
\'Multisite\',
\'Multisite\',
\'manage_options\',
\'acf-sync\',
array($this, \'acf_sync_callback\')
);
}
function acf_sync_callback() {
echo \'My Submenu Content\';
}
}
new acf_multisite_sync();