2008年8月12日の投稿

プラグインの deactivate アクションは2回実行される
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回だけしか実行されないような気がするんですが……。