web-dev-qa-db-ja.com

カスタムフィールドの検証時にlostpassword_postフックを使用してWp_errorを追加する方法

私はlostpassword_formフックを使ってlostpassword形式のカスタムフィールド(captcha)を追加しました。しかし、lostpassword_postフックを使用してこのフィールドを検証しようとしているときは、wp_errorを追加できません。 lostpassword形式をフックしてみました また、global $errors;の代わりに$errors = new WP_Error();を試してみましたが、運が悪かったです。

したくないです

  1. エラーメッセージを表示してスクリプトを終了します。例えば。 wp_die('error');
  2. エラー引数を使用して同じURLにリダイレクトしてから、GETメソッドでその引数をキャッチし、それに応じてメッセージを表示します。

Wp_errorを追加する方法はありますか?そうでないのであれば、WordPressがdo_action( 'lostpassword_post', $errors );の代わりにdo_action( 'lostpassword_post' );を追加しなかった理由

4
Shamim Hasan

WordPress 4.4 以降、アクションlostpassword_post$errorsオブジェクトを渡します。

function wpse_185243_lastpassword_post( $errors ) {
    if ( ! $captcha_valid /* The result of your captcha */ ) {
        $errors->add( 'invalid_captcha', '<strong>ERROR:</strong> Try again sonny.' );
    }
}

add_action( 'lostpassword_post', 'wpse_185243_lastpassword_post' );

4.4以前の回答

これはあなたが参照している関連コードです(wp-login.phpretrieve_password()):

function retrieve_password() {
    $errors = new WP_Error();

    // Some error checking

    do_action( 'lostpassword_post' );

    if ( $errors->get_error_code() )
        return $errors;


    // Some more code

    /**
     * Filter whether to allow a password to be reset.
     *
     * @since 2.7.0
     *
     * @param bool true           Whether to allow the password to be reset. Default true.
     * @param int  $user_data->ID The ID of the user attempting to reset a password.
     */
    $allow = apply_filters( 'allow_password_reset', true, $user_data->ID );

    if ( ! $allow )
        return new WP_Error('no_password_reset', __('Password reset is not allowed for this user'));
    else if ( is_wp_error($allow) )
        return $allow;
}

あなたが言うように、$errorsを手に入れる方法はありません(これはローカル変数で、フィルタ/アクションに渡されることはありません - 機能要求をTracチケットに提出する価値があるかもしれません)。

しかし、allow_password_resetを使用して新しいWP_Errorを返すことができるようで、WordPressはそれをコアエラーと同じ方法で処理します。

function wpse_185243_lost_password_captcha( $result, $user_id ) {   
    if ( ! $captcha_valid /* The result of your captcha */ ) {
        $result = new WP_Error( 'invalid_captcha', '<strong>ERROR:</strong> Try again sonny.' );
    }

    return $result;
}

add_filter( 'allow_password_reset', 'wpse_185243_lost_password_captcha', 10, 2 );
7
TheDeadMedic