J'ai un simple contrôle de dépendance au début de certains plugins - qui vérifie si un autre plugin est installé et actif (en utilisant class_exists()
).
Cela fonctionne bien dans le flux normal de WordPress - comme le plugin qui inclut la classe requise est configuré pour instancier plus tôt et que je re-commande également les plugins disponibles pour que ce plugin soit chargé en premier - comme ceci:
/**
* Force this plugin to load first
*
* @since 0.1
* @return void
*/
public function load_this_plugin_first()
{
// grab plugin directory + file name ##
$path = plugin_basename(dirname(__FILE__)).'/'.basename(__FILE__);
// grab the list of active plugins ##
if ( $plugins = get_option( 'active_plugins' ) ) {
// check if out plugin is in there ##
if ( $key = array_search( $path, $plugins ) ) {
// Push it to the top of the list ##
array_splice( $plugins, $key, 1 );
array_unshift( $plugins, $path );
update_option( 'active_plugins', $plugins );
}
}
}
Tout cela fonctionne bien jusqu'à ce que je doive mettre à jour un plugin - les autres plugins sont alors tous désactivés - car toutes les vérifications class_exists()
renvoient false.
Donc, j'aimerais savoir s'il existe une constante - telle que DOING_AUTOSAVE pour les mises à jour de plugins - quelque chose comme DOING_PLUGIN_UPDATE?
Au lieu de réorganiser le chargement de vos plugins dans un ordre spécifique, demandez à chacun d'entre eux de charger un autre plugin afin de différer leur initialisation jusqu'au raccordement de l'action "plugins_loaded".
En d'autres termes, lorsqu'un plugin avec une dépendance est inclus et exécuté, il ne devrait rien faire directement. Au lieu de cela, il devrait avoir des fonctions, puis add_action appelle pour lier ces fonctions à plugins_loaded. Cette fonction appelée ultérieurement peut effectuer la vérification class_exists et agir en conséquence.
Que diriez-vous d'utiliser WP_INSTALLING? - Ce chèque est placé au dessus du plugin principal Class ...
if ( ! class_exists( 'REQUIRED_CLASS_NAME' ) && ! defined( 'WP_INSTALLING' ) ) {
// give some notice to the user ##
add_action('admin_notices', function(){
$plugin = get_plugin_data( __FILE__ );
echo "<div id='message' class='error'><p><code>".$plugin["Name"]."</code> has been deactivated because it requires the <a href='#'>PLUGIN NAME</a>.</p></div>";
if ( isset( $_GET['activate'] ) ) {
unset( $_GET['activate'] ); // remove the activation notice ##
}
});
// turn this plugin off ##
add_action('admin_notices', function(){
deactivate_plugins( plugin_basename( __FILE__ ) );
});
// stop this plugin from running ##
return;
}
La classe de plug-in actuelle est la suivante:
if ( ! class_eixsts( "Plugin_Class" ) )
{
Plugin_Class()
{
...
}
}