Câu trả lời:
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.
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' ) . '">« 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ế:
Nhược điểm:
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ế:
Bất lợi:
Đố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.
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.
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 :)
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.
if (is_plugin_active('path/to/plugin.php')) { // Do something }