web-dev-qa-db-ja.com

アクション発生後のプラグインの自己無効化

私はWordPressのプラグインを開発しています。

私はサーバーからファイルをダウンロードして、それからプラグインがアクティブにされた後にそれを解凍してWordPressのメインディレクトリの中に置きたいです。ダウンロードとファイルの解凍のプロセスは正しく実行されます、私はこのプロセスが行われた後にプラグインを無効にするためにいくつかの問題を抱えています。どうすれば修正できますか?

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;

_アップデート_

私はplugin.phpフォルダの中にあるwp-admin/includesファイルを要求することによって解決しました。私はここで同じ問題に関するいくつかの質問を読んだ後にこの解決策を使いました。私が理解したように、プラグイン関数はwpが実行時にすでにこのファイルをロードしている場合にのみ利用可能です。

1
user9741470

Deactivate_plugins()関数はadmin_initアクションが実行された後にのみ利用可能です。 'admin_init'フィルタを登録してdeactivate_plugins()関数をそこで実行するか、または手動でwp-admin/includes/plugin.phpファイルをインクルードする必要があります。

以下の2番目の解決策であなたのコードを更新しました。

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;

ところで。 header()関数の代わりに、代わりにwp_redirect()関数を使用することを検討するか、少なくとも 'exit;'を追加してください。 header()呼び出しの後.

また、今すぐあなたのコードはWP_X_Pluginアクティベーションを含む各ページロードで実行され、リダイレクトが無視されるかもしれないようにそれ自身を無効にするでしょう。

1
Greg Winiarski