Chwila przerwy od Javy. Post miał iść oryginalnie 1 kwietnia, ale jak sami rozumiecie nie wyglądało by to najlepiej.

Co chcemy napisać

Plugin będzie dodawać kilka przydatnych przycisków w tekstowym (HTML-owym) edytorze wordpressa. Jak zacząłem ostatnio cisnąć posty to odkryłem, że jednak fajnie mieć kilka przycisków, które będą stawiać szablony do edytora. WordPress posiada własny mechanizm do robienia tego typu akcji. Rozszerzmy go zatem.

Przygotowanie pluginu

Na serwerze tworzymy w katalogu wp-content/plugins tworzymy sobie katalog additional\_buttons i w nim plik additional\_buttons.php. W piku musimy umieścić odpowiedni komentarz tak by mechanizm WordPressa rozpoznał, że ma do czynienia z pluginem.

Listing 1. Plik wyjściowy

<?php
/**
 * @package Additional_Buttons
 * @version 1.0
 */
/*
Plugin Name: Additional Buttons
Plugin URI: http://koziolekweb.pl
Description: This is simple plugin that adds some buttons to text editor
Author: Bartek "Koziolek" Kuczyński
Version: 1.0
Author URI: http://koziolekweb.pl/
*/
?>

Następnie musimy stworzyć funkcję, nazwijmy ją additional\_buttons, która będzie „mięskiem” naszego pluginu. Sama funkcja to nie wszystko. WordPress posiada mechanizm „hooków”, po ludzku zaczepów, który pozwala na kontrolowanie kiedy nasza funkcja zostanie wywołana. W ogromnym uproszczeniu działa on w następujący sposób.
Jeżeli proces generowania strony przedstawimy jako uporządkowaną listę, gdzie uporządkowanie jest równoważne z generowaniem kolejnych elementów strony jak head, meta, body itp. to w momencie generowania danego elementu na liście mamy sobie listę funkcji do wywołania w czasie tego kroku. Bardzo prosty mechanizm pozwalający na rozszerzanie całego silnika w dowolnym punkcie za pomocą zarejestrowania swojego kodu w danym zaczepie. BTW, można by kiedyś spróbować PoC aplikacji javowej napisanej w ten sposób.
Zatem poza funkcją musimy dopisać się do jakiegoś zaczepu.

Listing 2. Zarejestrowanie naszej funkcji

<?php
function additional_buttons() {
}

add_action( 'admin_print_footer_scripts', 'additional_buttons' );
?>

Oznacza to mniej więcej tyle, że nasza funkcja zostanie odpalona w momencie generowania stopki panelu administratora, a dokładniej w miejscu, w którym chcemy mieć zgrupowane wszystkie skrypty.

Mięsko

Wyobraźcie sobie takiego fest kurczaka, napakowanego antybiotykami, sterydami i generalnie po sześciu tygodniach będzie z niego obiadek dla jakiegoś suchoklatesa (w myśl zasady kurczak, ryż i kreatyna zrobi z ciebie skurwysyna). I teraz wyobraźcie sobie, że pan Franio hodowca coś popieprzył i nasz kurczak awansował na kurę nioskę. Macie? I teraz złożył jajko, które to jajko trafiło do lodówki naszego suchoklatesa… i lekko się zaśmierdło… Teraz na to jajko naklejamy nalepkę PHP.

Sorry, ale php jako język ma w sobie to coś co powoduje, że jak poznałem go z 12 lat temu to poza sytuacjami krytycznymi nie dotykam.

No ale do mięska. Powyższy opis miał was przygotować na szokowe zetknięcie z poniższym kodem:

Listing 3. Nasz wspaniały plugin

<?php
function additional_buttons() {
  if (wp_script_is('quicktags')){
?>
    <script type="text/javascript">
    QTags.addButton( 'eg_paragraph_listing', 'listing', '<p class="listing"></p>', '', '', 'Paragraph with listing tag', 110 );
    QTags.addButton( 'eg_pre', 'java', '<pre class="java" name="code">', '', '', 'Java listing tag', 111 );
    QTags.addButton( 'eg_samp', 'samp', '<samp>', '</samp>', '', 'Samp tag', 112 );
    QTags.addButton( 'eg_h4', 'h4', '<h4>', '</h4>', '', 'H4 tag', 113 );
    </script>

<?php
  }
}

add_action( 'admin_print_footer_scripts', 'additional_buttons' );
?>

Jeżeli istnieje skrypt quicktags, to odpalamy generowanie dodatkowych przycisków. Szczegóły w dokumentacji, link powyżej. Ja dodałem tu coś co pozwala mi na przygotowanie za pomocą szablonu listingów, śródtytułów oraz oznaczanie fragmentów kodu w tekście za pomocą samp. Jak potrzeba więcej to proszę się zbytnio nie krępować (szkoda sznurka, a i na BSDM jest miejsce gdzie indziej).

Na koniec mała uwaga. QTags posiada też inną wersję z tylko trzema parametrami gdzie ostatni to funkcja zwrotna. Na razie tego nie potrzebowałem, ale warto pamiętać, że istnieje możliwość użycia tego typu konstrukcji.