web-dev-qa-db-ja.com

Wp_new_user_notification_email()をカスタマイズする

パスワードを設定するためのリンクを含む、ユーザーに送信される通知メールをカスタマイズしようとしています。

現在、私はそれぞれsite.com/registersite.com/loginのURLでカスタムユーザー登録とログインフォームを設定しました。

登録後、wordpressはパスワードを設定するように求める次のリンクで電子メールを送信しています。

site.com/wp-login.php?action=rp&key=XYieERXh3QinbU4VquB2&login=user%40gmail.com

このURLを次のURLに置き換えます。

site.com/login?action=rp&key=XYieERXh3QinbU4VquB2&login=user%40gmail.com

私はfunctions.phpで以下のコードを試しました

add_filter( 'wp_new_user_notification_email', 'my_wp_new_user_notification_email', 10, 3 );

function my_wp_new_user_notification_email( $wp_new_user_notification_email, $user, $blogname ) {

    $message = sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
    $message .= __('Hello To set your password, visit the following address:') . "\r\n\r\n";
    $message .= '<' . network_site_url("login/?key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";


    $wp_new_user_notification_email['message'] = $message

    return $wp_new_user_notification_email;

}

受信したEメールに次のようなリンクがあるため、$key情報が欠落していると思います。

site.com/login?action=rp&key=&login=user%40test.com

これを修正するには?

1
Nigel

生成されたキーを変数$keyに割り当てることができる必要があります。これは現在未定義です。

これを回避するには、WordPressがキーを生成した直後に起動するretrieve_password_keyアクションに別の関数を添付します。その名前から、私はそれがこの目的のためだけに存在すると思います。

function wpse306642_stash_key( $user_login, $key ) {
    global $wpse306642_new_user_key;
    $wpse306642_new_user_key = $key;
}

add_action( 'retrieve_password_key', 'wpse306642_stash_key', 10, 2 );

次に、関数内の$key$wpse306642_new_user_keyに置き換えて、関数の先頭でグローバルとして宣言します。

この目的のためだけにグローバルを使うのはちょっとやっかいなことですが、うまくいくはずです。

1

get_password_reset_key関数 (参照を参照) を使用する必要があります。これはデータベースを照会し、ユーザーのパスワードのリセットキーを返します。

これが完全に機能する例です。

add_filter( 'wp_new_user_notification_email', 'custom_wp_new_user_notification_email', 10, 3 );

function custom_wp_new_user_notification_email( $wp_new_user_notification_email, $user, $blogname ) {
    $key = get_password_reset_key( $user );
    $message = sprintf(__('Welcome to the Community,')) . "\r\n\r\n";
    $message .= 'To set your password, visit the following address:' . "\r\n\r\n";
    $message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . "\r\n\r\n";
    $message .= "After this you can enjoy our website!" . "\r\n\r\n";
    $message .= "Kind regards," . "\r\n";
    $message .= "Support Office Team" . "\r\n";
    $wp_new_user_notification_email['message'] = $message;

    $wp_new_user_notification_email['headers'] = 'From: MyName<[email protected]>'; // this just changes the sender name and email to whatever you want (instead of the default WordPress <[email protected]>

    return $wp_new_user_notification_email;
}
1