Расширение профиля пользователей

Ну во-первых хочу сказать, что wordpress не самый лучший движок для создания какого-либо рода коммьюнити. В первую очередь это блог. (так я считал в сентябре 2011-го года, сейчас беру свои слова обратно :))

Однако расширение может потребоваться и по другим причинам. Предположим у вас на блоге пишут посты многие авторы. А вы хотите знать о них всё! Ну или хотя бы номер телефона и Webmoney-реквизиты, чтобы как-то оплачивать им работу.

Никаких плагинов мы использовать не будем. Короче вот вам пример кода, который нужно засунуть в functions.php, сейчас расскажу, что к чему.

<?php
function show_profile_fields( $user ) { ?> 
	<h3>Дополнительная информация</h3>
	<!-- добавляется ещё один блок в профиле, в примере он будет называться "Дополнительная информация" -->
	<table class="form-table">
	<!-- для того чтобы ваши поля выглядели так же, как и стандартные в Wordpress, прописывайте такие же классы как и тут -->
	<!-- добавляем поле город -->
	<tr><th><label for="city">Город</label></th>
	<td><input type="text" name="city" id="city" value="<?php echo esc_attr(get_the_author_meta('city',$user->ID));?>" class="regular-text" /><br /></td></tr>
	<!-- добавляем поле пол -->
	<th><label for="gender">Пол</label></th>
	<td><?php $gender = get_the_author_meta('gender',$user->ID ); ?>
		<ul>
			<li><input value="мужской" name="gender"<?php if ($gender == 'мужской') { ?> checked="checked"<?php } ?> type="radio" /> мужской</li>
			<li><input value="женский"  name="gender"<?php if ($gender == 'женский') { ?> checked="checked"<?php } ?> type="radio" /> женский</li>
		</ul>			
	</td></tr>
	<!-- закрываем теги и применяем функцию -->
	</table>
<?php }
add_action( 'show_user_profile', 'show_profile_fields' );
add_action( 'edit_user_profile', 'show_profile_fields' );

Чтобы поля работали, недостаточно только одной этой функции, поля конечно появятся, но не будут сохраняться, поэтому дополняем код вот этим:

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

Вот как это будет выглядеть в админке на странице редактирования пользователя:

пример дополнительных полей в профиле

Существуют ещё некоторые способы добавления и удаления полей в профиле.

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

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

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

  • Geleosan22 июля 2013 в 21:07 #

    Здравствуйте! А не подскажите, как переписать строчки выбора пола, если будет не radio, а checkbox? И добавление потом этих полей в usermeta?

    Вот попробовал, что-то типа того будет?

    <?php $gender = get_the_author_meta('gender',$user->ID ); ?>
    		<ul>
    			<li><input value="мужской" name="gender[0]"<?php if ($gender[0] == 'мужской') { ?> checked="checked"<?php } ?> type="checkbox" /> мужской</li>
    			<li><input value="женский"  name="gender[1]"<?php if ($gender[1] == 'женский') { ?> checked="checked"<?php } ?> type="checkbox" /> женский</li>
    		</ul>
    • Миша23 июля 2013 в 07:07 #

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

      <?php $gender = get_user_meta( $user->ID, 'gender', true); ?>
      <ul>
      	<li><input value="мужской" name="gender[0]"<?php echo ($gender == 'мужской') ? ' checked="checked"' : '' ?>type="checkbox" /> мужской</li>
      	<li><input value="женский" name="gender[1]"<?php echo ($gender == 'женский') ? ' checked="checked"' : '' ?>type="checkbox" /> женский</li>
      </ul>
    • Миша23 июля 2013 в 09:07 #

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

      • Geleosan23 июля 2013 в 11:07 #

        Нет, конечно, там другие будут поля. Просто чтобы проще вопрос был и меньше менять в коде ))

        <?php echo ($gender == 'мужской') ?

        А разве тут не надо вот так $gender[1]?

        • Миша23 июля 2013 в 14:07 #

          зависит от того, в каком виде данные заносятся в базу)

          • Geleosan23 июля 2013 в 14:07 #

            Хм... не слишком шарю в этом. То есть если применять запись в базу, как в вашем коде из поста, то [1] в if не нужно, верно?
            Мне просто казалось, что мы в if проверяем конкретное значение из массива, там же не одно значение, а два в данном случае [0] и [1].
            Прошу прощения, если глупые вопросы задаю.

  • Серега16 декабря 2014 в 21:12 #

    А как сделать проверку на ошибки и как её вывести пользователю?

    • Миша17 декабря 2014 в 07:12 #

      В файле wp-config.php установить значение параметра WP_DEBUG равным true.

      • Серега17 декабря 2014 в 08:12 #

        Имел ввиду сделать проверку на ошибки кастомных полей.
        Маленько разобрался и сделал так:

        Выводим кастомное поле с загрузкой файла:

        function init_organization_fields($user) {
        echo '<input type="file" name="my_file" id="my_file">';
        }
        add_action('show_user_profile', 'init_organization_fields');
        add_action('edit_user_profile', 'init_organization_fields');

        Сохраняем и загружаем файл на сервер:

        function save_organization($uid) {
        	if (!current_user_can('edit_user', $uid )) {
        		return false;
        	}
                        if (isset($_FILES['my_file']) && !empty($_FILES['my_file']['name'])) {
        			$file = wp_handle_upload($_FILES['my_file'], $overrides);
        			if (!$file || isset($file['error'])) {
        				return true;
        			}
         
        			$url = $file['url'];
        			update_usermeta($uid, 'my_file', $url);
         
        		}
        }
        add_action('personal_options_update', 'save_organization');
        add_action('edit_user_profile_update', 'save_organization');

        Проверяем тип файла:

        function validate_organization(&$errors, $update = null, &$user = null) {
        	if (isset($_FILES['my_file']) && (!empty($_FILES['my_file']['name']) || is_string($_FILES['my_file']['error']))) {
        		$mime = get_mime_file($_FILES['my_file']);
         
        		if ($mime['ext'] == false) {
        			$errors->add('my_file', "<strong>Ошибка</strong>: Некорректный тип файла.");
        		}
        	}
         
        }
        add_action('user_profile_update_errors', 'validate_organization');

        Такой способ вроде и работает, но не уверен в его правильности))

  • Роман14 июня 2015 в 12:06 #

    Добрый день Михаил, не подскажете, как сделать на основе данного примера два выпадающих списка?
    Один пункт должен быть выбором страны, а второй -выбором города
    Пример:
    Страна (выбрать из выпадающего списка нужную)
    Город(выбрать из выпадающего списка нужный)
    И еще вопрос, создаю страницу регистрации при помощи плагина, можно ли будет эти поля вывести при регистрации пользователя на страницу? или эти поля будут доступны только в админке?
    заранее спасибо)

    • Миша15 июня 2015 в 14:06 #

      Добрый день!
      1) Про механику использования select я уже писал тут,
      2) да, можно, всё равно они в метаданных храниться будут.

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

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
  • Миша: Привет ещё раз, не поверишь, реально не сталкивался с этим вопросом. По теории можно сказать следующее: во-первых,...

  • Миша: Привет, вообще без проблем, делаешь всё через require(), require_once() - выбирай любую, какая больше нравится.

  • Виталий Моргунов: Привет! Не могу разобаться, как я могу контролировать порядок подключения стилей. В моем случае мне нужно чтобы стили...

  • Миша: Спасибо!

  • w0rmak: Это было просто. Нашел код в интернете. Добавьте и себе ymaps.load(function () { var input = document.getElem...