Как вытащить данные автора комментария из его кукисов (Имя, Email, URL) ?

Уверен, что существует сотня различных способов, для чего это может понадобится. Но лично мне это пригодилось, когда я захотел, чтобы после того, как пользователь оставил комментарий, его данные автоматически заполнялись на странице контактов в форме обратной связи.

Я подготовил для вас функцию, которая возвращает сразу массив со всеми данными автора комментария: его именем, адресом электронной почты и адресом сайта (если он конечно указал его).

Функцию можете вставить в functions.php вашей темы WordPress.

function true_comment_avtor_info() {
	if( is_user_logged_in() )
		return false; // возвращаем false, если пользователь авторизован
 
	$info = array(); // наш будущий массив с данными комментатора
 
	foreach( $_COOKIE as $kluch => $znachenie ) { // прокручиваем кукисы в цикле
 
		if ( strpos( ' ' . $kluch, 'comment_author_email' ) > 0 ) { // если емайл совпадает
        		$info['email'] = urldecode( $znachenie );
        	} elseif ( strpos( ' ' . $kluch, 'comment_author_url' ) > 0 ) { // если URL совпадает
        		$info['sait'] = urldecode( $znachenie );
        	} elseif ( strpos( ' ' . $kluch, 'comment_author' ) > 0 ) { // иначе если автор
       			$info['avtor'] = urldecode( $znachenie );
       		}
 
	}
	return $info; // возвращаем массив с результатом
}

Несколько комментариев:

  • В самом начале я сделал проверку при помощи is_user_logged_in(), не является ли пользователь авторизованным. Конечно, можно было бы дополнить функцию и выводить также Имя/Емайл/Сайт авторизованных пользователей, но тогда функция бы усложнилась, да и в принципе это тема для другого поста.
  • Потом мы прокручиваем все кукисы через цикл и проверяем присутствие в них выражений comment_author_email, comment_author_url и comment_author. Обратите внимание, что просто comment_author присутствует во всех трёх случаях — именно поэтому я поставил его самой последней проверкой.
  • Функция возвращает массив вида Array ( [avtor] => [email] => [sait] => ). Если сайт не указан, то Array ( [avtor] => [email] => ).

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

<?php
	$avtor = true_comment_avtor_info();
?>
<form action="https://truemisha.ru" method="POST">
	<input type="text" name="avtor" value="<?php if( isset( $avtor['avtor'] ) ) echo $avtor['avtor'] ?>" />
	<input type="email" name="email" value="<?php if( isset( $avtor['email'] ) ) echo $avtor['email'] ?>" />
	<textarea name="soobchenie"></textarea>
	<button>Отправить письмо</button>
</form>

Я также добавил проверку через isset() для того, чтобы на вашем сайте не появлялись уведомления из серии Notice: Undefined index: при включенном параметре WP_DEBUG в файле wp-config.php (это только в том случае, если какой-либо из элементов массива будет отсутствовать, к примеру тот же «сайт»).

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

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

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

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

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.