PHPPamokos.lt


4. Veiksmų ir filtrų kabliai (hooks)

Yra 4 pagrindiniai būdai, kuriais WordPress įskiepis gali įtakokti WordPress sistemos veikimą, išvesti savo rezultatus ir pridėti naują funkcionalumą:

  1. Veiksmų ir filtrų kabliai (hooks)
  2. Redaktoriaus žymos (shortcodes)
  3. Skydeliai (widgets)
  4. Šablono žymos (template tags)

Visus juos aptarsime ir išbandysime šio kurso eigoje, o tuo tarpu pradėkime nuo pirmojo - vadinamųjų kablių (hooks).

Praėjusios temos pabaigoje užsiminiau, kad nebūtinai reikia pridėti papildomą kodą į išvaizdos temos failus, kad būtų galima pamatyti įskiepio rezultatą. Pasitelkus veiksmų ir filtrų kablius, įskiepis savo rezultatus gali išvesti visiškai nemodifikuojant jokio kito (išvaizdos temos ar WordPress šerdies) kodo.

Kas yra tie kabliai?

WordPress sistemos kodas yra parašytas taip, kad kone kiekviename programos vykdymo etape įskiepių kūrėjas turi galimybę 'prikabinti' ir įvykdyti papildomą programinį kodą, reikalingą to įskiepio veikimui.

Kalbant žmonių kalba, įskiepio kūrėjas gali WordPress sistemai duoti, pavyzdžiui, tokias komandas:

  • Kai įkelsi visus įskiepius, parašyk - „Visi įskiepiai įkelti“;
  • Kai generuosi <title> elementą, greta parašyk (c) Petras Petraitis
  • Kai rodysi straipsnio antratštę, tekstą [FOTO] pakeisk į fotoaparato paveikslėlį.
  • ir pan.

Kabliai WordPress sistemoje yra skirstomi į dvi rūšis - veiksmo kablius ir filtrus. Kaip sako pavadinimas, veiksmo kabliai tiesiog pasirinktu WordPress veikimo metu įvykdo papildomą veiksmą (funkciją), tuo tarpu filtrų pagalba galima modifikuoti kažkokius WordPress sugeneruotus duomenis (straipsnio pavadinimą, tekstą, paveikslėlio adresą, ir pan.).

Veiksmai prie kablių yra prikabinami funkcijų add_action() bei add_filter() pagalba:

add_action( $kablio_vardas, $funkcija, $prioritetas = 10, $argumentu_skaicius = 1 );
add_filter( $kablio_vardas, $funkcija, $prioritetas = 10, $argumentu_skaicius = 1 );

Pavyzdžiui šis kodo gabaliukas WordPress tinklalapio <head> dalyje išspausdins autoriaus meta žymą:

add_action('wp_head','tinyrelated_head');
function tinyrelated_head() {
    echo '';
}

Šis - pačioje tinklalapio pabaigoje ( prieš </body>) išspausdins pastraipą su tekstu „Pabaiga“:

add_action('wp_footer','tinyrelated_pabaiga');
function tinyrelated_pabaiga() {
    echo '<p>Pabaiga</p>';
}

O šis filtras - kiekvieno straipsnio pavadinimo pradžioje pridės tekstą 'ABC':

add_filter('the_title','tinyrelated_abc');
function tinyrelated_abc($title) {
    return 'ABC'.$title;
}

PASTABA. Atkreipkite dėmesį - veiksmo kablyje funkcija savo rezultatą spausdina, tuo tarpu filtre - grąžina tolimesniam apdorojimui.

Kablių pavadinimai

Kablio pavadinimas - tekstinis konkretaus veiksmo/filtro identifikatorius. Pagal jį atrenkama, kuriuo WordPress vykdymo momentu prikabinta funkcija bus įvykdoma.

WordPress vidinių kablių yra labai daug (3.9 versijoje jau buvo daugiau nei 1600), todėl labai retai pavyksta užtikti tokią WordPress veikimo vietą, kurios nebūtų įmanoma modifikuti kablių pagalba. Perfrazuojant populiarų Apple reklaminį šūkį - „there is a hook for that“.

Pagrindinis iššūkis - tą reikiamą kablį atrasti. Labai parankų populiarių kablių sąrašą galima rasti WordPress dokumentacijoje (veiksmai ir filtrai), o naujame WordPress kodo žinyne yra patogi paieškos tarp kablių funkcija. Žinoma, patikimiausias būdas - tiesiog nueiti į atitinkamą WordPress kodo vietą ir susirasti reikiamą kablį. Bet tam reikia būti gerai susipažinus su WordPress kodo struktūra ir nepasiklysti tarp daugybės WordPress šerdies kodo failų.

Svarbu žinoti, kuris kablys po kurio yra įvykdomas. Pavyzdžiui, plugins_loaded įvyksta anksčiau už init, o wp_head - anksčiau už wp_footer. Su tipinių veiksmo kablių vykdymo eilės tvarka galima susipažinti veiksmo kablių dokumentacijoje.

Prikabinama funkcija

Antrasis add_action/add_filter parametras nurodo, kokią funkciją WordPress turi įvykdyti. Šios funkcijos iškvietimui WordPress naudoja PHP call_user_func() funkciją. Toliau pateiksiu kelis pavyzdžius, kaip gali atrodyti šio parametro reikšmės - jos turi atitikti PHP callable tipą.

// paprasta funkcija
add_action( 'init', 'mano_funkcija' );
// statinis klasės metodas
add_action( 'init', array( 'ManoKlase', 'mano_funkcija' ) );
add_action( 'init', array( 'ManoKlase::mano_funkcija' ) );
// dinaminis klasės metodas
add_action( 'init', array( $mano_klase, 'mano_funkcija' ) );

Prioritetai

Kai prikabintų funkcijų yra daug, tampa svarbi eilės tvarka, kuria toks funkcijos atėjus metui bus įvykdytos. Pagal nutylėjima WordPress prikabintas funkcijas vykdo ta pačia eilės tvarka, kuria jos buvo prikabintos. Pavyzdžiui, jei veiksmus prikabinome štai taip:

add_action('init','funkcija1');
add_action('init','funkcija2');
add_action('init','funkcija3');

jos ir bus įvykdytos ta eilės tvarka - funkcija1(), funkcija2(), funkcija3(). Jeigu reikia šią tvarką pakeisti, galima naudoti papildomą prioriteto argumentą. Kuo didesnį skaičių ten nurodysite, tuo vėliau funkcija bus įvykdyta. Pavyzdžiui, prikabinus funkcijas taip:

add_action('init','funkcija1',100);
add_action('init','funkcija2',9);
add_action('init','funkcija3',9);
add_action('init','funkcija4',15);
add_action('init','funkcija5');

funkcijų vykdymo eilės tvarka bus tokia - funkcija2(), funkcija3(), funkcija5(), funkcija4(), funkcija1(). Kai kelių funkcijų prioritetas sutampa, jos vykdomos pagal pridėjimo eilę, o kai prioritetas nenurodomas, numatytoji jo reikšmė yra 10.

Argumentų skaičius

Ketvirtasis add_action/add_filter parametras - argumentu_skaicius pažymi, kiek argumentų tikisi gauti prikabinama funkcija. Filtravimo funkcijoms visuomet perduodamas bent vienas argumentas (filtruojama), o veiksmų funkcijoms argumentų gali ir nereikėti. Kiek argumentų gali būti pateikta funkcijai - priklauso nuo konkretaus kablio.

Pavyzdžiai:

add_action('init','be_argumentu',10,0);
function be_argumentu() {...}

add_action('init','trys_argumentai',10,3);
function trys_argumentai($a,$b,$c) {...}

add_filter('the_title','filtras',10,1);
function filtras($ka_filtruoti) {...}

Pavyzdys

Dabar - platesnis praktinis kablio panaudojimo pavyzdys „iš gyvenimo“. Tarkime, kad kuriame naujienų portalą ir norime tam tikras raktines frazes ([FOTO], [VIDEO] ir pan.) straipsnių antraštėse automatiškai pakeisti atitinkamais paveikslėliais. Be to, mes norime būti modernus ir naudoti ne paprastus paveikslėlius, o ikonų šriftą FontAwesome.

Taigi, mums reikės atlikti du veiksmus:

  • pridėti papildomą CSS failą;
  • modifikutoi straipsnio antraštę

Pirmiausiai - FontAwesome. Papildomiems stiliams pridėti WordPress naudojama funkcija wp_enqueue_style(), o kad ji būtų įvykdyta tinkamu metu, reikia naudoti wp_enqueue_scripts kablį. Štai taip:

add_action( 'wp_enqueue_scripts', 'mano_fontawesome' );
function mano_fontawesome(){
  wp_enqueue_style( 'fontawesome', '//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css' );
}

Šiuo atveju FontAwesome įkeliame iš CDN, bet lokaliems failams procedūra yra tokia pati.

Toliau - raktažodžių keitimas į HTML elementus. Čia mums į pagalbą ateis ankstesniuose pavyzdžiuose jau minėtas the_title filtras:

add_filter('the_title','mano_ikonos');
function mano_ikonos($title) {
  $replace = array(
    '[FOTO]' => '<i class="fa fa-camera"></i>',
    '[VIDEO]' => '<i class="fa fa-video-camera"></i>',
    '[MUZIKA]' => '<i class="fa fa-music"></i>'
  );
  $title = str_replace( array_keys( $replace ), $replace, $title );
  return $title;
}

Šiuos du kodo gabaliukus įdėkite į savo įskiepį arba išvaizdos temos functions.php failą ir naudokitės. Viskas.

Naujų kablių kūrimas

Jeigu norite savo įskiepiui/išvaizdos temai suteikti papildomo lankstumo, galite juose pridėti papildomų naujų kablių, kuriuos kiti programuotojai galės panaudoti pritaikydami jūsų produktą savo poreikiams. Tam naudojamos tokios funkcijos:

// veiksmo kablio sukūrimas
do_action( 'mano_veiksmas', $argumentas1, $argumentas2 ... );
// filtro kablio sukūrimas
$kintamasis = apply_filters( 'mano_filtras',$kintamasis, $argumentas1, $argumentas2 ... );

Dabar kiti programuotojai (arba jūs pats) gali prikabinti prie jūsų kodo papildomas funkcijas:

add_action( 'mano_veiksmas', 'papildomas_veiksmas' );
add_filter( 'mano_filtras', 'papildomas_filtras' );

tinyRelated v0.2.0

Susipažinus su kabliais, laikas patobulinti tinyRelated. Padarykime, kad susiję įrašai būtų automatiškai pridedami straipsnio pabaigoje, o išvaizdos temų kūrėjai galėtų pritaikyti sąrašo HTML kodą prie savo poreikių.

Pasikeitimai:

  • Papildomas nustatymas general_show_after (38 eilutė) - tam kad galėtume lengvai įjungti/išjungti automatinį sąrašo pridėjimą;
  • Naujas metodas append_list() (42-51 eilutė) - sugeneruoto sąrašo pridėjimas prie įrašo turinio;
  • append_list() metodo prikabinimas prie the_content veiksmo kablio (31 eilutė);
  • 4 nauji filtrai generuojamo sąrašo HTML kodui:
    • tinyrelated_list_title - sąrašo antraštė;
    • tinyrelated_list_start - sąrašo pradžia;
    • tinyrelated_list_item - sąrašo punktai;
    • tinyrelated_list_end - sąrašo pabaiga.

Dabar tinyRelated veiks be jokių pakeitimų išvaizdos temos kode, o išvaizdos temos kūrėjas galės modifikuoti įskiepio generuojamą HTML kodą - pvz pakeisti <ul> į <ol>, nuorodoms pridėti target="_blank" ir pan.

Visas įskiepio 0.2.0 versijos kodas yra čia.

Namų darbas

Atėjo metas namų darbui - pabandkykite tinyRelated modifikuoti patys.

  1. Pataisykite append_list() taip, kad nustatymo pagalba būtų galima pasirinkti, ar sąrašą pridėti straipsnio pradžioje, ar pabaigoje;
  2. Pridėkite naują kablį į get_list() metodą, kuris leistų pataisyti susijusių straipsnių masyvą prieš jį grąžinant.

Jeigu kiltų neaiškumų - klauskite. O kitos pamokos pradžioje aptarsime, kaip tai reikėjo padaryti.



(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com