Дякую за відповіді, хлопці. Хоча обидві відповіді ставили мене на правильний шлях, жодна з них не вийшла. Тому я ділюсь своїми рішеннями нижче.
Спосіб 1 - Використання register_activation_hook:
Створіть батьківський плагін у плагінах / батьківських плагінах / батьківських плагінах.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="' . admin_url( 'plugins.php' ) . '">« Return to Plugins</a>');
}
}
Зауважте, що я не використовую, deactivate_plugins( $plugin );
оскільки чомусь це не працює. Тому я використав wp_die, щоб скасувати переадресацію активації та повідомити користувача.
Перевага:
- Просте рішення і не спричиняє додаткових звернень на db порівняно з методом 2
Недоліки:
- Екран wp_die некрасивий
- Екран wp_die ВИНАГИ з’явиться, якщо ви одночасно активували батьківський плагін та дочірній плагін за допомогою прапорців на екрані адміністратора плагінів.
Спосіб 2 - Використання admin_init та admin_notices
Створіть батьківський плагін у плагінах / батьківських плагінах / батьківських плагінах.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
}
Перевага:
- Працює, коли ви одночасно активуєте плагін Parent and Child, використовуючи прапорці
Недолік:
- Введіть додаткові хіти db, оскільки плагін насправді активується спочатку та деактивується, як тільки 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;
}
Однак це виявилося вкрай непрактично, оскільки немає місця для цього коду. Я не зміг поставити його на батьківський плагін, оскільки батьківський плагін повинен бути активним для запуску цього коду. Безумовно, не належить до дочірніх плагінів або function.php. Тож я беру цю ідею.
if (is_plugin_active('path/to/plugin.php')) { // Do something }