Shortcode w komentarzach

Dziś krótko o problemie, który napotkałem ostatnio, gdy ktoś w komentarzu umieścił wycinek kodu. Ogólnie posiadam specjalny shortcode na to, a mianowicie [code], który załatwia mi sprawę struktury i kolorowania składni. Postanowiłem więc podmienić html-owskie <code> na wspomniany shortcode, ale okazało się, że nie udostępniłem dla niego wsparcia w komentarzach. Jak temu zaradzić?

Problem nie jest jakiś skomplikowany i wymaga od nas tylko paru linii kodu w function.php naszej skórki. Naturalną myślą było by dodanie specjalnego filtra, który zezwoli na używanie zdefiniowanych shortów w komentarzach:

add_filter('comment_text', 'do_shortcode');

Wadą tego rozwiązania jest to, iż daje on możliwość użycia każdego shordcode, który nasza skórka obsługuje, a przecież nie potrzebujemy ich wszystkich, tylko jak w moim przypadku ten generujący wycinek kodu. Zróbmy więc inaczej. Przygotujmy sobie funkcję, która dołączy nam te shortcode, które uznamy za potrzebne.

function init_comment_shortcodes() {
    remove_all_shortcodes();
    add_shortcode('code', 'generate_code');
    add_filter('comment_text', 'do_shortcode');
}

Działanie tej funkcji wygląda tak. Na początek usuwamy wszystkie shortcodes, następnie dodajemy te które chcemy używać w komentarzach i uruchamiamy filtr, o którym pisałem wyżej. Dodatkowo, aby to zadziałało, musimy jeszcze dodać jeden filtr, który w momencie generowania komentarzy wywoła nam powyższą funkcję:

add_filter('comments_template', 'init_comment_shortcodes');

I to wszystko. Oczywiście, jeżeli będziesz chciał używać więcej shortcodes w komentarzach to zamiast dodawać kolejne linijki w powyższej funkcji, lepiej zastanowić się nad wydzieleniem części wspólnej, czyli shortcodów używanych w postach i komentarzach do osobnej funkcji np:

function init_common_shortcodes() {
     add_shortcode('code', 'generate_code');
     add_shortcode('another', 'another_code');
}
function init_comment_shortcodes() {
    remove_all_shortcodes();
    init_common_shortcodes();
    add_filter('comment_text', 'do_shortcode');
}

Dzięki temu będziemy mieli większy porządek w kodzie unikają duplikacji funkcji add_schortcode().

P.S. jeżeli nie wiesz co to jest shorcode zapraszam do mojego wcześniejszego artykułu opisującego tą niezwykle pomocną funkcjonalność: link