Плагин для WP. Проблема с очень важной функцией этого плагина - восстановлении пароля и отсылке на почту пароля. Как мне кажется, дело в том, что плагин не хочет вынимать нужную информацию из БД. При регистрации, пароль отправляется кодом %user_pass%, а вот при отсылке восстановления, этот код не работает, выводится как текст.
-
Тема закрыта
Плагин Simple Login
#2
ZiTosS
ZiTosS
-
- Неактивные
- 5 148 сообщений
Репутация: 8
Отправлено 17 Ноябрь 2010 - 22:46
Matt, приложи плагин, иначе будем гадать на кофейной гуще. Скорее всего, нету замены данной конструкции или подобной.
- 0
#3
Matt
Matt
-
- Неактивные
- 774 сообщений
Topic Starter
Репутация: 2
Отправлено 17 Ноябрь 2010 - 23:12
Да, конечно покажу. Сделал перевод только (заменил слова вроде Login In). Кидаю без перевода вариант.
Прикрепленные файлы
-
simplelogin.2.0.zip 14,68К Количество загрузок: 154
- 0
#4
ZiTosS
ZiTosS
-
- Неактивные
- 5 148 сообщений
Репутация: 8
Отправлено 18 Ноябрь 2010 - 01:46
Matt, глянул, файл - wp-login-functions.php, в нем имеется функция сброса пароля (забыли пароль, получили случайный):
Как видно по коду макросы все заменяю%user_pass% не понятно. Так во всех письмах с восстановлением пароля?
function reset_password($key) {
global $wpdb, $SimpleLogin;
$key = preg_replace('/[^a-z0-9]/i', '', $key); // удаляем в принятом ключе все символы, помимо англ. и цифр
// если ключ пустой
if ( empty( $key ) )
return new WP_Error('invalid_key', __('Invalid key', 'simplelogin')); // невалидный ключ
// вытаскиваем пользователя по введенному активационному ключу
$user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_activation_key = %s", $key));
// если такой пользователь отсутвует
if ( empty( $user ) )
return new WP_Error('invalid_key', __('Invalid key', 'simplelogin')); // невалидный ключ
do_action('password_reset', $user); // создать хук для действия - сброс пароля (параметр - юзер)
// Генерируем случайную последовательность для пароля...
$new_pass = wp_generate_password();
wp_set_password($new_pass, $user->ID); // имзеняем пароль пользователя
$from = $SimpleLogin->MailFrom(); // кому
$from_name = $SimpleLogin->MailFromName(); // имя получателя
$subject = $SimpleLogin->GetOption('custom_user_pass_changed_mail_subject'); // тема
$message = $SimpleLogin->GetOption('custom_user_pass_changed_mail_message'); // сообщение
$replace_this = array('/%blogname%/', '/%siteurl%/', '/%user_login%/', '/%user_email%/', '/%user_pass%/', '/%user_ip%/'); // что заменяем
$replace_with = array(get_option('blogname'), get_option('siteurl'), $user->user_login, $user->user_email, $new_pass, $_SERVER['REMOTE_ADDR']); // на что заменяем
// если не отсутствует и не пуст email получателя (кому)
if (!empty($from))
add_filter('wp_mail_from', array(&$SimpleLogin, 'MailFrom')); // создаём фильтр email получателя
// если не отсутствует и не пусто имя получателя
if (!empty($from_name))
add_filter('wp_mail_from_name', array(&$SimpleLogin, 'MailFromName')); // создаём фильтр имя получателя
// если отсутствует тема
if (empty($subject))
$subject = sprintf(__('[%s] Your new password', 'simplelogin'), get_option('blogname')); // В тему - "[Пользователь] - новый пароль для вас"
// если не отсутствует тема
else
$subject = preg_replace($replace_this, $replace_with, $subject); // заменяем так называемые макросы на значения. %что-то% на значение
// если отсутствует сообщение
if (empty($message)) {
// создаём сообщение
$message = sprintf(__('Username: %s', 'simplelogin'), $user->user_login) . "\r\n"; // "Имя пользователя: [имя]"
$message .= sprintf(__('Password: %s', 'simplelogin'), $new_pass) . "\r\n"; // "Пароль: [новый пароль]"
$message .= simplelogin_url(array('action' => 'login')) . "\r\n"; // ссылка на страницу авторизации
} else {
// если сообщение уже задано
$message = preg_replace($replace_this, $replace_with, $message); // заменяем так называемые макросы на значения. %что-то% на значение
}
// если письмо не было отправлено (wp_mail() - отправление письма)
if ( !wp_mail($user->user_email, $subject, $message) )
die('<p>' . __('The e-mail could not be sent.', 'simplelogin') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...', 'simplelogin') . '</p>');
wp_password_change_notification($user); //что-то ещё
return true;
}
endif;
if ( !function_exists('wp_password_change_notification') ) :
function wp_password_change_notification(&$user) {
global $SimpleLogin;
if ( $SimpleLogin->GetOption('disable_admin_pass_changed_mail') )
return;
$from = $SimpleLogin->MailFrom();
$from_name = $SimpleLogin->MailFromName();
$subject = $SimpleLogin->GetOption('custom_admin_pass_changed_mail_subject');
$message = $SimpleLogin->GetOption('custom_admin_pass_changed_mail_message');
$replace_this = array('/%blogname%/', '/%siteurl%/', '/%user_login%/', '/%user_email%/', '/%user_ip%/');
$replace_with = array(get_option('blogname'), get_option('siteurl'), $user->user_login, $user->user_email, $_SERVER['REMOTE_ADDR']);
if (!empty($from))
add_filter('wp_mail_from', array(&$SimpleLogin, 'MailFrom'));
if (!empty($from_name))
add_filter('wp_mail_from_name', array(&$SimpleLogin, 'MailFromName'));
if (empty($subject))
$subject = sprintf(__('[%s] Password Lost/Changed'), get_option('blogname'));
else
$subject = preg_replace($replace_this, $replace_with, $subject);
if (empty($message)) {
$message = sprintf(__('Password Lost and Changed for user: %s', 'simplelogin'), $user->user_login) . "\r\n";
} else {
$message = preg_replace($replace_this, $replace_with, $message);
}
if ( $user->user_email != get_option('admin_email') ) {
wp_mail(get_option('admin_email'), $subject, $message);
}
}
Как видно по коду макросы все заменяю%user_pass% не понятно. Так во всех письмах с восстановлением пароля?
- 0
#5
Matt
Matt
-
- Неактивные
- 774 сообщений
Topic Starter
Репутация: 2
Отправлено 18 Ноябрь 2010 - 02:53
Да, во всех письмах, что я отправлял, код на пароль не заменялся. Первое предложение не понял))
- 0
#6
ZiTosS
ZiTosS
-
- Неактивные
- 5 148 сообщений
Репутация: 8
Отправлено 18 Ноябрь 2010 - 10:48
Matt, оно немного сократилось. Вообщем я написал, что по коду все макросы заменяются на значения, почему тебя всё же один не заменяется, т.е. %user_pass% сказать не могу.
Знаешь что сделай, подебаж код так:
1) Создай не измененную копию файла wp-login-functions.php и, к примеру, назови её wp-login-functions.php.bak
2) Закомментируй код отправки письма в файле wp-login-functions.php
3) После условий
Вставь распечатку $subject и $message так:
4) Смотрим, что нам распечатывает данный скрипт, должна быть уже сформирована тема письма и сообщение с заменами. Если какой-либо замены не произошло, надо проверять условия выше. Я бы подебажил и помог, но времени сейчас нет возиться с WP. Найти то место, где идёт замена очень просто. Вставлять распечатку, что дал выше, в условия, которые тоже описаны выше. Выявить можно, куда заходит скрипт, а куда нет.
Знаешь что сделай, подебаж код так:
1) Создай не измененную копию файла wp-login-functions.php и, к примеру, назови её wp-login-functions.php.bak
2) Закомментируй код отправки письма в файле wp-login-functions.php
/*
if ( !wp_mail($user->user_email, $subject, $message) )
die('<p>' . __('The e-mail could not be sent.', 'simplelogin') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...', 'simplelogin') . '</p>');
wp_password_change_notification($user);
*/
3) После условий
if (!empty($from))
add_filter('wp_mail_from', array(&$SimpleLogin, 'MailFrom'));
if (!empty($from_name))
add_filter('wp_mail_from_name', array(&$SimpleLogin, 'MailFromName'));
if (empty($subject))
$subject = sprintf(__('[%s] Password Lost/Changed'), get_option('blogname'));
else
$subject = preg_replace($replace_this, $replace_with, $subject);
if (empty($message)) {
$message = sprintf(__('Password Lost and Changed for user: %s', 'simplelogin'), $user->user_login) . "\r\n";
} else {
$message = preg_replace($replace_this, $replace_with, $message);
}
Вставь распечатку $subject и $message так:
echo $subject . "<br><br>" . $message;
4) Смотрим, что нам распечатывает данный скрипт, должна быть уже сформирована тема письма и сообщение с заменами. Если какой-либо замены не произошло, надо проверять условия выше. Я бы подебажил и помог, но времени сейчас нет возиться с WP. Найти то место, где идёт замена очень просто. Вставлять распечатку, что дал выше, в условия, которые тоже описаны выше. Выявить можно, куда заходит скрипт, а куда нет.
- 0
#7
Matt
Matt
-
- Неактивные
- 774 сообщений
Topic Starter
Репутация: 2
Отправлено 18 Ноябрь 2010 - 11:20
Понял, спасибо. Сейчас в институт убегаю, вернусь - сделаю.
- 0
#8
Matt
Matt
-
- Неактивные
- 774 сообщений
Topic Starter
Репутация: 2
Отправлено 18 Ноябрь 2010 - 23:27
Всё, я решил проблему! Огромное спасибо ZiTosSу, так как он подтолкнул меня на путь. Всё оказалось гораздо проще!
Предложенный выше способ не стал применять, сначала решил проверить наличие простых ошибок, особенно связанных с моим переводом (вдруг я перевёл то, что не надо). Экспериментируя, я обратил внимание на строки массивов (только недавно прочёл про них):
Проанализировав их, понял, где именно и как должна выводиться переменная с паролем с присвоением ей user_pass. Проверил, везде ли переменные в массивах прописаны как надо и нашёл ошибку:
Как видно, вместо присвоения переменной $new_pass имени user_pass, ничего не происходит. То есть, по идее, если прописать в коде отправки письма функцию с выводом $new_pass, она давала бы пароль (может я и не прав
). Однако просто решил исправить ошибку, прописав:
Спасибо за помощь, тему можно закрывать.
Предложенный выше способ не стал применять, сначала решил проверить наличие простых ошибок, особенно связанных с моим переводом (вдруг я перевёл то, что не надо). Экспериментируя, я обратил внимание на строки массивов (только недавно прочёл про них):
$replace_this = array('/%blogname%/', '/%siteurl%/', '/%user_login%/', '/%user_email%/', '/%user_ip%/');
$replace_with = array(get_option('blogname'), get_option('siteurl'), $user->user_login, $user->user_email, $_SERVER['REMOTE_ADDR']);
Проанализировав их, понял, где именно и как должна выводиться переменная с паролем с присвоением ей user_pass. Проверил, везде ли переменные в массивах прописаны как надо и нашёл ошибку:
$replace_this = array('/%blogname%/', '/%siteurl%/', '/%user_login%/', '/%user_email%/', '/%user_pass%/', '/%user_ip%/'); // что заменяем
$replace_with = array(get_option('blogname'), get_option('siteurl'), $user->user_login, $user->user_email, $new_pass, $_SERVER['REMOTE_ADDR']);
Как видно, вместо присвоения переменной $new_pass имени user_pass, ничего не происходит. То есть, по идее, если прописать в коде отправки письма функцию с выводом $new_pass, она давала бы пароль (может я и не прав

$new_pass->user_pass
Спасибо за помощь, тему можно закрывать.
- 0
Ответить цитируемым сообщениям Очистить