2008年8月12日の投稿

2008-08-12
晴れ

プラグインの deactivate アクションは2回実行される

ゆりこ による 02:53:42 の投稿
カテゴリー: WordPressハック
タグ: , ,

Ktai Entry の次期バージョンでは、「プラグインを無効にしたら、メールサーバーのパスワードが初期化されるため、有効化したとき再入力が必要」という仕様を改善する予定です。実装としては、プラグインを無効化したとき、パスワードを別途保存してから初期化し、有効化したらそれを復帰させるという仕組みです。

わざわざ保管するならそのまま残しておけばよさそうですが、そうするとwp-mail.php を実行されたとき外部メールサーバーにアクセスされてしまう問題が発生してしまいます。Ktai Entry が有効なときは wp-mail.php の実行を抑止していますが、停止したときはパスワードを初期化することで防いでいるわけです。

本題はそこではありません。なんと、「プラグインを無効化したときに実行されるアクション」(Ktai Entry の場合 deactivate_ktai_entry/ktai_entry.php) が、実は2回実行されることが判明しました。1回だけ実行されると思ってコーディングすると保存したパスワードが消えてしまうため、調査した結果2回実行されていたのでした。

public function stopped() {
	$pass = get_option('mailserver_pass');
	if ($pass && $pass != 'password') {
		update_option('ke_mailserver_pass_store', $pass);
	} else {
		delete_option('ke_mailserver_pass_store');
	}
	update_option('mailserver_pass', 'password');
}

当初書いていたコードは上記の通りです。プラグインが無効化されたら、mailserver_pass オプションの値を ke_mailserver_pass_store として保管します。もともと mailserver_pass が空もしくは初期値 (‘password’) の場合は、安全のため ke_mailserver_pass_store が存在すれば消す処理を入れました。ところが、この安全処理が仇になりました。2回目の deactivate アクション実行時にここを通ってしまうため、保管したパスワードが消えるのです。結局、安全処理は削除せざるを得ませんでした。

WordPress 2.5, 2.6 ともにそうなっています。WordPress 2.3 以前は調べていませんがたぶん同じでしょう。なんで2回実行してしまうんでしょうね?? WordPress コアのコードを見る限り、1回だけしか実行されないような気がするんですが……。