#1 楼
谢谢你们的答案。尽管这两个答案都使我走上了正确的道路,但没有一个是开箱即用的。因此,我在下面分享我的解决方案。方法1-使用register_activation_hook:
在plugins / 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="' . admin_url( 'plugins.php' ) . '">« Return to Plugins</a>');
}
}
通知由于某些原因,我没有使用
deactivate_plugins( $plugin );
,因此无法正常工作。因此,我使用wp_die取消了激活重定向并通知用户。 优点:
简单的解决方案,与方法2相比,不会产生额外的数据库命中率
缺点: br />
wp_die屏幕很丑陋
如果同时使用插件管理屏幕中的复选框激活了父插件和子插件,wp_die屏幕仍会显示。
方法2-使用admin_init和admin_notices
在plugins / parent-plugin / parent-plugin.php中创建父插件:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
在plugins / 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
}
当您使用复选框同时激活Parent and Child插件时起作用
由于插件是实际上最初是激活的,而在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。所以我放弃了这个主意。
评论
方法2效果很好!我用它来扩展别人的插件。
–科林·普赖斯
2014年7月17日在18:32
我还可以使用它来要求Wordpress插件目录中的插件吗?我想创建一个职位发布插件,但是使用现有的表单插件(例如Formidable或Caldera Forms)来创建应用程序表单。
– Thessa Verbruggen
20年1月14日在9:17
#2 楼
两种建议的解决方案都有缺陷。方法1:如前所述,当使用插件管理屏幕中的复选框同时激活父插件和子插件时,wp_die()屏幕仍会显示。
方法2:在某些用例中,这不好,因为在“ plugins_loaded”(https://codex.wordpress.org/Plugin_API/Action_Reference)之后和卸载挂钩(https://codex.wordpress.org/Function_Reference/register_uninstall_hook)。因此,例如,如果我们确实希望该插件在卸载时运行某些代码(无论父插件是否处于活动状态),则此方法将不起作用。
解决方案:
首先,我们需要在父插件的主PHP文件的末尾附加以下代码:
do_action( 'my_plugin_loaded' );
这将向所有订阅者分发事件/信号,说明核心插件已加载。
然后,附加组件的类应如下所示: :)
评论
这个答案也有缺陷。 :-)假设您完全控制了父插件,可以在其中添加do_action('my_plugin_loaded');在其代码中。选择的答案将在父插件不受控制的情况下起作用(例如,父插件不是您自己的)
–kosinix
16-3-29在3:14
谢谢,这正是我想要的。就我而言,我确实可以完全控制父插件,因此需要创建这种依赖关系。
–cr0ybot
18年8月15日在19:22
#3 楼
对此进行了注释,请尝试一下。这样可以帮助您理解它。 '并将其设置为false或未激活。#4 楼
我认为您需要TGM插件激活。TGM插件激活是一个PHP库,可让您轻松
要求或推荐WordPress主题(和插件)插件。
它允许您的用户使用本机WordPress类,功能和接口以单个或批量方式安装,更新甚至自动
激活插件。您可以引用捆绑的插件,
WordPress插件存储库中的插件,甚至是Internet上其他位置托管的插件。
评论
链接错误。正确的链接在这里
– XedinUnknown
18年11月16日在18:20
评论
怎样使用is_plugin_active()呢?例如:if(is_plugin_active('path / to / plugin.php')){//做某事}