Хак: поведение сайта при необновленном профиле

Очередная штука понадобилась клиенту:

Представьте, себе 3 ситуации:

  1. Вы регистрируете пользователя самостоятельно, но НЕ заходите под его аккаунт, предоставляя эту возможность самому пользовател.
  2. Вы используете автоматический скрипт регистрации пользователя, который, естественно, никуда не заходит, а просто добавляет пользователя в базу.
  3. Вы хотите, чтобы пользователь после самой первой авторизации обязательно заходил в профиль и обновлял его (изменял данные, добавлял обязательные), иначе не имел доступа к сайту и постоянно перенаправлялся на регистрацию редактирование профиля.

Итак, решаем поставленные задачи всего двумя простенькими функциями. Ниже непосредственно код, далее – описание логики.

add_action('init', 'check_if_visited');
function check_if_visited(){
	global $bp;
	if ( is_user_logged_in() ){
		if ( empty($bp->loggedin_user->userdata->user_url)){
			add_action('template_notices', 'notice_not_edited');
			if($bp->current_component != 'profile' && $bp->current_action != 'edit' ) {
				wp_redirect($bp->loggedin_user->domain . BP_XPROFILE_SLUG .'/edit/');
				die;
			}
		}
	}
}

function notice_not_edited(){
	echo '<div id="message" class="error"><p>You visit the community for the first time. Please update your profile.</p></div>';
}

В первой функции мы проверяем – обновлялся ли хоть раз профиль пользователя. Хитрость в том, что при добавлении пользователя (будь то ручное или через обычную страницу регистрации на морде) поле user_url в таблице wp_users не заполняется автоматически. Именно поэтому появляется возможность делать проверку на то, пустое ли оно. Далее по коду в первой функции мы добавляем соответствующее уведомление о том, что пользователю надо обновить профиль (измените текст на свой) и делаем редирект на страницу редактирования.

При обновлении пользователем формы это поле автоматически заполняется чем-то вроде: http://example.com/members/user-login/

Если же у пользователя это поле заполненно (то есть он обновил свой профиль), то редиректа не будет и уведомление пропадет. Работает для каждого пользователя в отдельности.

Код размещаете в functions.php шаблона.

комментария 2

  1. Jettochkin:

    хорошее решение! еще бы в базе были данные по авкам… ;)

    • Хех, с авами не смотрел код :) Но я вообще-то даже знаю, как это сделать. Если будет время, то сделаю нечто подобное и для ав.
      Кстати, исправил крупнейший баг в этом коде – он всех неавторизованных отсылал в бесконечный неправильный редирект. Теперь все ок, проверено.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *