谢谢大家的回答。虽然这两个答案都让我走上了正确的道路,但没有一个是现成的。因此,我在下面分享我的解决方案。
方法1-使用register\\u activation\\u挂钩:
在插件/父插件/父插件中创建父插件。php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
在插件/子插件/子插件中创建子插件。php:
<?php
/*
Plugin Name: Child Plugin
Description: Parent Plugin should be installed and active to use this plugin.
Version: 1.0.0
*/
register_activation_hook( __FILE__, \'child_plugin_activate\' );
function child_plugin_activate(){
// Require parent plugin
if ( ! is_plugin_active( \'parent-plugin/parent-plugin.php\' ) and current_user_can( \'activate_plugins\' ) ) {
// Stop activation redirect and show error
wp_die(\'Sorry, but this plugin requires the Parent Plugin to be installed and active. <br><a href="\' . admin_url( \'plugins.php\' ) . \'">« Return to Plugins</a>\');
}
}
注意,我没有使用
deactivate_plugins( $plugin );
由于某种原因,它不起作用。因此,我使用wp\\u die取消激活重定向并通知用户。
Advantage:
<简单的解决方案,与方法2相比不会产生额外的db命中
Disadvantages:
<如果使用插件管理屏幕中的复选框同时激活父插件和子插件,wp\\U die屏幕仍然会显示方法2-使用admin\\u init和admin\\u通知在插件/父插件/父插件中创建父插件。php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
在插件/子插件/子插件中创建子插件。php:
<?php
/*
Plugin Name: Child Plugin
Description: Parent Plugin should be installed and active to use this plugin.
Version: 1.0.0
*/
add_action( \'admin_init\', \'child_plugin_has_parent_plugin\' );
function child_plugin_has_parent_plugin() {
if ( is_admin() && current_user_can( \'activate_plugins\' ) && !is_plugin_active( \'parent-plugin/parent-plugin.php\' ) ) {
add_action( \'admin_notices\', \'child_plugin_notice\' );
deactivate_plugins( plugin_basename( __FILE__ ) );
if ( isset( $_GET[\'activate\'] ) ) {
unset( $_GET[\'activate\'] );
}
}
}
function child_plugin_notice(){
?><div class="error"><p>Sorry, but Child Plugin requires the Parent plugin to be installed and active.</p></div><?php
}
Advantage:
<当您使用复选框同时激活父插件和子插件时,ul>
工作Disadvantage:
- 会导致额外的db点击,因为插件实际上首先被激活,一旦admin\\u init运行就会被停用
至于我关于禁用激活链接的问题,我可以使用:add_filter( \'plugin_action_links\', \'disable_child_link\', 10, 2 );
function disable_child_link( $links, $file ) {
if ( \'child-plugin/child-plugin.php\' == $file and isset($links[\'activate\']) )
$links[\'activate\'] = \'<span>Activate</span>\';
return $links;
}
然而,事实证明这是非常不切实际的,因为没有地方放置此代码。我无法将其放在父插件上,因为父插件应该处于活动状态才能运行此代码。当然不属于子插件或函数。php。所以我放弃了这个想法。