Добавление полей в форму регистрации

В предыдущих постах я говорил о том, как добавлять и удалять дополнительные поля без плагинов в пользовательских профилях в WordPress.

Остался последний этап — засунуть все эти поля в регистрацию, да и ещё и с валидацией. Приступим:

<?php
add_action('register_form','show_fields');
add_action('register_post','check_fields',10,3);
add_action('user_register', 'register_fields');
 
function show_fields() {
/* добавляем поля "Город" и "Номер сотового" в форму регистрации в WordPress */ 
?>
<p>
	<label>Город<br/>
	<input id="city" class="input" type="text" value="<?php echo $_POST['city']; ?>" name="city" /></label>
</p>
<p>
	<label>Номер сотового<br/>
	<input id="mobile" class="input" type="text" value="<?php echo $_POST['mobile']; ?>" name="mobile" /></label>
</p>
<?php }
 
function check_fields ( $login, $email, $errors ) {
	/* 
	 * Функция проверки полей, в этом примере только смотрит, чтобы они не оставались пустыми, 
	 * но можно задать и свои условия,
	 * например запретить пользователям регистрироваться под одним и тем же номером телефона
	 */
	global $city, $mobile;
	if ($_POST['city'] == ''){
		$errors->add( 'empty_realname', "ОШИБКА: Город?" );
	} else {
		$city = $_POST['city'];
	}
	if ($_POST['mobile'] == ''){
		$errors->add( 'empty_realname', "ОШИБКА: Номер телефона?" );
	} else {
		$mobile = $_POST['mobile'];
	}
	return $errors;
}
 
function register_fields($user_id,$password= "",$meta=array()){
	update_user_meta( $user_id, 'city', $_POST['city'] );
	update_user_meta( $user_id, 'mobile', $_POST['mobile'] );
}

В этом примере рассмотрены только текстовые поля, но аналогичным образом можно добавить выпадающие списки, радио-кнопки и чекбоксы.

Если всё же возникнут с этим трудности, я напишу решение в комментах.

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии 39

  • Гарри 16 ноября 2011 #

    Подскажите пожалуйста как сделать выпадающие списки, радио-кнопки и чекбоксы. А самое ГЛАВНОЕ как прикрутить эти поля к профили пользователя. Что бы их было видно и можно было редактировать.

  • Дмитрий 27 декабря 2011 #

    Доброго времени суток, подскажите пожалуйста, сделал все как описано выше, добавил код в functions.php в папке с нужной мне темой, но когда захожу на site/wp-login.php?action=register, то все поля остаются почему-то стандартными.http://img851.imageshack.us/img851/7708/2e6c5b2946ad4b208ac56ba.png

    • Миша 27 декабря 2011 #

      Доброе утро!) я думаю, ты что-то напутал, я щас просто копирнул этот код и вставил в конец functions.php первой попавшейся темы, поля появились

  • Андрей 2 февраля 2012 #

    Очень полезное решение.Спасибо.Напиши мне на почту, есть предложение поработать.

  • Гарри 20 апреля 2012 #

    а как сделать проверку написания телефона и запрет регистрации
    под одним и тем же номером телефона ?

    • Миша 21 апреля 2012 #

      ну просто добавляешь условия, например так:

      if ($_POST['mobile'] == ''){
      	$errors->add( 'empty_mobile', "Укажите номер" );
      } elseif($_POST['mobile'] == '9271234567'){
      	$errors->add( 'empty_mobile', "Номер запрещён" );
      } else {
      	$mobile = $_POST['mobile'];
      }
      • Гарри 22 апреля 2012 #

        1. Проверку я имел виду, что бы проверялось не на пустое поле, а что бы были вписаны цифры , что-то типа этого

        if(preg_match("[0-9]{5,}", $_POST["phone"]) === 0)

        только прикрутить у меня это не получается. И как это можно сделать в том же css стиле, что и проверка при регистрации правильности е-mail в wordpress.

        2. Проверка не на определенный номер,а проверка по базе данный и если найдется такой номер, тогда выводится сообщение "Такой номер уже есть".

      • Миша 22 апреля 2012 #

        ну например проверка на количество символов и на то, что введены только цифры:

        if (strlen($_POST['mobile']) < 10
        || !is_numeric($_POST['mobile'])){
        	$errors->add( 'empty_realname', "текст ошибки" );
        }

        А CSS-стили по идее должны автоматически добавляться стандартные вордпрессовские.

        Для того, чтобы проверялись значения номеров из базы, то достаточно всё это в цикле провернуть.

        • alex 16 апреля 2013 #

          а можно для не особо понимающих в коде и не знающих как всё это в цикле провернуть написать строчку кода в которой реализована проверка номера на наличие в базе...Спасибо!

      • Миша 23 апреля 2012 #

        если хочешь, могу показать на примере)

  • Евгений 17 июня 2012 #

    Подскажите,а что сделать чтобы информация с дополнительных полей где то сохранялась?

    • Миша 17 июня 2012 #

      ну так она и сохраняется в профиле пользователя)

      • Евгений 17 июня 2012 #

        У меня не сохраняються.

        Добавил три поля qualipub.fr

        Adresse :

        Téléphone :

        Société :

        Ни где их не вижу,ни в письме о регистрации нов пользователя,ни в профиле ползователя.

      • Евгений 18 июня 2012 #

        Поставил все таки плагин Cimy User Extra Fields

      • Миша 18 июня 2012 #

        значит ты где-то накосячил))

  • Татьяна 15 октября 2012 #

    Можете подсказать как изменить уведомительные письма (хочется, чтобы вся заполненная информация приходила на почту того кто регистрируется и того чей сайт)?

  • Татьяна 17 октября 2012 #

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

  • Максим 9 октября 2014 #

    Здравствуйте, Михаил! У вас очень хороший и познавательный блог не могли бы вы помочь мне с темой, которая у вас в этом топике. Вопрос вроде бы начинался, а потом так и не закончился, либо вы ответили ему в личку.

    "Для того, чтобы проверялись значения номеров из базы, то достаточно всё это в цикле провернуть."
    У меня есть пользовательское поле "карта" и соответственно в базе запись my_cart.
    Вопрос, как мне это правильно пропустить через цикл, чтобы реализовать проверку номера на наличие в базе?

    • Миша 9 октября 2014 #

      Здравствуйте 🙂
      Попробуйте это:

      global $wpdb;
      $my_cart = $wpdb->get_results( 
      	"
      	SELECT user_id 
      	FROM $wpdb->usermeta
      	WHERE meta_key = 'my_cart' 
      	AND meta_value = 'проверяемое значение'
      	"
      );
      if( $my_cart ) {
      // тогда есть
      }
      • Максим 10 октября 2014 #

        Спасибо Михаил
        Но мне не совсем понятно могли бы вы мне объяснить . Правильно ли я думаю или нет

        global $wpdb;
        $my_cart = $wpdb->get_results( 
        	"
        	SELECT user_id 
        	FROM $wpdb->usermeta
        	WHERE meta_key = 'my_cart' 
        	AND meta_value = 'проверяемое значение($_POST['mobile'])'
        	"
        );
        if( $_POST['mobile'] == $my_cart ) {
        $errors->add( 'empty_mobile', "Номер запрещён" );
        }

        проверяемое значение это переменная которая приходит из поля ввода в скобках или нет там должно быть другое значение?
        И второе тогда в условии //тогда есть должно быть так ?
        Это почему то не работает наверное я не правильно думаю (

        • Максим 10 октября 2014 #

          Все Михаил разобрался. Тупанул сам правильно будет так может кому, где и пригодится

          global $wpdb;
          $my_cart = $wpdb->get_results( 
          	"
          	SELECT user_id 
          	FROM $wpdb->usermeta
          	WHERE meta_key = 'my_cart' 
          	AND meta_value = '$_POST["cart"]'
          	"
          );
          if( $my_cart ) {
          $errors->add( 'empty_mobile', "Номер запрещён" );
          }

          И так все работает !!! Спасибо вам Михаил.

          • Миша 10 октября 2014 #

            Пожалуйста 🙂 рад помочь

  • Константин 11 марта 2015 #

    Добрый день! У вас примеры для инпутов, а как сделать для textarea ?

    • Миша 12 марта 2015 #

      Добрый день!
      Да просто меняем строку с input на:

      <textarea id="city" name="city"><?php echo $_POST['city']; ?></textarea>
  • rasull2 25 марта 2015 #

    Очень нужная статья, а не подскажете как сделать чтоб все эти заполненные поля появились в профиле пользователя и там же также можно было их редактировать, ну как обычные данные которые есть там в профиле.

  • Артур 2 апреля 2015 #

    Михаил, добрый вечер!
    Спасибо за познавательный материал, очень пригодился.
    Вопрос использую код из Вашего примера, когда не заполняю добавленные поля выдается предупреждение о том что поле не заполнено, но пользователь создается. Соответственно когда пользователь уже внес или откорректировал номер телефона или город, зарегистрироваться он уже не может т.к. имя пользователя уже занято. Как быть в данной ситуации?
    Спасибо

    • Миша 3 апреля 2015 #

      Доброе утро!
      Код обновил, попробуйте ещё раз.

  • Андрей 6 мая 2015 #

    Михаил, в коде все равно ошибка. В конце комментов вот это лишнее - */.
    Оно вызывает ошибку синтаксиса и даже у вас в тексте выделено другим цветом )

    • Миша 7 мая 2015 #

      Вы правы, спасибо 🙂 исправил

  • PaCHeR 31 мая 2015 #

    Михаил здравствуйте.
    У меня почему-то выдает ошибку синтаксиса при добавлении кода в functions.php
    Может я что-то не так делаю? Я новичек в этом деле.
    Добавляю код в самый конец файла.

    • Миша 31 мая 2015 #

      Здравствуйте!
      А какая ошибка?

      • PaCHeR 31 мая 2015 #

        Parse error: syntax error, unexpected '<' in /home/p20049/public_html/xn--99-clcquk7ay.xn--p1ai/wp-content/themes/montezuma/functions.php on line 333

        • Миша 1 июня 2015 #

          Ну теперь пришлите мне 333-ю строку кода 🙂

  • PaCHeR 1 июня 2015 #

    Это самые первые строки кода. В зависомости от кол-ва пробелов
    или строка
    <?php
    или
    add_action('register_form','show_fields');

    • Миша 2 июня 2015 #

      Попробуйте тогда удалить <?php.

  • Федор 29 ноября 2019 #

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

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, в случае несоблюдения этого условия в 99% случаях ваш коммент будет удалён, а автор заблокирован. Печалька.