私はlostpassword_form
フックを使ってlostpassword形式のカスタムフィールド(captcha)を追加しました。しかし、lostpassword_post
フックを使用してこのフィールドを検証しようとしているときは、wp_errorを追加できません。 lostpassword形式をフックしてみました また、global $errors;
の代わりに$errors = new WP_Error();
を試してみましたが、運が悪かったです。
したくないです
wp_die('error');
Wp_errorを追加する方法はありますか?そうでないのであれば、WordPressがdo_action( 'lostpassword_post', $errors );
の代わりにdo_action( 'lostpassword_post' );
を追加しなかった理由
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.php
のretrieve_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 );