问题描述
我正在构建一个插件,为主插件添加额外的功能。理想情况下,在插件管理屏幕中,”activate” 链接应该被禁用,并且应该添加一个内联注释,告诉用户在他/她可以使用当前插件之前首先安装和激活主插件。
最佳解决方案
谢谢你们的答案。虽然这两个答案都让我走上了正确的道路,但没有一个出来。所以我在下面分享我的解决方案。
方法 1 – 使用 register_activation_hook:
在插件/parent-plugin /parent-plugin.php 中创建父插件:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
在插件中创建子插件/child-plugin /child-plugin.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="'%20.%20admin_url(%20'plugins.php'%20)%20.%20'">« Return to Plugins</a>');
}
}
请注意,由于某种原因,我不使用 deactivate_plugins( $plugin );
它不起作用。所以我用 wp_die 取消激活重定向并通知用户。
优点:
-
简单的解决方案,与方法 2 相比,不会产生额外的数据库命中
缺点:
-
wp_die 屏幕是丑陋的
-
如果您使用插件管理屏幕中的复选框同时激活了父插件和子插件,wp_die 屏幕将显示。
方法 2 – 使用 admin_init 和 admin_notices
在插件/parent-plugin /parent-plugin.php 中创建父插件:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
在插件中创建子插件/child-plugin /child-plugin.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
}
优点:
-
当您同时使用复选框激活父和子插件时工作
坏处:
-
Incur 其他数据库命中,首先实际激活插件,并在 admin_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;
}
但是,由于没有地方放这个代码,原来是非常不切实际的。我不能把它放在父插件上,因为父插件应该是活动的,代码可以运行。当然不属于子插件或 functions.php 。所以我打破了这个想法。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。