質問

WordPress通知にHTMLカスタム電子メールテンプレートを使用しています。

すべてのテンプレートはうまく機能します。なんらかの理由で - パスワードリセットテンプレート(それ以外のうちうまく機能する)は、パスワードリセットリンクの最後にuser_login変数を追加しません。これは、キーが有効になるのに不可欠です。$user_loginのないリンクは、WPパスワードのリセットページの「無効なキー」エラーをレンダリングします。

リンク内の文字列の例は以下のとおりです。最後の欠落のlogin=usernameに注意してください。

url/wp-login.php?redirect_to=url?action=rp&key=12345678910&login=http://url.com/wp-login.php?redirect_to=url?action=rp&key=12345678910&login=
.

これは私がテンプレートを変更するために使用しているコードです。誰かがこれが起こっているのか知っていますか - そしてそうであれば、それを修正する方法は?

add_filter ('retrieve_password_message', 'custom_retrieve_password_message', 10, 2);
function custom_retrieve_password_message($content, $key) {
global $wpdb;
$user_login = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_activation_key = '$key'");
ob_start();
$email_subject = custom_retrieve_password_title();
include('email_header.php');
?>

<p>It looks like you need to reset your password for your account!</p>
<p>To reset your password, visit the following address, otherwise just ignore this email and nothing will happen.<p>
<a href="<?php echo wp_login_url("url") ?>?action=rp&key=<?php echo $key ?>&login=<?php echo $user_login ?>">Reset password</a> 

<?php
include('email_footer.php');
$message = ob_get_contents();
ob_end_clean();
return $message;
}
.

役に立ちましたか?

解決 3

誰でも興味を持っています、これは別の解決策です:

add_filter ('retrieve_password_message', 'custom_retrieve_password_message', 10, 2);
function custom_retrieve_password_message($content, $key) {
global $wpdb;
if ( empty( $_POST['user_login'] ) ) {
     wp_die('<strong>ERROR</strong>: Enter a username or e-mail address.');
 } else if ( strpos( $_POST['user_login'], '@' ) ) {
     $user_data = get_user_by( 'email', trim( $_POST['user_login'] ) );
 }else if(!empty( $_POST['user_login'] )){
     $user_data = get_user_by('login', trim( $_POST['user_login']));
 }elseif ( empty( $user_data ) ){
     wp_die('invalid_email', __('<strong>ERROR</strong>: There is no user registered with that email address.'));
 }
$user_login_name=$user_data->user_login;
ob_start();
$email_subject = 'Your password has been changed';
include('email_header.php');
?>
<p>It looks like you need to reset your password. <br/>To reset your password, <a href="<?php echo wp_login_url("url") ?>?action=rp&key=<?php echo $key ?>&login=<?php echo $user_login_name; ?>">click here</a>, otherwise just ignore this email and nothing will happen.<p>

<?php
include('email_footer.php');
$message = ob_get_contents();
ob_end_clean();
return $message;
}
.

他のヒント

問題は、WordPressがデータベースに保存されている方法を変更したことです。キーは、WP_USERSテーブルに保存される前にハッシュされ、$keyには無傷のプレーンテキストのアクティベーションキーが含まれています。そのため、コードの次の行は結果を取得せず、$user_loginは空になります。

$user_login = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_activation_key = '$key'");
.

代わりにこれを試してみてください:

add_filter ('retrieve_password_message', 'custom_retrieve_password_message', 10, 2);
function custom_retrieve_password_message($content, $key) {
global $wpdb;
$user_data = get_user_by_email(trim($_POST['user_login']));
$user_login = $user_data->user_login;
ob_start();
$email_subject = custom_retrieve_password_title();
include('email_header.php');
?>

<p>It looks like you need to reset your password for your account!</p>
<p>To reset your password, visit the following address, otherwise just ignore this email and nothing will happen.<p>
<a href="<?php echo wp_login_url("url") ?>?action=rp&key=<?php echo $key ?>&login=<?php echo $user_login ?>">Reset password</a> 

<?php
include('email_footer.php');
$message = ob_get_contents();
ob_end_clean();
return $message;
}
.

私はすべての残りについて全く確実ではありません。 - しかし、一つのことのために、あなたはあなたの引用符を正しく得る必要があります。

を試してみてください
echo wp_login_url('url')
.

NOT

echo wp_login_url("url")
.

e.g。:

<a href="<?php echo wp_login_url('url') ?>?action=rp&key=<?php echo $key ?>&login=<?php echo $user_login ?>">Reset password</a> 
.

または

を試してみてください
echo '<a href=' . wp_login_url("url") . '?action=rp&key='.$key.'&login='.$user_login.'>Reset password</a> ';
.

また - (そしてそれが役に立たない場合)あなたがそれを使う場所、どのテンプレートとどのようなテンプレートを使うかを詳しく説明することができますので、より深く試して掘り下げることができますか?

さらに、POSTデータを使用して、ユーザー名または電子メールが送信されたかどうかを確認できます。

add_filter ('retrieve_password_message', 'custom_retrieve_password_message', 10, 2);
  function custom_retrieve_password_message($content, $key) {
    if ( username_exists($_POST['user_login']) ){
    $user_login = $_POST['user_login'];
} else {
    $user_data = get_user_by_email(trim($_POST['user_login'])); 
    $user_login = $user_data->user_login;
}
    ob_start();
...
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top