Enfold という Wordpress テーマの「失われたパスワード」領域をカスタマイズしようとしています。すべて問題ないので、私のコードは「新しいパスワードの紹介」領域へのリンクをユーザーの電子メールに正しく送信します。リンクは次のとおりです: /new-password/?action=rp&key=TDeJEj7vVmmmJqbd&login=my_username
しかし、ユーザーがこのリンクをクリックすると、コードが「[新しいパスワードの導入]/[パスワードの繰り返し]」領域にリダイレクトされ、ユーザーが新しいパスワードを書き込んでパスワードの確認を行った後に AJAX コードを実行するボタンが応答しません。
wp_register_script と wp_enqueue_script を functions.php に追加しましたが、おそらくここに私のエラーがあると思います。私はこのように追加しました:
if(!function_exists('avia_register_frontend_scripts'))
{
if(!is_admin()){
add_action('wp_enqueue_scripts', 'avia_register_frontend_scripts');
}
function avia_register_frontend_scripts()
{
$template_url = get_template_directory_uri();
$child_theme_url = get_stylesheet_directory_uri();
//register js
wp_register_script( 'avia-compat', $template_url.'/js/avia-compat.js', array('jquery'), 1, false ); //needs to be loaded at the top to prevent bugs
wp_register_script( 'avia-default', $template_url.'/js/avia.js', array('jquery'), 1, true );
wp_register_script( 'avia-shortcodes', $template_url.'/js/shortcodes.js', array('jquery'), 1, true );
wp_register_script( 'avia-prettyPhoto', $template_url.'/js/prettyPhoto/js/jquery.prettyPhoto.js', 'jquery', "3.1.5", true);
// wp_register_script( 'wp-mediaelement', $template_url.'/js/mediaelement/mediaelement-and-player.min.js', 'jquery', "1", true);
wp_register_script( 'discount', $template_url.'/js/discount.js', 'javascript', "1", true);
wp_register_script( 'reset_user_pass', $template_url.'/js/reset-user-pass.js','jquery', "1", true );
wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'avia-compat' );
wp_enqueue_script( 'avia-default' );
wp_enqueue_script( 'avia-shortcodes' );
wp_enqueue_script( 'avia-prettyPhoto' );
wp_enqueue_script( 'wp-mediaelement' );
wp_enqueue_script( 'reset_user_pass' );
「[新しいパスワードの紹介]/[パスワードの再発行]」フォーム コードは次のとおりです。
<?php
/*Load Scripts for password reset page*/
wp_enqueue_script( 'zxcvbn-async' );
wp_enqueue_script( 'user-profile' );
wp_enqueue_script( 'password-strength-meter' );
wp_enqueue_script( 'user-suggest' );
?>
<form method="post" action="<?php echo get_bloginfo('url') ?>/wp-login.php" id="resetpassform" name="resetpassform">
<input type="hidden" name="login" value="<?php echo $_GET['login'] ?>" autocomplete="off">
<input type="hidden" name="key" value="<?php echo strip_tags($_GET['key']); ?>" />
<p style="margin-bottom:20px" class="description indicator-hint">Your password needs to be at least seven characters. Mixing upper and lower case, numbers and symbols like ! " ? $ % ^ & ) will make it stronger.</p>
<p class="login-username">
<input type="password" tabindex="10" size="20" value="" placeholder="New Password"class="input" id="pass1" name="pass1">
</p>
<p class="login-password">
<input type="password" tabindex="20" size="20" value="" placeholder="Confirm Password" class="input" id="pass2" name="pass2">
</p>
<div class="pass-meter"><div id="pass-strength-result" ><?php _e('Strength indicator'); ?></div></div>
<p class="forgotpass-submit">
<a id="forgot-cancel" href="<?php echo home_url('/signin'); ?>">Cancel</a>
<a id="submitforgotpasswordform" href="javascript:void(0)" style="background-position: 0px 4px;"><input type="submit" tabindex="100" value="Get New Password" id="forgot-submit" name="wp-submit"></a>
</p>
<div class="login-error"><div></div></div>
</form>
これは、functions.php で検証のパスをリセットするための php コードです。
function reset_user_pass(){
parse_str( $_POST['form_values'], $params );
$user = check_password_reset_key($params['key'], $params['login']);
$status='';
// Check if key is valid
if ( is_wp_error($user) ) {
if ( $user->get_error_code() === 'expired_key' ){
$status = 'expiredkey' ;
}
else{
$status = 'invalidkey' ;
}
echo $status;
die;
}
// check if keys match
if ( isset($params['pass1']) && $params['pass1'] != $params['pass2'] ){
$status = 'mismatch';
}else{
// Update the user pass
reset_password($user, $params['pass1']);
$status ='success';
}
echo $status;
die;
}
add_action('wp_ajax_nopriv_reset_user_pass', 'reset_user_pass');
最後に、送信ボタンに応答しない AJAX コードを次に示します。
(function($){
$(document).ready(function() {
// Submit the password reset form via ajax
$( '#resetpassform' ).submit(function(e){
e.preventDefault();
$('.login-error').slideUp();
//check if password fields are empty
if( $('#pass1').val()=='' || $('#pass1').val()=='' ){
return false;
}
var formData= $(this).serialize();
$.ajax({
url: ajaxurl,
type: 'POST',
data: {form_values: formData, action:'reset_user_pass' },
})
.done(function(status) {
switch(status){
case 'expiredkey' :
case 'invalidkey' :
$('.login-error').html('<div>Sorry, the link does not appear to be valid or is expired.</div>').slideDown();
break;
case 'mismatch' :
$('.login-error').html('<div>The passwords do not match.</div>').slideDown();
break;
case 'success' :
$('.login-error').html('<div>Your password has been reset.</div>').slideDown();
break;
default:
console.log(status);
$('.login-error').html('<div>Something went wrong.Please try again </div>').slideDown();
break;
}
})
.fail(function() {
console.log("error");
})
.always(function() {
console.log("complete");
});
})
})
})(jQuery)
あなたの助けと時間を前もってどうもありがとう。