Flector

Как добавить свое поле в форму добавления комментария?

Комментарий с выводом поля Город

При необходимости в форму добавления комментариев на вашем сайте можно включить свои дополнительные поля вроде "Город" или "Twitter" (и любое другое). А затем эти поля можно вывести в самом комментарии (как на скриншоте). Для этого вам необходимо добавить в файл functions.php вашей темы следующий код:

//добавление нового поля в форму добавления комментария start
//добавление поля "Город" в форму комментария 
function wph_add_city_field($default) {
    $commenter = wp_get_current_commenter();
    $default['fields']['email'] .= '
        <p class="comment-form-author">
        <label for="city">Город 
        <span class="required">*</span>
        </label>
        <input id="city" name="city" size="30" 
        type="text" aria-required="true" required="required" />
        </p>';
    return $default;
}
//проверка на заполненность поля "Город"
function wph_verify_city_field($commentdata) {
    $city = wp_slash((isset($_POST['city'])) ? trim($_POST['city']) : null);
    if ('' == $city)
        wp_die('Ошибка: пожалуйста, заполните все необходимые поля (город).');
    return $commentdata;
}
//сохранение поля "Город" в комментарии
function wph_save_city_field($comment_id) {
    add_comment_meta($comment_id, 'city', $_POST['city']);
}
//вывод поля "Город" рядом с именем автора
function wph_add_city_to_author($author) {
    $city = get_comment_meta(get_comment_ID(), 'city', true);
    if ($city) $author .= " ($city)";
    return $author;
}
add_filter('comment_form_defaults', 'wph_add_city_field');
add_filter('preprocess_comment', 'wph_verify_city_field');
add_action('comment_post', 'wph_save_city_field');
add_filter('get_comment_author_link', 'wph_add_city_to_author');
//добавление нового поля в форму добавления комментария end

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


Комментарии (8 комментариев)
  1. Здравствуйте! Убрал по вашему примеру HTML-теги в форме комментирования, вместе с этим пропал чекбокс от "Subscribe to Comments", как его вернуть? Или как по примеру этой статьи добавить строчку кода

    1
    
    <?php show_subscription_checkbox(); ?>

    для того, чтобы в форме комментирования чекбокс отобразился? Вордпресс версии 4.2. Тема "Morphic". Ссылка на тему ссылка
    Вижу, что автор блога знает толк в Wordpress, надеюсь на помощь. Заранее благодарю за решения моей проблемы!

    • Flector:

      Subscribe to Comments какой? старый или какой-то из новых форков вроде reloaded версии?

      • Прошу прощения, что не указал сразу. Старая версия, самый первый плагин Subscribe to Comments.
        Мой аддаптивный шаблон 2013 года, там используется другой способ вывода-подгрузки формы комментариев. И вставить строчку для вывода чекбокса в "своё место" не получается, так как я понял, необходимо его вписать в код из которого его подгружают. К сожалению у меня нет знаний, которые необходимы для решения моей задачи. Делаю всегда методом "тыка" :) Расчитыаю на вашу помощь, спасибо!

        • Flector:

          обычно достаточно его вставить после вывода comment_form в comments.php

  2. Александр, спасибо! Вы не могли бы подсказать, я так понимаю, что в данном примере собранна функция ввода, обработки, сохранения и вывода введенной информации в поле "Город" для комментариев. А как просто в форме для комментирования разместить код через функцию? Строчку вывода чекбокса

    1
    
    <?php show_subscription_checkbox(); ?>

    Проще говоря, прописать по аналогии с кодом переведённое в данной статье функцию, которая будит выводить код, в моём случае код вывода чекбокса.
    Это конечно явное извращение, выводить чекбокс плагина через функцию, но другого варианта не вижу. Либо так, либо нужно править сам код коментс.пхп
    Думаю, многим было бы узнать вариант добавления кода/текста в само "тело" формы для комментирования. В новых темах почти не используют старый-добрый файл, который можно было просто править и добавлять, с нынешным подходом вебу разработчиков все порядком усложнилось и при малейшей попытке сделать это выбивает ошибку.

    • Flector:

      так тем же путем. или я вопроса не понял? насколько я понимаю - ваша функция от плагина Subscribe to Comments и эта функция автоматом выводится плагином в форме комментирования, выводимой функций comment_form. проблемы там начинаются только, если в теме переопределены стандартные поля - тогда автоматически может не цепляться функция.

      если автоматически чекбокс не выводится, то поможет такая функция:

      function wrq_change_comment_form_defaults($default) {
          ob_start();
          if(function_exists('show_subscription_checkbox')) { show_subscription_checkbox(); }
          $subcheckbox = ob_get_contents();
          ob_end_clean();   
          $default['comment_field'] = str_replace(
                  '</textarea>',
                  '</textarea>'.$subcheckbox, $default['comment_field']) ;
          return $default; }
      add_filter('comment_form_defaults', 'wrq_change_comment_form_defaults', 99999);

      но опять же - если в comment.php переопределены стандартные поля, то менять код надо будет именно в comments.php - данный фильтр не поможет.

  3. Здравствуйте. Скажите, пожалуйста, а как сделать чтобы это поле это было видно только администратору?

    • Flector:

      убрать в коде фильтр:

      add_filter('get_comment_author_link', 'wph_add_city_to_author')

      но я так полагаю (по форуму поддержки wordpress), что вам надо выводить это поле в админке. в таком случае поможет этот код:

      function myplugin_comment_columns( $columns ) {
      	$columns['city'] = 'Город';
      	return $columns; 
      }
      add_filter( 'manage_edit-comments_columns', 'myplugin_comment_columns' );
       
      function myplugin_comment_column( $column, $comment_ID ) {
      	if ( 'city' == $column ) {
      		if ( $meta = get_comment_meta( $comment_ID, $column , true ) ) {
      			echo $meta;
      		}
      	}
      }
      add_filter( 'manage_comments_custom_column', 'myplugin_comment_column', 10, 2 );

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

Написать комментарий

Для вставки кода воспользуйтесь кнопкой "Код". Используйте предпросмотр!