Dodatkowe pola w formularzu komentarzy WordPress
- Piotr Bartczak
- 19 paź 2011
- 3 minut(y) czytania
Formularz komentarzy, który można znaleźć na większości stron opartych o WordPress zawiera standardowy zestaw pól – podpis, email oraz stronę WWW. Nic nie stoi jednak na przeszkodzie, aby rozbudować go o dodatkowe pola, na przykład nazwę firmy lub numer Gadu-Gadu.
Zanim zaczniemy
W starszych wersjach WordPress (do 2.9) jedyną metodą na wstawienie formularza komentarzy było wpisanie całego kodu do pliku comments.php. Była to mało elastyczna metoda, więc wraz z wersją 3.0 wprowadzono innowację w postaci funkcji comment_form, która wstawia formularz oraz wykonuje za nas dodatkowe czynności, m.in. sprawdza czy:
komentowanie jest włączone,
komentarze są otwarte czy zamknięte,
użytkownik jest zalogowany,
komentowanie wymaga logowania.
W wielu motywach można jednak spotkać się jeszcze z poprzednią, przestarzałą już metodą wstawiania formularza komentarzy. W takim motywie fragment odpowiedzialny za wyświetlanie formularza rozpoznasz łatwo, wygląda on mniej więcej tak:
<?php if (comments_open()) : ?>
<div id="respond">
<h3><?php comments_number('No Responses','One Response','% Responses');?></h3>
<?php /* kod PHP i HTML generujący formularz */ ?>
</div>
<?php endif; ?>
Aby rozszerzyć formularz o kolejne pola według poniższej instrukcji, musisz upewnić się, że szablon którego używasz wykorzystuje funkcję comment_form. Wystarczy, że zajrzysz do pliku comments.php i wyszukasz frazę comment_form. Jeśli zamiast niej, znajdziesz tam kod z przykładu powyżej, po prostu zaznacz cały ten fragment i zastąp go jedną linijką:
<?php comment_form(); ?>
Funkcja comment_form przyjmuje dwa parametry, jej ogólna składnia wygląda tak:
<?php comment_form($args,$post_id); ?>
Pełna lista dostępnych parametrów, akcji oraz filtrów znajduje się w oficjalnej dokumentacji.
W praktyce z funkcji comment_form można korzystać na dwa sposoby. Pierwszy polega na wywołaniu funkcji bezpośrednio z wybranymi argumentami w pliku comments.php, np. tak:
<?php comment_form(array('title_reply'=>'Zostaw komentarz')); ?>
Druga metoda polega na wykorzystaniu jednego lub kilku dostępnych filtrów. Właśnie z tej metody skorzystamy w niniejszym poradniku.
Wstawienie dodatkowego pola w formularzu
Zaczniemy od wyświetlenia dodatkowego pola w formularzu. W tym celu skorzystamy z jednego z dostępnych filtrów – comment_form_defaults. Poniższy kod powinien znaleźć się w pliku functions.php:
add_filter('comment_form_default_fields','new_comment_form_default_fields');
function new_comment_form_default_fields($fields) {
$fields['gg'] = '<p class="comment-form-gg"><label for="gg">'. __('Numer GG').'</label><input id="gg" type="text" name="gg" value="" size="30" /></p>';
return $fields;
};
W powyższym fragmencie kodu zdefiniowaliśmy sobie nowe pole, a w zmiennej $fields[’gg’] umieściliśmy kod HTML odpowiedzialny za wyświetlenie pola o nazwie „Numer GG”. Struktura elementów HTML jest zaczerpnięta z domyślnego sposobu ich wyświetlania dla standardowych pól formularza (podpis, email, strona WWW) w motywie TwentyEleven.
Po wykonaniu powyższego kroku, powinieneś już widzieć dodatkowe pole „Numer GG” w formularzu komentarzy. W szablonie TwentyEleven wygląda to tak:

Wygląd formularza komentarzy dla użytkowników niezalogowanych
Sposobów na wstawienie dodatkowych pól jest więcej. Metoda opisana powyżej ma jeden minus, który dla niektórych może okazać się istotny. Chodzi o to, że wstawione w ten sposób pola nie będą widoczne dla zalogowanych użytkowników (podobnie jak to ma miejsce w przypadku pól podstawowych – podpis, email, strona WWW).
Istnieje oczywiście możliwość obejścia tego ograniczenia. W tym celu skorzystamy z akcji comment_form_logged_in_after, która jest uruchamiana dla zalogowanych użytkowników, oraz comment_form_after_fields, która pozwoli nam wstawić pole tytuł tuż po standardowych polach formularza komentarzy. Kod wygląda nastepująco:
add_action('comment_form_logged_in_after','gg_comment_form_field');
add_action('comment_form_after_fields','gg_comment_form_field');
function gg_comment_form_field() {
?>
<p class="comment-form-gg">
<label for="gg"><?php _e('Numer GG'); ?></label>
<input id="gg" name="gg" size="30" type="text" />
</p>
<?php
};
Kod z obu przykładów wygeneruje identyczny formularz, z polem „Numer GG” tuż pod polem „Strona WWW”. Dla zalogowanych użytkowników, formularz wygląda tak:

Wygląd formularza komentarzy dla użytkowników zalogowanych
Zapisywanie danych do bazy
Kolejny krok polega na zapisaniu danych wprowadzonych w polu „Numer GG” do bazy danych, aby móc je później wyświetlić. W bazie danych znajdą się one w tablicy wp_commentmeta.
1
2
3
4
5
6
add_action('comment_post','save_comment_meta_data');
function save_comment_meta_data($comment_id) {
$gg = (int) $_POST['gg'];
update_comment_meta($comment_id,'gg',$gg);
};
Zwróć uwagę na 4 linijkę kodu. Ponieważ mamy tutaj do czynienia z danymi wprowadzanymi przez użytkownika, warto zadbać o ich walidację. W naszym przykładzie pola „Numer GG”, oczekujemy że wprowadzony zostanie ciąg cyfr. Dlatego też dokonujemy konwersji typu aby upewnić się, że przekazywana wartość zostanie skonwertowana na liczbę. Jeśli użytkownik zamiast cyfr wprowadzi jakiś tekst lub tekst i cyfry, całość zostanie zinterpretowana jako 0 i tak też będzie zapisana w bazie danych.
W zależności od charakteru pola, powinieneś rozważyć odpowiednią jego walidację – bardziej szczegółowe informacje na ten temat znajdziesz w dokumentacji WordPress.
Wyświetlanie dodatkowych danych razem z komentarzem
Poniższy fragment kodu odpowiada za wyświetlenie numeru Gadu-Gadu tuż obok nazwy autora komentarza. Tutaj „podpinamy” się pod funkcję get_comment_author_link, modyfikując zwracaną przez nią wartość, tak aby do nazwy autora dołączony został numer Gadu-Gadu.
add_filter('get_comment_author_link','add_gg_to_author');
function add_gg_to_author($author) {
$gg = get_comment_meta(get_comment_ID(),'gg',true);
if ($gg) $author .= " (gg: $gg)";
return $author;
};
W zależności od tego, gdzie chcemy wyświetlić zawartość dodatkowego pola, można skorzystać również z innych filtrów, np. comment_text aby wyświetlić zawartość pola w pobliżu (przed lub po) treścią komentarza.
Jeszcze rzut oka na efekt końcowy:

Numer Gadu-Gadu obok nazwy autora komentarza
Podsumowanie
Po wykonaniu tych trzech kroków w formularzu komentarzy wyświetlone zostanie dodatkowe pole „Numer GG”, a jego zawartość będzie zapisywana oraz wyświetlana razem z treścią komentarza. Mam nadzieję, że ten artykuł zainspiruje Cię i zachęci do dalszego eksperymentowania z formularzem komentarzy.
Comments