Gracias por la respuesta chicos. Aunque ambas respuestas me pusieron en el camino correcto, ninguna salió de la caja. Así que estoy compartiendo mis soluciones a continuación.
Método 1 - Usando register_activation_hook:
Cree el complemento principal en plugins / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Cree el complemento infantil en 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>');
}
}
Tenga en cuenta que no estoy usando deactivate_plugins( $plugin );
ya que por alguna razón no funciona. Entonces utilicé wp_die para cancelar la redirección de activación e informar al usuario.
Ventaja:
- Solución simple y no incurre en db hits adicionales en comparación con el método 2
Desventajas
- la pantalla de wp_die es fea
- La pantalla wp_die TODAVÍA aparecerá si activó el complemento principal y el complemento secundario al mismo tiempo usando 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 principal en plugins / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Cree el complemento infantil en 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
}
Ventaja:
- Funciona cuando activa el complemento principal y secundario al mismo tiempo mediante casillas de verificación
Desventaja:
- Incurra db hits adicionales ya que el complemento se activa realmente 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 muy poco práctico ya que NO hay lugar para poner este código. No pude ponerlo en el complemento principal ya que el complemento principal debe estar activo para que se ejecute este código. Ciertamente no pertenece al plugin secundario o functions.php. Así que estoy desechando esta idea.
if (is_plugin_active('path/to/plugin.php')) { // Do something }