WordPressの管理者メールアドレスを承認なしで変更できるようにする方法を紹介する。
こに「承認なしで変更できるようにする」ということについては、他のブログ記事でも結構取り上げられている内容ではある。
なので、今回は他のブログサイトではあまり見ない方法で実装をする。と言っても記述は簡単&今回紹介する方がシンプル・スマートな書き方で、「何」の処理を「どう」している の流れがわかりやすい・・・と思う。
結論
functions.phpに下記コードを記述すれば、「WordPressの管理者メールアドレスを承認なしで変更できる」ようになる。
function disable_admin_email_change_confirmation( $errors, $old_value, $value ) {
if ( $old_value !== $value ) {
update_option( 'admin_email', $value );
$errors->remove( 'new_admin_email' );
$errors->add( 'updated_admin_email', __( 'Admin email updated successfully.' ), 'message' );
}
return $errors;
}
add_filter( 'validate_option_new_admin_email', 'disable_admin_email_change_confirmation', 10, 3 );
コード説明
disable_admin_email_change_confirmation
関数を定義。この関数には3つの引数があり、下記となっている。$errors
: 既存のエラーオブジェクト$old_value
: 管理者メールアドレスの変更前の値$value
: 管理者メールアドレスの新しい値
$old_value
と$value
が異なる場合、管理者メールアドレスを更新する処理が行われる。update_option( 'admin_email', $value )
: 管理者メールアドレスを新しい値に更新する関数。$errors->remove( 'new_admin_email' )
: エラーオブジェクトから ‘new_admin_email’ エラーを削除。$errors->add( 'updated_admin_email', __( 'Admin email updated successfully.' ), 'message' )
: ‘updated_admin_email’ という名前で新しいメッセージをエラーオブジェクトに追加。このメッセージは、管理者メールアドレスが正常に更新されたことを示す。
- 関数の最後で、変更されたエラーオブジェクトを返す。
add_filter( 'validate_option_new_admin_email', 'disable_admin_email_change_confirmation', 10, 3 )
: この行で、disable_admin_email_change_confirmation
関数を ‘validate_option_new_admin_email’ フィルターフックに登録する。このフィルターは、新しい管理者メールアドレスの検証プロセスが行われるタイミングで実行される。
他のブログでよく見られる記述
記述は違えど、得られる結果(=承認なしでメアド変更できるようになる)は同じ。
remove_action( 'add_option_new_admin_email', 'update_option_new_admin_email' );
remove_action( 'update_option_new_admin_email', 'update_option_new_admin_email' );
function wpdocs_update_option_new_admin_email( $old_value, $value ) {
update_option( 'admin_email', $value );
}
add_action( 'add_option_new_admin_email', 'wpdocs_update_option_new_admin_email', 10, 2 );
add_action( 'update_option_new_admin_email', 'wpdocs_update_option_new_admin_email', 10, 2 );
それぞれのコードの違い
1つ目のコード(結論で書いた方)は、WordPressの管理者メールアドレスを変更する際の確認メールの送信を無効にすることが目的である。disable_admin_email_change_confirmation
関数は、新しいメールアドレスと古いメールアドレスが異なる場合に、新しいメールアドレスに更新し、エラーメッセージを更新する。そして、validate_option_new_admin_email
フィルターフックにこの関数を追加している。
2つ目のコードも、管理者メールアドレスの変更時の確認メールを無効にすることが目的である。つまり、得られる結果は1つ目のコードと同じである。
まず、既存のアクションを削除し、wpdocs_update_option_new_admin_email
関数を定義して、管理者メールアドレスを更新する。その後、新しいアクションを追加して、この関数が実行されるようにしている。
両コードの違いは、1つ目のコードはフィルターフックを利用し、エラーメッセージを操作して機能を実現しているのに対し、
2つ目のコードはアクションフックを利用し、既存のアクションを削除して新しいアクションを追加することで機能を実現している点だ。
1つ目のコードはフィルターフックを使っており、エラーメッセージの操作を行っているため、他のプラグインやテーマとの互換性が高いと思われる。
2つ目のコードはアクションフックを使っており、既存のアクションを削除して新しいアクションを追加するため、他のプラグインやテーマとの互換性が低い可能性がある。また、既存アクションの存在を知らないと、理解するのに多少の労力が必要である。
また、2つ目のコードでは、
remove_action( 'add_option_new_admin_email', 'update_option_new_admin_email' );
// 略
add_action( 'add_option_new_admin_email', 'wpdocs_update_option_new_admin_email', 10, 2 );
で、add_option_new_admin_email
というアクションの削除・追加しているが、add_option_new_admin_email
というアクションは実際には存在しないため、以下の行は不要です。(自分調べ。もし存在してたらごめんなさい)
以上より、1つ目のコードの方がスマート&他のテーマ・プラグインの機能に影響が出ない書かれ方なのかな、と思っている。
ですが、2つ目のコードの方がGoogle検索結果的にはメジャーなので(少なくとも日本国内では)、このような書かれ方をしていることに何か理由があるのかも知れない。理由知ってる人いたら教えてください。