web-dev-qa-db-fra.com

Comment vérifier si WordPress met à jour des plugins?

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?

2
Q Studio

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.

3
Otto

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() 
    { 
      ... 
    } 
}
0
Q Studio