Поддержка Проблемы и решения Регистрация — проблема проверки дополнительных полей

  • Решено Olmar

    (@olmar)


    Всем доброго времени суток!
    Делаю свою форму регистрации с дополнительными полями. В локалке все работает отлично. Перенесла на хостинг — не сохраняются результаты проверки полей.
    Функция check_fields вызывается, отрабатывает. Проверяла, в конце объект errors заполнен, но результат не сохраняется.

    add_action('register_post','check_fields',10,3);
    
    function check_fields($login, $email, $errors) {
    
    if ($_POST['first'] == '') {
    $errors->add('empty_realname', "<strong>Ошибка</strong>: не заполнено поле Имя");
    }
                foreach ( _my_get_user_contactmethods() as $name => $desc ) {
                     if ($_POST[$name] == '')
                        $errors->add("empty_$name", "<strong>Ошибка</strong>: не заполнено поле $desc");
                }
    }

    Так как до этого все подключаемые мной функции либо выводили, либо напрямую возвращали результат, то полагаю, что дело в видимости переменных.
    Так как wordpress для меня пока в стадии изучения, буду рада любым советам.

Просмотр 15 ответов — с 1 по 15 (всего 16)
  • Автор Olmar

    (@olmar)

    Еще уточню — демо с codex.wordpress.ru тоже не хочет на хостинге работать.

    add_action('register_post','plugin_post',10,3);
    function plugin_post($login,$email,$errors){
    
        $errors->add('demo_error',__('This is a demo error, and will halt registration'));
    
    }

    Ведь наверняка мелочь какая-нибудь. В каком хотя бы направлении рыть? о_О

    а плагин поискать не пробовали, я точно знаю есть такой

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Проверил оба примера локально и на хостинге — в функциях ошибок нет. Предполагаю, что нужно провести более глубокую отладку на сервере.

    Автор Olmar

    (@olmar)

    Спасибо за ответы )
    Плагин ради маленькой функции подключать не хочется.

    Предполагаю, что нужно провести более глубокую отладку на сервере.

    Спасибо за проверку. А по поводу отладки не подскажете — с чего начать? Все остальное работает без нареканий.

    Atrax

    (@atrax)

    Ethical engineer

    Плагин ради маленькой функции подключать не хочется.

    А что так?

    Автор Olmar

    (@olmar)

    Читала мнение, что добавление лишнего плагина влияет на скорость выдачи страниц. Не так?
    Сама пока не проверяла. Вернее, проверяла только в локалке, а в локалке у меня тормозит загрузка. В частности, подвешивала плагины Theme My Login и Theme My Profile. После того, как убрала Theme My Profile, стало быстрее грузиться.
    Возможно, я не права )) На хостинге пока проверить возможности не было, до сегодняшнего дня я там была единственным посетителем)), настраивала, поэтому нагрузку оценить не могла. Оптимизацией еще не занималась, планирую изучить этот вопрос. С удовольствием выслушаю мнения бывалых ))
    Среднее количество посетителей на сайте 250 человек в день.

    Модератор Юрий

    (@yube)

    Читала мнение, что добавление лишнего плагина влияет на скорость выдачи страниц. Не так?

    Строго говоря — так. Плагин — это код. А любой код требует времени на свое выполнение. Не-плагин — тоже код, и тоже требует времени, правда, немного меньше. Вопрос только в том, насколько критичны те наносекунды, которые требуются на специфические для плагинов куски кода. Если вопрос микросекунд стоит настолько остро (в чем лично я крупно сомневаюсь), то нужно вообще отказаться от WordPress, php, apache и написать на ассемблере своего собственного узкоспециализированного http-демона 🙂

    Автор Olmar

    (@olmar)

    🙂
    Я еще подумала, что подключенный плагин обрабатывается при каждой загрузке страницы, а мои три функции только когда страница регистрации грузится. Или ошибаюсь? По идее, движок по всем плагинам пробегается прежде чем выбрать нужные?
    В любом случае, варианты плагинов стоит еще посмотреть, а то публичную часть я вывела, а вот в админке пока этих полей не вижу. Не уверена, что самой в админку лезть выгоднее по производительности ))

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    А по поводу отладки не подскажете — с чего начать?

    Посмотреть в wp-login.php, что происходит с объектом $errors до и после действия register_post. Вывести промежуточные значения. Проверить, сохраняются ли стандартные ошибки типа empty_username или email_exists. Попробовать найти строку, после которой объект оказывается пустым. Возможно, он затирается фильтром registration_errors?

    Автор Olmar

    (@olmar)

    Спасибо всем большое за участие. Проблема решилась добавлением global $errors;

    function check_fields($login, $email, $errors) {
    global $errors;
    ...
    }

    Элементарно, но… я с этого начинала и получала ошибку. Кроме своей функции, global $errors; надо добавить в register_new_user()

    function register_new_user( $user_login, $user_email ) {
            global $errors;
            $errors = new WP_Error();
            ...

    Тогда все работает.
    Додумалась не сама, здесь нашла http://blog.alexgirard.com/tag/hack/

    ‘register_post’ action

    You won’t be able to add more errors in $errors if you do not make it global in register_new_user() of wp-login.php:

    function register_new_user($user_login, $user_email) {
    global $errors;
    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Спасибо, что поделились. Оказывается, это описано в багтрекере:
    http://core.trac.wordpress.org/ticket/10672
    Без объявления глобальной переменной код работает только на PHP 5.x. Однако объект $errors передаётся в register_post не для изменения, а для информации. Менять его нужно с помощью фильтра registration_errors:

    add_filter('registration_errors', 'check_fields', 10, 3);
    function check_fields($errors, $login, $email) {
    	$errors->add('demo_error',__('This is a demo error, and will halt registration'));
    	return $errors;
    }

    В этом случае правка wp-login.php не требуется. Обновил Кодекс.

    Автор Olmar

    (@olmar)

    Ооо! Спасибо огромное! Отлично!
    wp-login.php вернула в исходное 🙂 Все работает.

    Честно говоря, я предполагала, что должна быть возможность обновления значения, пыталась использовать add_filter, но очень слабо до сего момента представляла, как он работает и ничего не получалось. Спасибо 🙂

    Единственное, в этом решении есть маленький нюанс (который, впрочем, мне не мешает): сначала выдаются ошибки — имя, емайл, пароль, а потом все остальные. В варианте с register_post обход был в порядке очередности вывода полей — имя, емайл, дополнительные поля, пароль.
    Но в данном варианте это не критично.

    Вообще это очень круто! первый раз вижу женщину которая умеет обращаться с функцией add_filter и знает, что такое global. Думал в природе такого не существует.
    извините за офтоп

    Модератор Юрий

    (@yube)

    Есть много, друг Горацио… 🙂

    Автор Olmar

    (@olmar)

    stur, спасибо, конечно…

    Я вернулась еще раз поблагодарить Sergey Biryukov за решение с add_filter 🙂 Спасибо за просветление мозга 🙂
    Раньше я добавляла массив дополнительных полей функцией _my_get_user_contactmethods() так:

    add_action( '_wp_get_user_contactmethods', '_my_get_user_contactmethods' );
    function _my_get_user_contactmethods() {
        $user_contactmethods = array(
            'org' => __('Организация'),
            'city' => __('Город'),
            'tel' => __('Телефон')
        );
        return apply_filters('user_contactmethods',$user_contactmethods);
    }

    А потом, соответственно, пользовалась массивом _my_get_user_contactmethods, а стандартный _wp_get_user_contactmethods игнорировала, так мне aim, yim и jabber не нужны.
    Естественно, в админке я своих полей просто не видела. Сейчас переписала код на

    add_filter('user_contactmethods', '_my_get_user_contactmethods');
    function _my_get_user_contactmethods() {
        $user_contactmethods = array(
            'org' => __('Организация'),
            'city' => __('Город'),
            'tel' => __('Телефон')
        );
        return $user_contactmethods;
    }

    Теперь user_contactmethods просто заменяется на мои поля. И в админке тоже. Ура!
    Кроме того, в базе данных при регистрации не создаются ненужные пустые строки aim, yim и jabber 🙂
    А еще при таком варианте стала не нужна своя функция сохранения моих дополнительных полей. Вот этот кусок кода я просто вырезала за ненадобностью.

    add_action( 'personal_options_update', 'save_extra_profile_fields' );
    add_action( 'edit_user_profile_update', 'save_extra_profile_fields' );
    add_action( 'profile_update', 'save_extra_profile_fields' );
    
    function save_extra_profile_fields( $user_id ) {
    
        if ( !current_user_can( 'edit_user', $user_id ) )
            return false;
    
        update_usermeta( $user_id, 'org', $_POST['org'] );
        update_usermeta( $user_id, 'city', $_POST['city'] );
        update_usermeta( $user_id, 'tel', $_POST['tel'] );
    }

    Извините за офтоп. Но вдруг кому-нибудь пригодится

Просмотр 15 ответов — с 1 по 15 (всего 16)
  • Тема «Регистрация — проблема проверки дополнительных полей» закрыта для новых ответов.