Merci pour les réponses les gars. Bien que les deux réponses m'aient mis sur la bonne voie, aucune n'a fonctionné hors de la boîte. Je partage donc mes solutions ci-dessous.
Méthode 1 - Utilisation de register_activation_hook:
Créez le plugin parent dans plugins / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Créez le plugin enfant dans 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>');
}
}
Notez que je n'utilise pas deactivate_plugins( $plugin );
car pour une raison quelconque, cela ne fonctionne pas. J'ai donc utilisé wp_die pour annuler la redirection d'activation et informer l'utilisateur.
Avantage:
- Solution simple et n'entraîne pas de hits db supplémentaires par rapport à la méthode 2
Désavantages:
- L'écran wp_die est moche
- L'écran wp_die apparaîtra TOUJOURS si vous avez activé le plug-in parent et le plug-in enfant en même temps en utilisant les cases à cocher dans l'écran d'administration des plug-ins.
Méthode 2 - Utilisation de admin_init et admin_notices
Créez le plugin parent dans plugins / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Créez le plugin enfant dans 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
}
Avantage:
- Fonctionne lorsque vous activez le plug-in parent et enfant en même temps à l'aide de cases à cocher
Désavantage:
- Générez des hits db supplémentaires car le plugin est en fait activé au début et désactivé une fois admin_init exécuté.
Quant à ma question concernant la désactivation du lien d'activation, je pourrais utiliser:
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;
}
Cependant, il s'est avéré très peu pratique car il n'y a PAS de place pour mettre ce code. Je ne pouvais pas le mettre sur le plugin parent car le plugin parent devrait être actif pour que ce code s'exécute. N'appartient certainement pas au plugin enfant ou à functions.php. Donc, je supprime cette idée.
if (is_plugin_active('path/to/plugin.php')) { // Do something }