問題描述

我正在構建一個外掛,為主外掛新增額外的功能。理想情況下,在外掛管理螢幕中,”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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。