web-dev-qa-db-fra.com

Désactivation automatique des plugins après une action

Je développe un plugin WordPress.

Je souhaite télécharger un fichier depuis un serveur, puis décompresser et le placer dans le répertoire principal de WordPress une fois le plugin activé. Le processus de téléchargement et de décompression du fichier s’exécutant correctement, j’ai du mal à désactiver le plug-in une fois ce processus terminé. Comment puis-je le réparer?

class WP_X_Plugin{

public function __construct(){
    register_activation_hook( __FILE__, array( $this , 'activate' ) );

    $url = "http://mysitedomain.com/script/dist.Zip";
    file_put_contents("dist.Zip", file_get_contents($url));

    $plugin_Zip = new ZipArchive;

    $plugin_Zip->open('dist.Zip');
    $plugin_Zip->extractTo(ABSPATH);
    $plugin_Zip->close();

    rename('dist.php', ABSPATH.'/wp-script.php');
    if( unlink('dist.Zip') ){
      // if i call the deactivate_plugins() function of wordpress, I will have an error logged in console PHP Fatal error:  Uncaught Error: Call to undefined function deactivate_plugins().
      deactivate_plugins( plugin_basename(__FILE__) );
      header('Location: wp-script.php');
    }
}

}

$wp_x = new WP_X_Plugin;

METTRE À JOUR

J'ai résolu le problème en exigeant le fichier plugin.php qui se trouve dans le dossier wp-admin/includes. J'ai utilisé cette solution après avoir lu certaines questions liées au même problème. Si j'ai bien compris, les fonctions des plugins ne sont disponibles que si wp a déjà chargé ce fichier au moment de l'exécution.

1
user9741470

La fonction deactivate_plugins () n'est disponible qu'après l'exécution de l'action admin_init. Vous devez soit enregistrer le filtre 'admin_init' et y exécuter la fonction deactivate_plugins (), soit inclure manuellement le fichier wp-admin/includes/plugin.php.

J'ai mis à jour votre code avec la deuxième solution ci-dessous.

class WP_X_Plugin{

    public function __construct(){
        register_activation_hook( __FILE__, array( $this , 'activate' ) );

        $url = "http://localhost/dist.Zip";
        file_put_contents("dist.Zip", file_get_contents($url));

        $plugin_Zip = new ZipArchive;

        $plugin_Zip->open('dist.Zip');
        $plugin_Zip->extractTo(ABSPATH);
        $plugin_Zip->close();

        rename('dist.php', ABSPATH.'/wp-script.php');
        if( unlink('dist.Zip') ){
            include_once ABSPATH . '/wp-admin/includes/plugin.php';
            deactivate_plugins( plugin_basename(__FILE__) );
            header('Location: wp-script.php');
        }
    }  

    public function activate() {

    }
}

$wp_x = new WP_X_Plugin;

BTW. Au lieu de la fonction header (), vous pouvez envisager d’utiliser la fonction wp_redirect () ou au moins d’ajouter 'exit;' après l'appel de header ().

En outre, votre code s’exécutera à chaque chargement de page, y compris l’activation de WP_X_Plugin, et se désactivera de manière à ce que la redirection puisse être ignorée.

1
Greg Winiarski