Gracias por las respuestas chicos. Aunque ambas respuestas me pusieron en el camino correcto, ninguna de ellas salió de la caja. Así que estoy compartiendo mis soluciones a continuación.
Método 1: uso de register_activation_hook:
Cree el complemento para padres en los complementos / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Crea el complemento infantil en complementos / 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>');
}
}
Observe que no estoy usando deactivate_plugins( $plugin );
porque, por alguna razón, no funciona. Así que utilicé wp_die para cancelar la redirección de activación e informar al usuario.
Advantage:
- Solución simple y no incurre en db hits adicionales en comparación con el método 2
Desventajas:
- la pantalla wp_die es fea
- la pantalla wp_die AÚN se mostrará si activó el complemento principal y el complemento secundario al mismo tiempo utilizando las casillas de verificación en la pantalla de administración de complementos.
Método 2: uso de admin_init y admin_notices
Cree el complemento para padres en los complementos / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Crea el complemento infantil en complementos / 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
}
Advantage:
- Funciona cuando activa el complemento de Padres e Hijos al mismo tiempo usando las casillas de verificación
Desventaja :
- Incurra en db hits adicionales ya que el complemento se activa al principio y se desactiva una vez que se ejecuta admin_init.
En cuanto a mi pregunta sobre la desactivación del enlace de activación, podría usar:
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;
}
Sin embargo, resultó ser poco práctico ya que NO hay lugar para poner este código. No podría ponerlo en el complemento principal, ya que el complemento principal debería estar activo para que se ejecute este código. Ciertamente no pertenece al plugin hijo o functions.php. Así que estoy desechando esta idea.