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

В предыдущих постах я говорил о том, как добавлять и удалять дополнительные поля без плагинов в пользовательских профилях в 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'] );
}

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

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

Смотрите также

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

  • Гарри16 ноября 2011 в 21:11 #

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

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

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

    • Миша27 декабря 2011 в 06:12 #

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

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

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

  • Гарри20 апреля 2012 в 22:04 #

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

    • Миша21 апреля 2012 в 07:04 #

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

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

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

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

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

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

      • Миша22 апреля 2012 в 20:04 #

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

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

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

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

        • alex16 апреля 2013 в 00:04 #

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

      • Миша23 апреля 2012 в 14:04 #

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

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

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

  • Татьяна15 октября 2012 в 18:10 #

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

  • Татьяна17 октября 2012 в 11:10 #

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

  • Максим9 октября 2014 в 15:10 #

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

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

    • Миша9 октября 2014 в 22:10 #

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

      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 в 09:10 #

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

        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 в 11:10 #

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

          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', "Номер запрещён" );
          }

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

  • Константин11 марта 2015 в 10:03 #

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

    • Миша12 марта 2015 в 10:03 #

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

      <textarea id="city" name="city"><?php echo $_POST['city']; ?></textarea>
  • rasull225 марта 2015 в 16:03 #

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

  • Артур2 апреля 2015 в 21:04 #

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

  • Андрей6 мая 2015 в 16:05 #

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

  • PaCHeR31 мая 2015 в 11:05 #

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

  • PaCHeR1 июня 2015 в 20:06 #

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

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

phpjsHTMLCSSSQLПросто код
  Комментарии закрыты.