uninstall.php

WordPress でプラグインを無効化したときにオプションを消すには

uninstall.phpWordPressプラグインで生成したテーブルをプラグインアンインストール時に削除する方法について、twitterでゴチャゴチャ話していたら、@takayukister さんに良いことを教えてもらいました。
via. Twitter / @takayukister: @miya0001 @wokamoto 二人が話して
プラグインディレクトリの中に uninstall.php を設置するか、プラグインディレクトリの中に、register_uninstall_hook() を使用すれば WordPress の管理画面からプラグインを削除する時に動作する処理を記述できるようです。
この辺の処理方法について、早速 @miya0001 さんがまとめてくれてます。

ただ、この方法だと削除時にしか動作しないんすよね。
できれば、無効化したときにも wp-options テーブルから消したい。
でも、一時的に無効化して、あとで有効化する場合にはオプション消されちゃうと再設定しなきゃだから辛いしなぁ..
とか、考えてたんですが、良い方法を思いつきました。

要は register_activation_hook() と register_deactivation_hook() を使って以下のようにすれば良いんじゃね?って感じです。

  1. 無効化されたときに wp-options に保存してあるオプション値をシリアライズした後、ファイルとして書き出し、delete_option() する。
  2. 有効化されたときにファイルとして書き出されたオプション値があれば読み込み update_option() する。

実装するなら、こんな感じ。

class hogehoge_plugin {
	private options;
	const OPTION_NAME = 'hogehoge options';
	const OPTION_SAVE_FILE = 'options.txt';

	function __construct() {
		$this->options = get_option( self::OPTION_NAME );

		if (function_exists( 'register_activation_hook' ))
			register_activation_hook( __FILE__, array(&$this, 'activation') );
		if (function_exists( 'register_deactivation_hook'))
			register_deactivation_hook( __FILE__, array(&$this, 'deactivation') );
		if ( function_exists( 'register_uninstall_hook') )
			register_uninstall_hook( __FILE__, array(&$this, 'uninstall') );
	}

	//**************************************************************************************
	// plugin activation
	//**************************************************************************************
	public function activation(){
		$option_file = dirname(__FILE__) . '/' . self::OPTION_SAVE_FILE;
		if ( file_exists($option_file) ) {
			$wk_options = unserialize( file_get_contents($option_file) );
			if ( $wk_options != $this->options ) {
				$this->options = $wk_options;
				update_option( self::OPTION_NAME, $this->options) ;
				unlink( $option_file );
			}
		}
	}

	//**************************************************************************************
	// plugin deactivation
	//**************************************************************************************
	public function deactivation(){
		$option_file = dirname(__FILE__) . '/' . self::OPTION_SAVE_FILE;
		$wk_options = serialize( $this->options );
		if ( file_put_contents( $option_file, $wk_options ) && file_exists( $option_file ) )
			delete_option( self::OPTION_NAME );
	}

	//**************************************************************************************
	// plugin uninstall
	//**************************************************************************************
	public function uninstall(){
		$option_file = dirname(__FILE__) . '/' . self::OPTION_SAVE_FILE;
		if ( file_exists($option_file) )
			unlink( $option_file );
		delete_option( self::OPTION_NAME );
	}
}
new hogehoge_plugin();

ただ、これだと無効化した状態でアップデートされると、書き出しておいたオプションファイルが消えちゃいます。
ファイルの保存場所は、プラグインと同じところじゃなくって wp-content 直下とか別の所にしたほうが良いかもしれませんね。
あと、見られるとまずい情報(メールアドレスとか、他サービスのパスワードとか consumer_key とかね)を wp-options に保存してるようなプラグインの場合は mcrypt 等で暗号化したほうが良いと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください