Перейти к содержимому

Сервис обмена электронных валют

Партнерская программа Kredov

  • Закрытая тема Тема закрыта

Плагин Simple Login

#1 Matt

Matt
  • Пользователь
  • 774 сообщений
  • Репутация: 2
0

Отправлено 17 Ноябрь 2010 - 20:38

Плагин для WP. Проблема с очень важной функцией этого плагина - восстановлении пароля и отсылке на почту пароля. Как мне кажется, дело в том, что плагин не хочет вынимать нужную информацию из БД. При регистрации, пароль отправляется кодом %user_pass%, а вот при отсылке восстановления, этот код не работает, выводится как текст.

 

 

  • 0

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 17 Ноябрь 2010 - 22:46

Matt, приложи плагин, иначе будем гадать на кофейной гуще. Скорее всего, нету замены данной конструкции или подобной.
  • 0

#3 Matt

Matt
    Topic Starter
  • Пользователь
  • 774 сообщений
  • Репутация: 2

Отправлено 17 Ноябрь 2010 - 23:12

Да, конечно покажу. Сделал перевод только (заменил слова вроде Login In). Кидаю без перевода вариант.

Прикрепленные файлы


  • 0

#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 18 Ноябрь 2010 - 01:46

Matt, глянул, файл - wp-login-functions.php, в нем имеется функция сброса пароля (забыли пароль, получили случайный):
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
    Topic Starter
  • Пользователь
  • 774 сообщений
  • Репутация: 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
/*
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
    Topic Starter
  • Пользователь
  • 774 сообщений
  • Репутация: 2

Отправлено 18 Ноябрь 2010 - 11:20

Понял, спасибо. Сейчас в институт убегаю, вернусь - сделаю.
  • 0

#8 Matt

Matt
    Topic Starter
  • Пользователь
  • 774 сообщений
  • Репутация: 2

Отправлено 18 Ноябрь 2010 - 23:27

Всё, я решил проблему! Огромное спасибо ZiTosSу, так как он подтолкнул меня на путь. Всё оказалось гораздо проще!

Предложенный выше способ не стал применять, сначала решил проверить наличие простых ошибок, особенно связанных с моим переводом (вдруг я перевёл то, что не надо). Экспериментируя, я обратил внимание на строки массивов (только недавно прочёл про них):

 $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

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru