Terima kasih atas jawabannya kawan. Meskipun kedua jawaban itu menempatkan saya di jalan yang benar, tidak ada yang berhasil. Jadi saya membagikan solusi saya di bawah ini.
Metode 1 - Menggunakan register_activation_hook:
Buat Plugin Induk di plugins / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Buat Child Plugin di 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
*/
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>');
}
}
Perhatikan bahwa saya tidak menggunakan deactivate_plugins( $plugin );
karena beberapa alasan tidak berfungsi. Jadi saya menggunakan wp_die untuk membatalkan pengalihan aktivasi dan memberi tahu pengguna.
Keuntungan:
- Solusi sederhana dan tidak menimbulkan hit db tambahan dibandingkan dengan metode 2
Kekurangan:
- Layar wp_die jelek
- Layar wp_die akan MASIH muncul jika Anda mengaktifkan Plugin Induk dan Plugin Anak secara bersamaan menggunakan kotak centang di layar admin plugin.
Metode 2 - Menggunakan admin_init dan admin_notices
Buat Plugin Induk di plugins / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Buat Child Plugin di 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
}
Keuntungan:
- Bekerja ketika Anda mengaktifkan plugin Parent and Child secara bersamaan menggunakan kotak centang
Kerugian:
- Hasilkan tambahan db karena plugin sebenarnya diaktifkan pada awalnya dan dinonaktifkan setelah admin_init berjalan.
Adapun pertanyaan saya tentang menonaktifkan tautan aktif, saya dapat menggunakan:
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;
}
Namun, ternyata sangat tidak praktis karena TIDAK ada tempat untuk meletakkan kode ini. Saya tidak bisa meletakkannya di plugin induk karena plugin induk harus aktif untuk menjalankan kode ini. Tentu saja bukan milik plugin anak atau functions.php. Jadi saya membatalkan ide ini.
if (is_plugin_active('path/to/plugin.php')) { // Do something }