WordPress. Форма комментирования

29.05.2019

Теги: CMSHookWeb-разработкаWordPressКомментарииСобытиеФорма

Функция comment_form()

Выводит на экран готовый код формы комментирования, который можно использовать в шаблонах темы. Большинство полей формы можно изменить через параметр $args (ассоциативный массив) или можно использовать фильтр comment_form_defaults, чтобы изменить параметры по умолчанию.

comment_form($args, $post_id);
  • $args (массив). Аргументы, в соответствии с которыми будет создана форма комментирования. По умолчанию: предустановленные.
  • $post_id (строка/массив/число). Идентификатор поста, для которого нужно вывести форму комментирования. По умолчанию: null (текущий пост).

По умолчанию будет сформирован примерно такой html-код:

<div id="respond" class="comment-respond">
    <h3 id="reply-title" class="comment-reply-title">Добавить комментарий
        <small>
            <a rel="nofollow" id="cancel-comment-reply-link" href="/post-number-8/#respond" style="display:none;">Отменить ответ</a>
        </small>
    </h3>
    <form action="http://www.server.com/wp-comments-post.php" method="post" id="commentform" class="comment-form">
        <p class="comment-notes">
            <span id="email-notes">Ваш e-mail не будет опубликован.</span>
            Обязательные поля помечены <span class="required">*</span>
        </p>
        <p class="comment-form-comment">
            <label for="comment">Комментарий</label>
            <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required"/>
        </p>
        <p class="comment-form-author">
            <label for="author">Имя <span class="required">*</span>
            </label>
            <input id="author" name="author" type="text" value="" size="30" maxlength="245" required="required">
        </p>
        <p class="comment-form-email">
            <label for="email">E-mail <span class="required">*</span></label>
            <input id="email" name="email" type="text" value="" size="30" maxlength="100" aria-describedby="email-notes" required="required">
        </p>
        <p class="comment-form-url">
            <label for="url">Сайт</label>
            <input id="url" name="url" type="text" value="" size="30" maxlength="200">
        </p>
        <p class="form-submit">
            <input name="submit" type="submit" id="submit" class="submit" value="Отправить комментарий">
            <input type="hidden" name="comment_post_ID" value="1883" id="comment_post_ID">
            <input type="hidden" name="comment_parent" id="comment_parent" value="0">
        </p>
    </form>
</div>

Фильтр comment_form_defaults

Позволяет изменить аргументы по-умолчанию, с которыми вызывается функция comment_form():

add_filter('comment_form_defaults', function ($defaults) {
    // изменим текст кнопки отправки формы
    $defaults['label_submit'] = 'Добавить комментарий';
    return $defaults;
});

Фильтр comment_form_default_fields

Позволяет изменять, добавлять или удалять поля формы, кроме поля комментария. Для начала посмотрим, какие поля нам доступны:

add_filter('comment_form_default_fields', function($fields) {
    die(print_r($fields)); // посмотрим какие поля есть
});
Array
(
    [author] => <p class="comment-form-author"><label for="author">Имя <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" required='required' /></p>
    [email] => <p class="comment-form-email"><label for="email">E-mail <span class="required">*</span></label> <input id="email" name="email" type="text" value="" size="30" maxlength="100" aria-describedby="email-notes" required='required' /></p>
    [url] => <p class="comment-form-url"><label for="url">Сайт</label> <input id="url" name="url" type="text" value="" size="30" maxlength="200" /></p>
)

Теперь удалим поле «Сайт» и добавим поле «Телефон»:

add_filter('comment_form_default_fields', function($fields) {
    // удаляем поле «Сайт»
    unset($fields['url']);
    // добавляем поле «Телефон»
    $label = __('Phone');
    $fields['phone'] =
<<<PHONE
    <p class="comment-form-phone">
        <label for="phone">$label</label>
        <input id="phone" name="phone" type="text" size="30"/>
    </p>
PHONE;
    return $fields;
});

Фильтр comment_form_field_comment

Позволяет изменить поле комментария:

add_filter('comment_form_field_comment', function () {
    $field =
<<<FIELD
    <p class="comment-form-comment">
        <label for="comment">Комментарий</label>
        <textarea id="comment" name="comment" cols="45" rows="8"
                  maxlength="65525" required="required"></textarea>
    </p>
FIELD;
    return $field;
});

Фильтр comment_form_fields

Позволяет изменить любое поле формы. Также можно изменить порядок, т.е. чтобы textarea выводилось после полей author, email, url. Для начала просто посмотрим на массив полей формы:

add_filter('comment_form_fields', function($fields) {
    die(print_r($fields)); // посмотрим какие поля есть
});
Array
(
    [comment] => <p class="comment-form-comment"><label for="comment">Комментарий</label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required"></textarea></p>
    [author] => <p class="comment-form-author"><label for="author">Имя <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" required='required' /></p>
    [email] => <p class="comment-form-email"><label for="email">E-mail <span class="required">*</span></label> <input id="email" name="email" type="text" value="" size="30" maxlength="100" aria-describedby="email-notes" required='required' /></p>
    [url] => <p class="comment-form-url"><label for="url">Сайт</label> <input id="url" name="url" type="text" value="" size="30" maxlength="200" /></p>
)

А теперь разместим поля формы в нужном нам порядке:

add_filter('comment_form_fields', function($fields) {

    // сюда соберем поля в новом порядке
    $new = [];
    // нужный нам порядок полей формы
    $keys = ['author', 'email', 'url', 'comment'];

    foreach ($keys as $key) {
        if (isset($fields[$key])) {
            $new[$key] = $fields[$key];
            unset($fields[$key]);
        }
    }

    // если остались еще какие-то поля, добавим их в конец
    if (!empty($fields)) {
        foreach ($fields as $key => $value) {
            $new[$key] = $value;
        }
    }
    return $new;
});

Событие comment_form_before

Позволяет вывести информацию перед выводом формы комментария, перед заголовком «Добавить комментарий».

add_action('comment_form_before', function () {
    echo '<p>Текст, который будет показан перед формой комментирования.</p>';
});

Событие comment_form_after

Позволяет вывести информацию после вывода формы комментария, после кнопки «Отправить комментарий».

add_action('comment_form_after', function () {
    echo '<p>Текст, который будет показан после формы комментирования.</p>';
});

Событие comment_form_before_fields

Позволяет вывести информацию перед полями формы author, email и url. Эту информацию увидят только неавторизованные пользователи, потому как для авторизованных поля author, email и url скрыты.

add_action('comment_form_before_fields', function () {
    echo '<p>Текст, который будет показан перед полями формы.</p>';
});

Событие comment_form_after_fields

Позволяет вывести информацию после полей формы author, email и url. Эту информацию увидят только неавторизованные пользователи, потому как для авторизованных поля author, email и url скрыты.

add_action('comment_form_after_fields', function () {
    echo '<p>Текст, который будет показан после полей формы.</p>';
});

Событие comment_form_top

Позволяет вывести информацию после заголовка «Добавить комментарий».

add_action('comment_form_top', function () {
    echo '<p>Текст, который будет показан после «Добавить комментарий».</p>';
});

Событие comment_form_logged_in_after

Позволяет вывести информацию после текста «Вы вошли как … Выйти?». Это сообщение увидят только авторизованные пользователи.

add_action('comment_form_logged_in_after', function () {
    echo '<p>Текст, который будет после «Вы вошли как … Выйти?»</p>';
});

Событие comment_form_must_log_in_after

Если в настройках комментрирования отмечен checkbox «Пользователи должны быть авторизованы для комментирования», неавторизованные пользователи не увидят форму, а только сообщение «Для отправки комментария необходимо авторизоваться». С помощью этого события можно вывести таким пользователям информацию после этого сообщения:

add_action('comment_form_must_log_in_after', function () {
    echo '<p>Текст, который будет после «Для отправки комментария …»</p>';
});

Поиск: CMS • Web-разработка • WordPress • Комментарии • Событие • Форма • Comment • Form • Hook

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.