プログラムでユーザーを作成するときにユーザーアクティベーションメールを送信する


9

ここの誰かが手伝ってくれるのかしら。

基本的に、検証時にユーザーをユーザーテーブルに挿入するカスタム登録フォームを作成しました。

function _new_user($data) {

    // Separate Data
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    wp_insert_user($default_newuser);
} 

今、私がする必要があるのは、次のコードで実行できる確認メールを送信するのではなくです。

wp_new_user_notification($user_id, $data['user_pass']);

代わりにユーザーアクティベーションメールを送信します。いくつか試しましたが、具体的なものを見つけることができないようです。誰かが以前にこの問題を抱えていたことを願っています。

回答:


10

ユーザーのアクティベーションプロセスを実行するには、次の手順を実行する必要があります。

  1. 新しいユーザーを作成した後、このユーザーが自分のアカウントをアクティブにする必要があることを示すカスタムユーザーフィールドを追加します
  2. アクティベーションコードを記載したメールを送信し、このメールにユーザーがアクティベートされるページへのリンクを提供する
  3. アクティベーションページを実装する
  4. ユーザーがログインしようとしたときに、そのカスタムユーザーフィールドが存在するかどうかを確認します。存在する場合はログインせず、代わりにアクティベーションエラーメッセージを表示します。

カスタムフィールドを追加してメールを送信:

function _new_user($data) {

    // Separate Data
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    $user_id = wp_insert_user($default_newuser);
    if ( $user_id && !is_wp_error( $user_id ) ) {
        $code = sha1( $user_id . time() );
        $activation_link = add_query_arg( array( 'key' => $code, 'user' => $user_id ), get_permalink( /* YOUR ACTIVATION PAGE ID HERE */ ));
        add_user_meta( $user_id, 'has_to_be_activated', $code, true );
        wp_mail( $data['user_email'], 'ACTIVATION SUBJECT', 'CONGRATS BLA BLA BLA. HERE IS YOUR ACTIVATION LINK: ' . $activation_link );
    }
}

ログイン時にユーザーのアクティブ化を確認します。

// override core function
if ( !function_exists('wp_authenticate') ) :
function wp_authenticate($username, $password) {
    $username = sanitize_user($username);
    $password = trim($password);

    $user = apply_filters('authenticate', null, $username, $password);

    if ( $user == null ) {
        // TODO what should the error message be? (Or would these even happen?)
        // Only needed if all authentication handlers fail to return anything.
        $user = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));
    } elseif ( get_user_meta( $user->ID, 'has_to_be_activated', true ) != false ) {
        $user = new WP_Error('activation_failed', __('<strong>ERROR</strong>: User is not activated.'));
    }

    $ignore_codes = array('empty_username', 'empty_password');

    if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {
        do_action('wp_login_failed', $username);
    }

    return $user;
}
endif;

アクティベーションページ:

add_action( 'template_redirect', 'wpse8170_activate_user' );
function wpse8170_activate_user() {
    if ( is_page() && get_the_ID() == /* YOUR ACTIVATION PAGE ID HERE */ ) {
        $user_id = filter_input( INPUT_GET, 'user', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
        if ( $user_id ) {
            // get user meta activation hash field
            $code = get_user_meta( $user_id, 'has_to_be_activated', true );
            if ( $code == filter_input( INPUT_GET, 'key' ) ) {
                delete_user_meta( $user_id, 'has_to_be_activated' );
            }
        }
    }
}

これが出発点です。先に進んで、ニーズに合わせて調整してください。


良いポスト。しかし、あなたは一つのことを逃したと思います。権限のないユーザーがログインできないようにする場合、アクティベーションページでget_current_user_id()からuser_idを取得するにはどうすればよいですか?
s1lv3r 2013年

1
いまいましい... :)良い点、それは
すぐに

この素晴らしい情報をありがとう。管理パネルで「アクティベーションを再送信」できるため、アクティベーションメールの送信をトリガーするコアソリューションがあるかどうかを確認していました。ユーザーを保留中として挿入すると、アクティベーションコードが生成されてデータベースに挿入される可能性があると思いましたが、さらに調べたところ、「明らかに」そのような運はないことがわかりました:)とにかく。それはすべて理にかなっており、再び感謝しています。
Joe Buckle 2013年

@ジョーバックルそれは奇妙です。resend activation通常のインストールでは、-linkを使用しないでください。このためのプラグインがすでにインストールされていますか?また、BuddyPressにはユーザーアクティベーション機能が標準装備されています。
s1lv3r 2013年

@ s1lv3r Theme-My-Loginと関係がありますか?
Joe Buckle 2013年

1

選択できる2つのオプション:

  1. プラグインを使用します(例:ユーザーのアクティブ化メールまたは新しいユーザーの承認)

  2. これを自分でコーディングします。

あなたを始めるためのいくつかの機能:

  • wp_mail()でメールを送信します。
  • add_user_meta()は、ユーザーのアクティベーションキーを保存します。
  • キーを含むリンクを生成してメールに配置し、key-paramをキャッチするワードプレスでページを作成します(たとえば、add_shortcode()を使用)。
  • 使用get_user_meta()有効として成功した場合、このユーザーをマークするために、別のユーザーのメタキーを配置し、DBに格納されている1つに対して、アクティベーションキーをチェックするために、
  • 認証フィルターに関数を追加して、アクティブ化されていないユーザーがログインできないようにします。

0

認証中にこれを行うと、user_idを取得できます。

$username='user email provided by the user at login panel.';
$results = $wpdb->get_row( "SELECT ID FROM wp_users WHERE user_email='".$username."'");
   $activation_id = $results->ID;
   $activation_key =  get_user_meta( $activation_id, 'has_to_be_activated', true );
 if($activation_key != false )
 {
  echo '<h4 class="error">Your account has not been activated yet.<br /> To activate it check your email and clik on the activation link.</h4>';
 }
else{
//authenticate your user login here...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.