Làm thế nào để tạo một plugin yêu cầu một plugin khác?


30

Tôi đang xây dựng một plugin bổ sung thêm chức năng cho một plugin chính. Lý tưởng nhất là trong màn hình quản trị plugin, nên tắt liên kết "kích hoạt" và thêm một ghi chú nội tuyến để cho người dùng cài đặt và kích hoạt plugin chính trước khi họ có thể sử dụng plugin hiện tại.


1
Còn việc sử dụng: is_plugin_active () thì sao? ví dụ: if (is_plugin_active('path/to/plugin.php')) { // Do something }
TomC

Câu trả lời:


35

Cảm ơn các anh vì các câu trả lời. Mặc dù cả hai câu trả lời đều đưa tôi đi đúng hướng, nhưng không có câu trả lời nào phù hợp. Vì vậy, tôi đang chia sẻ giải pháp của tôi dưới đây.

Phương pháp 1 - Sử dụng register_activation_hook:

Tạo Plugin cha trong plugin / Parent-plugin / Parent-plugin.php:

<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/

Tạo Plugin con trong plugin / 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' ) . '">&laquo; Return to Plugins</a>');
    }
}

Lưu ý rằng tôi không sử dụng deactivate_plugins( $plugin );vì một số lý do nó không hoạt động. Vì vậy, tôi đã sử dụng wp_die để hủy chuyển hướng kích hoạt và thông báo cho người dùng.

Lợi thế:

  • Giải pháp đơn giản và không phải chịu thêm lần truy cập db so với phương pháp 2

Nhược điểm:

  • màn hình wp_die xấu
  • Màn hình wp_die sẽ VẪN hiển thị nếu bạn kích hoạt Plugin gốc và Plugin con cùng lúc bằng các hộp kiểm trong màn hình quản trị bổ trợ.

Phương pháp 2 - Sử dụng admin_init và admin_notices

Tạo Plugin cha trong plugin / Parent-plugin / Parent-plugin.php:

<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/

Tạo Plugin con trong plugin / 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
}

Lợi thế:

  • Hoạt động khi bạn kích hoạt plugin Cha mẹ và Trẻ em cùng lúc bằng các hộp kiểm

Bất lợi:

  • Phát sinh thêm các lần truy cập db khi plugin thực sự được kích hoạt lúc đầu và bị hủy kích hoạt sau khi admin_init chạy.

Đối với câu hỏi của tôi về việc vô hiệu hóa liên kết kích hoạt, tôi có thể sử dụng:

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;
}

Tuy nhiên, hóa ra nó rất không thực tế vì KHÔNG có nơi nào để đặt mã này. Tôi không thể đặt nó trên plugin cha vì plugin cha nên được kích hoạt để mã này chạy. Chắc chắn không thuộc về plugin con hoặc hàm.php. Vì vậy, tôi đang loại bỏ ý tưởng này.


1
Phương pháp 2 làm việc tuyệt vời! Tôi đã sử dụng nó để mở rộng plugin của người khác.
Giá Collin

2

Hãy thử nó, nó nhận xét, vì vậy sẽ giúp bạn hiểu nó.

<?php
register_activation_hook( __FILE__, 'myplugin_activate' ); // Register myplugin_activate on
function myplugin_activate() {
    $plugin = plugin_basename( __FILE__ ); // 'myplugin'
    if ( is_plugin_active( 'plugin-directory/first-plugin.php' ) ) {
        // Plugin was active, do hook for 'myplugin'
    } else {
        // Plugin was not-active, uh oh, do not allow this plugin to activate
        deactivate_plugins( $plugin ); // Deactivate 'myplugin'
    }
}
?> 

Nếu điều này đưa ra một lỗi, bạn cũng có thể kiểm tra 'tùy chọn' của 'myplugin' và đặt thành sai hoặc không được kích hoạt.


2

Cả hai giải pháp được đề xuất đều có sai sót.

Phương pháp 1: Như đã đề cập, màn hình wp_die () sẽ VẪN hiển thị khi Plugin gốc và Plugin con được kích hoạt cùng lúc bằng cách sử dụng các hộp kiểm trong màn hình quản trị bổ trợ.

Phương pháp 2: Trong một số trường hợp sử dụng, điều đó không tốt vì 'admin_init' được thực thi theo cách sau 'plugins_loaded' ( https://codex.wordpress.org/Plugin_API/Action_Reference ) và sau móc gỡ cài đặt ( https: // codex. wordpress.org/Function_Reference/register_uninstall_hook ). Vì vậy, ví dụ, nếu chúng tôi muốn bổ trợ chạy một số mã khi gỡ cài đặt cho dù plugin cha có hoạt động hay không, phương pháp này sẽ KHÔNG hoạt động.

Dung dịch:

Trước hết, chúng ta cần nối thêm đoạn mã sau vào cuối tệp PHP chính của plugin cha mẹ:

do_action( 'my_plugin_loaded' );

Điều này sẽ gửi một sự kiện / tín hiệu cho tất cả các thuê bao, nói rằng plugin lõi đã được tải.

Sau đó, lớp bổ trợ sẽ trông như sau:

class My_Addon
{
    static function init ()
    {
        register_activation_hook( __FILE__, array( __CLASS__, '_install' ) );

        if ( ! self::_is_parent_active_and_loaded() ) {
            return;
        }
    }

    #region Parent Plugin Check

    /**
     * Check if parent plugin is activated (not necessarly loaded).
     *
     * @author Vova Feldman (@svovaf)
     *
     * @return bool
     */
    static function _is_parent_activated()
    {
        $active_plugins_basenames = get_option( 'active_plugins' );
        foreach ( $active_plugins_basenames as $plugin_basename ) {
            if ( false !== strpos( $plugin_basename, '/my-plugin-main-file.php' ) ) {
                return true;
            }
        }

        return false;
    }

    /**
     * Check if parent plugin is active and loaded.
     *
     * @author Vova Feldman (@svovaf)
     *
     * @return bool
     */
    static function _is_parent_active_and_loaded()
    {
        return class_exists( 'My_Plugin' );
    }

    /**
     *
     * @author Vova Feldman (@svovaf)
     */
    static function _install()
    {
        if ( ! self::_is_parent_active_and_loaded() ) {
            deactivate_plugins( basename( __FILE__ ) );

            // Message error + allow back link.
            wp_die( __( 'My Add-on requires My Plugin to be installed and activated.' ), __( 'Error' ), array( 'back_link' => true ) );
        }
    }

    #endregion Parent Plugin Check
}

if (My_Addon::_is_parent_active_and_loaded())
{
    // If parent plugin already included, init add-on.
    My_Addon::init();
}
else if (My_Addon::_is_parent_activated())
{
    // Init add-on only after the parent plugins is loaded.
    add_action( 'my_plugin_loaded', array( __CLASS__, 'init' ) );
}
else
{
    // Even though the parent plugin is not activated, execute add-on for activation / uninstall hooks.
    My_Addon::init();
}

Hy vọng nó giúp :)


4
Câu trả lời này có một lỗ hổng quá. :-) Nó giả định rằng bạn có toàn quyền kiểm soát plugin cha mẹ, nơi bạn có thể thêm do_action ('my_plugin_loaded'); trong mã của nó. Câu trả lời được chọn sẽ hoạt động với hoặc không có sự kiểm soát của plugin cha (ví dụ: plugin cha không phải của bạn)
kosinix

Cảm ơn bạn, đây chính xác là những gì tôi đang tìm kiếm. Trong trường hợp của tôi, tôi làm có toàn quyền kiểm soát các plugin phụ huynh, và cần thiết để tạo ra loại này phụ thuộc.
cr0ybot

0

Tôi nghĩ rằng bạn cần kích hoạt Plugin TGM .

Kích hoạt Plugin TGM là một thư viện PHP cho phép bạn dễ dàng yêu cầu hoặc đề xuất các plugin cho các chủ đề (và plugin) WordPress của bạn. Nó cho phép người dùng của bạn cài đặt, cập nhật và thậm chí tự động kích hoạt các plugin theo kiểu số ít hoặc hàng loạt bằng cách sử dụng các lớp, chức năng và giao diện WordPress gốc. Bạn có thể tham khảo các plugin, plugin được tích hợp từ Kho lưu trữ Plugin WordPress hoặc thậm chí các plugin được lưu trữ ở nơi khác trên internet.


Liên kết sai. Liên kết đúng ở đây
XedinUnknown
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.