wp_create_user_request()WP 4.9.6

Создает и записывает запрос пользователя на выполнение действия с персональными данными: экспорт или удаление данных.

Запрос сохраняется как запись типа user_request. Это позволяет создавать такие запросы как для зарегистрированных пользователей сайта, так и для гостей без аккаунта.

Функция очищает email и название действия, проверяет корректность данных, ищет уже существующий незавершенный запрос с таким же email и действием, а затем создает новую запись запроса.

Функция только создает запрос. Она не отправляет пользователю письмо для подтверждения. Для отправки письма используйте wp_send_user_request() после успешного создания запроса.

Для одного email и одного действия нельзя создать новый запрос, пока уже есть незавершенный запрос в статусе request-pending или request-confirmed.

Хуков нет.

Возвращает

int|WP_Error.

  • int — ID созданного запроса.
  • WP_Error — объект ошибки, если email некорректный, действие не поддерживается, статус указан неверно, уже существует незавершенный запрос или запись не удалось создать.

Использование

wp_create_user_request( $email_address, $action_name, $request_data, $status );
$email_address(string) (обязательный)
Email пользователя. Это может быть email зарегистрированного пользователя или гостя без аккаунта.
$action_name(string) (обязательный)

Название действия, которое нужно подтвердить. Допустимые значения: export_personal_data и remove_personal_data.

В $action_name можно передавать только поддерживаемые типы действий: export_personal_data или remove_personal_data. Другие значения приведут к ошибке invalid_action.

$request_data(array)
Дополнительные данные, которые нужно сохранить вместе с запросом и передать в обработчики после подтверждения.
По умолчанию: []
$status(string)
Статус запроса. Можно указать pending или confirmed.
По умолчанию: 'pending'

Примеры

#1 Создание запроса на экспорт персональных данных

Создает запрос на экспорт персональных данных для указанного email.

$request_id = wp_create_user_request(
	'user@example.com',
	'export_personal_data'
);

if ( is_wp_error( $request_id ) ) {
	wp_die( $request_id->get_error_message() );
}

echo 'Запрос создан. ID: ' . esc_html( $request_id );

#2 Создание запроса и отправка письма для подтверждения

После создания запроса отправляет пользователю письмо с подтверждением действия.

$request_id = wp_create_user_request(
	'user@example.com',
	'remove_personal_data'
);

if ( is_wp_error( $request_id ) ) {
	wp_die( $request_id->get_error_message() );
}

$result = wp_send_user_request( $request_id );

if ( is_wp_error( $result ) ) {
	wp_die( $result->get_error_message() );
}

echo 'Письмо для подтверждения отправлено.';

#3 Создание подтвержденного запроса

Создает запрос сразу в статусе confirmed.

$request_id = wp_create_user_request(
	'user@example.com',
	'export_personal_data',
	[
		'source' => 'custom-form',
	],
	'confirmed'
);

if ( is_wp_error( $request_id ) ) {
	wp_die( $request_id->get_error_message() );
}

echo 'Подтвержденный запрос создан.';

#4 Обработка ошибки при повторном запросе

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

$request_id = wp_create_user_request(
	'user@example.com',
	'remove_personal_data'
);

if ( is_wp_error( $request_id ) ) {
	if ( 'duplicate_request' === $request_id->get_error_code() ) {
		echo 'Для этого email уже есть незавершенный запрос.';
	} else {
		echo esc_html( $request_id->get_error_message() );
	}
}

Список изменений

С версии 4.9.6 Введена.
С версии 5.7.0 Added the $status parameter.

Код wp_create_user_request() WP 7.1

function wp_create_user_request( $email_address = '', $action_name = '', $request_data = array(), $status = 'pending' ) {
	$email_address = sanitize_email( $email_address );
	$action_name   = sanitize_key( $action_name );

	if ( ! is_email( $email_address ) ) {
		return new WP_Error( 'invalid_email', __( 'Invalid email address.' ) );
	}

	if ( ! in_array( $action_name, _wp_privacy_action_request_types(), true ) ) {
		return new WP_Error( 'invalid_action', __( 'Invalid action name.' ) );
	}

	if ( ! in_array( $status, array( 'pending', 'confirmed' ), true ) ) {
		return new WP_Error( 'invalid_status', __( 'Invalid request status.' ) );
	}

	$user    = get_user_by( 'email', $email_address );
	$user_id = $user && ! is_wp_error( $user ) ? $user->ID : 0;

	// Check for duplicates.
	$requests_query = new WP_Query(
		array(
			'post_type'     => 'user_request',
			'post_name__in' => array( $action_name ), // Action name stored in post_name column.
			'title'         => $email_address,        // Email address stored in post_title column.
			'post_status'   => array(
				'request-pending',
				'request-confirmed',
			),
			'fields'        => 'ids',
		)
	);

	if ( $requests_query->found_posts ) {
		return new WP_Error( 'duplicate_request', __( 'An incomplete personal data request for this email address already exists.' ) );
	}

	$request_id = wp_insert_post(
		array(
			'post_author'   => $user_id,
			'post_name'     => $action_name,
			'post_title'    => $email_address,
			'post_content'  => wp_json_encode( $request_data ),
			'post_status'   => 'request-' . $status,
			'post_type'     => 'user_request',
			'post_date'     => current_time( 'mysql', false ),
			'post_date_gmt' => current_time( 'mysql', true ),
		),
		true
	);

	return $request_id;
}