PHPPamokos.lt


12. Įskiepio diegimo ir šalinimo kabliai (hooks)

Namų darbai

tinyRelated v0.9.1 versijoje reikėjo atlikti dvi užduotis:

  • Parinkti tinkamesnį laukų atvaizdavimą nustatymams, vietoj text tipo lauko parenkant atitinkamai number, select ir checkbox laukus (pakeitimai tinyrelated.php failo 75-80, 84-91 bei 95,99 eilutėse). Visi reikalingi metodai tinyRelated_Options klasėje jau buvo, tiesiog reikėjo juos panaudoti.
  • Parašyti įvestų nustatymų tikrinimo funkciją validate() faile options.php (160-174 eilutės). Ši funkcija užtikrina, kad general_count visad būtų intervale [1;10], general_show reikšmė būtų 'before', 'after' arba false, o kitų dviejų nustatymų - tik true arba false.

Aktyvavimo, deaktyvavimo kabliai

Pamažu, bet užtikrintai artėjame prie įskiepio kūrimo pabaigos. Užtikrinus reikalingą funkcionalumą, laikas pasirūpinti, kad jūsų įskiepis sėkmingai įsijungtų pirmą kartą, o išjungus nepaliktų krūvos šiukšlių duomenų bazėje.

  • register_activation_hook( $file, $function );
  • register_deactivation_hook( $file, $function ).

register_activation_hook yra įvykdomas, kai vartotojas paspaudžia įskiepio aktyvavimo mygtuką. Tuoment WordPress užkrauna visus įskiepius, įvykdo aktyvavimo kablio funkciją ir perkrauna puslapį. Aktyvavimo kablyje įskiepiai įvykdo kodą, reikalingą pasiruošti darbui - įrašyti standartinius nustatymus, pridėti reikalingas DB lenteles ir pan.

Pavyzdys:

register_activation_hook( __FILE__, 'myplugin_activate' );
function myplugin_activate() {
  $defaults = array('option'=>'value','option2'=>'value2');
  add_option( 'myoption', $defaults );
}

register_deactivation_hook veikia taip pat, kaip ir aktyvavimo kablys, tik yra iššaukiamas paspaudus įskiepio deaktvyvavimo nurodą. Gera praktika reikalauja, kad įskiepiai apsivalytų po savęs - išjungiant įskiepį WordPress turėtų pradėti veikti taip, kaip veikė prieš jį įjungiant.

register_deactivation_hook( __FILE__, 'myplugin_deactivate' );
function myplugin_deactivate() {
  delete_option( 'myoption' );
}

Šalinimo kablys

Deaktyvuojant įskiepį šis tik pašalina savo funkcionalumą iš WordPress, tačiau įskiepio nustatymai ir įvairi meta informacija paprastai lieka duomenų bazėje, kad vėl įjungus įskiepį šis sėkmingai toliau dirbtų. Tačiau jei vartotojas tikrai nusprendė įskiepio nenaudoti, jis gali norėti panaikinti visus įskiepio duomenis. Tam naudojamas šalinimo kablys, kurio pagalba įskiepio kūrėjas gali ištrinti savo sukurtas lenteles, meta laukus, nustatymus ir kt. Šalinimo veiksmai gali būti atlikti dviem būdais:

  • register_uninstall_hook( $file, $callback );
  • uninstall.php failas.

register_uninstall_hook galima naudoti tik tuomet, jei pagrindiniame įskiepio faile tiesiogiai nevykdomas joks programinis kodas. T.y. yra tik klasės, funkcijos, add_action(), add_filter() bei register_*_hook() kreipiniai.

Pavyzdys:

register_uninstall_hook( __FILE__, 'myplugin_uninstall' );
function myplugin_uninstall() {
  global $wpdb;
  // delete plugin DB table
  $drop = "DROP TABLE {$wpdb->prefix}mytable";
  $wpdb->query( $drop );
  // delete options
  delete_option( 'myplugin_options' );
  // delete post meta data from all posts
  delete_metadata( 'post', null, 'my_meta_field', null, true );
  delete_metadata( 'post', null, 'my_other_meta_field', null, true );
  // delete user meta data
  delete_metadata( 'user', null, 'my_user_field', null, true );
}

Jei dėl vienų ar kitų priežasčių taip parašyti įskiepio neįmanoma, tuomet užuot naudojus register_uninstall_hook() reikėtų sukurti atskirą failą - uninstall.php, kuriame būtų aprašyti tik išdiegimo veiksmai. Pavyzdys:

<?php
//if uninstall not called from WordPress exit
if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) 
    exit();
global $wpdb;
$drop = "DROP TABLE {$wpdb->prefix}mytable";
$wpdb->query( $drop );
// delete options
delete_option( 'myplugin_options' );
// delete post meta data from all posts
delete_metadata( 'post', null, 'my_meta_field', null, true );
delete_metadata( 'post', null, 'my_other_meta_field', null, true );
// delete user meta data
delete_metadata( 'user', null, 'my_user_field', null, true );
?>

dbDelta

Šiaip aš nesu didelis WordPress duomenų bazės modifikavimo mėgėjas ir stengiuosi įskiepius rašyti taip, kad išnaudočiau esamas jos galimybes, tačiau kartais kito pasirinkimo nelieka. Tuo atveju atskiro paminėjimo verta dbDelta($sql) funkcija. Ji skirta saugiam WordPress duomenų bazės struktūros atnaujinimui.

Pavyzdžiui:

function jal_install() {
    global $wpdb;

    $table_name = $wpdb->prefix . 'liveshoutbox';

    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
        name tinytext NOT NULL,
        text text NOT NULL,
        url varchar(55) DEFAULT '' NOT NULL,
        UNIQUE KEY id (id)
    ) $charset_collate;";

    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
}

Be jau minėtos dbDelta() funkcijos, aukščiau esančiame pavyzdyje reikėtų atkreiptį dėmesį ir į $wpdb klasę - WordPress interfeisą darbui su duomenų baze, o taip pat, kad prie lentelės pavadinimo visuomet reikėtų nepamiršti pridėti standartinio prefikso ($wpdb->prefix).

tinyRelated v0.10.0

Štai pasiekėme jau 10-ąją mūsų įskiepio vesiją. Kai yra daug smulkių patobulinimų, mažosios versijos skaičius gali perkopti 9, tačiau tai nereiškia, kad didinsime didžiosios versijos numerį. Didžiosios versijos turėtų būti rezervuotos tikrai dideliems, esminiams atnaujinimams, o šis tikrai toks nėra. Todėl ši versija bus v0.10.0.

Pridėjome du kablius - aktyvavimo ir deaktyvavimo. Pirmasis (31 eilutė bei 47-49 eilutės) tiesiog patikrina, ar įskiepis jau turi išsaugotus nustatymus, ir, jei ne, įrašo standartinius nustatymus į duomenų bazę.

Tuo tarpu deaktyvavimo kablys (33 eilutė ir 51-53 eilutės) šiuos nustatymus panaikina.

Namų darbai

Deaktyvavimo kablį tinyRelated įskiepyje pakeiskite šalinimo kabliu. Šalinant įskiepį reikėtų ne tik panaikinti nustatymus, o taip pat - visus įskiepio sukurtus meta laukus - _tinyrelated_*.



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