Użycie Ksesa w Wordpresie

.

Filtrowanie danych, zwłaszcza tych zawierających tagi HTML to dość śliski temat. Istnieje kilka niezłych filtrów napisanych dla PHP z pomocą, których można to wykonać prawidłowo i dość niewilkim kosztem. WordPress korzysta z filtra o nazwie Kses, który jest zmodyfikowaną wersją kodu napisanego przez Ulfa Harnhammara we współpracy z kilkoma innymi osobami. Niniejszy wpis ma na celu przybliżyć w jaki sposób Kses jest używany w Wordpresie i jak z niego korzystać w tym systemie.

Słowo o Ksesie

Kses jest filtrem. Niemal każdy filtr ma to do siebie, że pobiera pewne dane a następnie zwraca je w zmodyfikowanej wersji, nie inaczej jest w tym przypadku.

Standardowo Kses jest dostępny w kilku wersjach. WordPress póki co nie korzysta ze ogólnie dostępnej klasy php5.class.kses.php ale ze zwykłych funkcji. Oryginalny, niezmodyfikowany filtr można ściągnąć ze strony projektu na sourceforge.net.

Zanim przejdę do tego jak działa Kses w Wordpresie, omówię jeszcze kilka zmiennych globalnych, z których ten filtr korzysta.

$allowedentitynames – jest to tablica zawierająca dozowolone encje HTML. Wszystkie encje, które są w niej nieobecne, zostaną autmoatycznie usunięte podczas filtrowania.

$allowedtags – jest to tablica z normalnie dozwolonymi dla użytkowników tagami HTML.

$allowedposttags – tablica ze wszystkimi dozwolonymi tagami we wpisie dla zwykłego użytkownika.
Administrator bloga może używać wszystkich tagów.

Jak łatwo się domyślić, Kses w wersji dla Wordpresa mocno polega na wartościach zawartych w powyższych tablicach.

Użycie Ksesa w Wordpresie

Jak wspomniałem wyżej, w przypadku Wordpresa, użycie filtra Kses sprowadza się do wywołania odpowiedniej funkcji filtrującej.

Funkcje wchodzące w skład Ksesa w Wordpresie, które warto znać to: wp_kses, wp_kses_data, wp_filter_kses, wp_kses_post i wp_filter_post_kses.

Funkcja wp_kses pobiera co najmniej dwa argumenty, pierwszym z nich jest łancuch znaków do przefiltrowania, drugim natomiasta dozwolone tagi HTML w postaci tablicy PHP. Trzeci, opcjonalny argument, jeżeli określony, jest tablicą z dozwolonymi protokołami ( np. http, https, ftp, ftps, mailto, news, irc, gopher, nntp itd.).

Użycie funkcji wp_kses może wyglądać jak nastepuje:


wp_kses($do_przefiltowania, array( 'img' => array( 'alt' => array(),'title' => array()) ) );

Funkcja wp_kses_data jest nieco mnie skomplikowana. Jako jedyny argument pobiera ona łańcuch znaków do przefiltrowania i wewnętrznie wykorzystuje tablicę$allowedtags. Innymi słowy, aby zmodyfikować rezultat działanie tej funkcji, należy zmodyfikować tablicę $allowedtags.


wp_kses_data($do_przefiltrowania);

Standardowo zmienna $allowedtags wygląda jak następuje:


$allowedtags = array(
  'a' => array(
    'href' => array (),
    'title' => array ()
  ),
  'abbr' => array(
    'title' => array ()
  ),
  'acronym' => array(
    'title' => array ()
  ),
  'b' => array(),
  'blockquote' => array(
    'cite' => array ()
  ),
  'cite' => array (),
  'code' => array(),
  'del' => array(
    'datetime' => array ()
  ),
  'em' => array (),
  'i' => array (),
  'q' => array(
    'cite' => array ()
  ),
  'strike' => array(),
  'strong' => array()
);

Kolejne tagi można dodać jak następuje:


global $allowedtags;
$allowedtags['br'] = array( 'br' => array () );
$allowedtags['img'] = array( 'img' => array ( 'alt' => array(),'title' => array() ) );

Kod powyżej modyfikuje zmienną $allowedtags dodając dwa nowe tagi HTML tj. br i img.

Aby usnąć któryś ze znaczników HTML ze zmiennej $allowedtags można użyć kodu jak poniżej:


global $allowedtags;
unset($allowedtags['a']);

Po zastosowaniu powyższego kodu w pliku wtyczki lub functions.php wszystkie odnośniki w tekście filtrowanym z pomocą funkcji wp_kses_data i wp_kses_filter zostaną usunięte przed jego wyświetleniem.

Funkcja wp_kses_filter działa podobnie jak wp_kses_data. Różnica pomiędzy nimi jest taka, że ta pierwsza potrktuje przefiltrowany łańcuch znaków funkcją addslashes.


wp_kses_filter($do_przefiltrowania);

Funkcja wp_kses_post służy do filtrowania zawartości pojedyńczego wpisu i usuwa z filtrowanego łańcucha znaków wszystkie tagi HTML, które nie znajdują się w tablicy $allowedposttags.


wp_kses_post($do_przefiltrowania)

Wp_kses_post ma odpowiednika o nazwie wp_filter_post_kses, która to funkcja, podobnie jak wp_kses_filter zwraca przefiltrowaną zawartość po przepuszczeniu jej przez funkcję addslashes.


wp_filter_post_kses($do_przefiltrowania)

Hak pre_kses

WordPress dofiniuje jeden bardzo przydatny hak w postaci filtra o nazwie pre_kses. Dzięki niemu możliwe jest manipulacja danymi i tablicami z tagami HTML zanim jeszcze filtr zawartości zostanie na dobre uruchomiony. Popatrzmy na przykład poniżej:


function filtering_function($data_to_be_filtered) {
  // kod do wykonania
  return $data_to_be_filtered;
}
add_filter('pre_kses', 'filtering_function');

Funkcje wp_kses_data, wp_kses_filter, wp_kses_post i wp_filter_post_kses mogą być bardzo łatwy sposób podpięte do standardowych filtrów.


add_filter('the_excerpt','wp_kses_post');

Powyższy linijka kodu spowoduje przefiltrowanie zawartości wypisu pod kontem obecności niedozwolonych kodów HTML. Zastosowanie takiego filtra ma sens jeżeli wypis jest w jakimś stopniu modyfikowany po ściągnięciu go z bazy danych ale przed wyświetleniem.

Domyślnie określone filtry z użyciem funkcji Ksesa w Wordpresie

WordPress standardowo dodaje trochę funkcjonalności w oparciu o Ksesa do filtrów pre_comment_content, title_save_pre, content_save_pre, content_filtered_save_pre. Ma to na celu przygotowanie komentarzy i wpisów do zapisania w bazie danych.


add_filter('pre_comment_content', 'wp_filter_kses');
add_filter('title_save_pre', 'wp_filter_kses');
add_filter('content_save_pre', 'wp_filter_post_kses');
add_filter('excerpt_save_pre', 'wp_filter_post_kses');
add_filter('content_filtered_save_pre', 'wp_filter_post_kses');

Wszystko funkcje odnoszące się do Ksesa w Wordpresie można znaleźć w pliku wp-includes/kses.php. Polecam tam zajrzeć w wolnej chwili.


Twój komentarz





Niektóre tagi XHTML są dozwolone
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>