Как вытащить данные автора комментария из его кукисов (Имя, 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] => => [sait] => ). Если сайт не указан, то Array ( [avtor] => => ).

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

<?php
    $avtor = true_comment_avtor_info();
?>
<form action="https://misha.blog" 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 (это только в том случае, если какой-либо из элементов массива будет отсутствовать, к примеру тот же «сайт»).

Источник: misha.blog

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

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

%d такие блоггеры, как: