问题描述

我正在构建一个插件,为主插件添加额外的功能。理想情况下,在插件管理屏幕中,”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'">&laquo; 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。