PHPPamokos.lt


3. Įskiepio struktura ir vieta WordPress struktūroje

Kai įskiepius diegiate iš WordPress įskiepių katalogo, sistema juos automatiškai įrašo į reikalingą vietą WordPress katalogų sistemoje - wp-content/plugins katalogą. Kadangi mes savo įskiepį dar tik kuriame, mums reikalingą struktūrą teks susikurti patiems.

Pirmiausiai wp-content/plugins kataloge sukurkite naują katalogą. Pasirinkite tokį vardą, kokio dar nėra oficialiame WordPress įskiepių kataloge. Kaip tai patikrinti? Tiesiog pabandykite naršyklėje atsidaryti adresą http://wordpress.org/plugins/jusu_katalogo_pavadinimas. Jei gaunate žinutę „Whoops! We couldn't find that plugin.“, vadinasi viskas tvarkoje. Jei matote kažkokį įskiepį, galvokite kitą pavadinimą. Mūsų pavyzdinis įskiepis vadinasi tinyRelated, todėl sukuriame wp-content/plugins/tinyrelated katalogą.

Katalogo viduje sukurkite naują .php failą. Nors techniškai šis failas gali vadintis bet kaip, geriausiai jį pavadinti tokiu pat pavadinimu, kaip ir katalogas, pvz tinyrelated/tinyrelated.php. Tai bus pagrindinis jūsų įskiepio failas.

Įskiepio antraštė

WordPress įskiepius atpažįsta pagal vadinamasias „antraštes“ - specialiai suformuluotą komentarą .php failo pradžioje. Jis atrodo maždaug taip:

/*
Plugin Name: tinyRelated
Version: 0.1.0
Plugin URI: http://wordpress.org/plugins/tinyrelated/
Description: A tiny and simple related posts plugin.
Author: Arūnas Liuiza
Author URI: http://klausk.aruno.lt/
License: GPL2
*/

Privaloma informacija, kad įskiepis būtų atpažintas, yra tik įskiepio pavadinimas (Plugin Name). Kad veiktų automatinio atnaujinimo sistema, taip pat reikia nurodyti įskiepio versiją. Svarbu pasirinkti versijų numeravimo sistemą ir jos laikytis. Rekomenduoju A.B.C sistemą, kur A yra stambios versijos numeris (esminis atnaujinimas), B - mažosios versijos numeris (nauja ar iš esmės pakeista funkcija), o C - klaidų ir saugumo spragų ištaisymai. Pavyzdžiui mūsų kuriamas įskiepis prasidės nuo 0.1.0 versijos, sulig kiekviena pamoka augs mažosios versijos numeris (0.2.0, 0.3.0 ir pan.), o kai įskiepis bus parengtas publikavimui, persuksime ir didžiąją versiją į 1.0.0. Jeigu kurso metu pastebėsime kurioje nors iš versijų klaidą, pataisytas variantas bus 0.1.1, 0.1.2 ir pan.

Visa kita antraštėje pateikiama informacija yra skirta išsamesniam įskiepio atvaizdavimui įskiepių sąraše.

Licenzija

Įskiepio antraštėje reikėtų nurodyti ir jo licenzijos pavadinimą. Pats WordPress naudoja GPL2 licenziją, todėl jo įskiepiai taip pat turėtų naudoti GPL2, arba su ja suderinamą licenziją (http://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses).

Visas licenzijos tekstas paprtastai pateikiamas atskirame tekstiniame faile, license.txt, o įskiepio faile - štai toks trumpas pranešimas:

/*  Copyright METAI  ĮSKIEPIPO_AUTORIUS  (email : AUTORIAUS_EL_PAŠTAS)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as 
    published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

Struktūra

WordPress įskiepių sistema veikia taip - kiekvieną kartą užkraunant puslapį (tiek frontend, tiek wp-admin dalyje) visų aktyvuotų įskiepių pagrindiniai failai yra įtraukiami naudojant komandą include ir įvykdomi. Taip įvykdomos visos įskiepio faile esančios instrukcijos, o jo funkcijos tampa prieinamos tiek kitiems įskiepiams, tiek aktyvuotai išvaizdos temai.

Įskiepių failai yra įtraukiami ankstyvoje WordPress vykdymo stadijoje, todėl įskiepis gali nurodyti WordPress atlikti papildomus darbus atliekant įvairius standartinius veiksmus - skelbiant, vaizduojant įrašą ir pan. Tai daroma naudojant taip vadinamus kablius (hooks) - apie juos kalbėsime vėlesniuose skyriuose.

Kadangi tokiu būdu visos WordPress ir visų įskiepių funkcijos yra sumetamos į vieną bendrą katilą (vardų zoną), svarbu apsisaugoti nuo suderinamumo problemų, t.y. užtikrinti kad funkcijų, klasių ir kintamųjų vardai nesidubliuotų. Todėl visi viešai prieinami kintamųjų, funkcijų, klasių vardai turėtų prasidėti unikaliu prefiksu. Geriausiai - įskiepio pavadinimu, o jei šis labai ilgas - pavadinimo santrumpa.

Čia labai praverčia klasės. Jų naudojimas WordPress nėra privalomas, bet leidžia geriau sustruktūruoti kodą, pasirinkti, kuriuos metodus ir kintamuosius rodyti į išorę, o kuriuos palikti privačius.

Kai kurie nesudėtingi įskiepiai visi ir telpa į vieną failą, bet kai kodo padaugėja, atsiranda daugiau nei viena klasė, naudojamos papildomoms bibliotekos ir pan., atsiranda poreikis skaidyti savo kodą į atskiras dalis. Iš esmės programuotojas įskiepio kataloge yra pats sau šeimininkas, ir gali susidėlioti kokią tik nori struktūrą - nėra nei griežtų taisyklių, nei labai paplitusių rekomendacijų. Tik vienas patarimas - visus papildomus .php failus reikėtų kelti į sub-katalogus, nes pagrindiniame įskiepio kataloge esančius .php failus WordPress patikrina, ieškodamas įskiepio antraštės. Taip tiesiog sutaupysite kelias failų skaitymo operacijas.

tinyRelated v0.1.0

Taigi, metas pradėti konstruoti tinyRelated pirmąją versiją. Pilną jos kodą rasite čia, o mes aptarsime atskirus jo gabaliukus.

defined('ABSPATH') or die("No script kiddies please!");

Ši eilutė apsaugo nuo bandymo atidaryti failą tiesiogiai naršyklės lange - jį turėtų iškviesti tik WordPress. Tokia eilutė, su retomis išimtimis, turėtų būti kiekvieno .php failo, esančio įskiepio kataloge, pradžioje.

Toliau seka įskiepio klasė - tinyRelated, kuri šiuo metu turi tris elementus.

  public static $options = array(
    'general_count'  => 5,
  );

Nustatymų masyvą $options, kuriame kol kas yra tik vienas nustatymas - kiek susijusių įrašų rodyti;

  public static function build_list($post) {
    if (is_numeric($post)) {
      $post = get_post($post);
    }
    $posts = tinyRelated::get_list($post);
    $return .= '<h3>'.'Related posts'.'</h3>';
    $return .= '<ul class="tinyrelated">';
    foreach ($posts as $related_post) {
      if (is_numeric($related_post)) {
        $related_post = get_post($related_post);
      }
      if (!$related_post || $related_post->post_status != 'publish') {
        continue;
      }
      $return .= sprintf(
        '<li><a href="%1$s">%2$s</a></li>', 
        get_permalink($related_post),
        get_the_title($related_post)
      );
    }
    $return .= '</ul>';
    return $return;
  }

Atvaizavimo funkciją build_list(), kuri iš įrašų masyvo pagamina HTML sąrašą.

  public static function get_list($post) {
    if (is_numeric($post)) {
      $post = get_post($post);
    }
    $args = array(
      'post_type'       => $post->post_type,
      'post_status'     => 'publish',
      'posts_per_page'  => self::$options['general_count'],
      'orderby'         => 'rand',
    );
    $return = new WP_Query($args);
    return $return->posts;
  }
}

Ir pagalbinę funkciją get_list(), kuri sugeneruoja susijusių įskiepių sąrašą. Tiesa, kol kas susijusių įrašų atrinkimo algoritmas yra juokingai kvailas - tiesiog parenkami atsitiktiniai įrašai.

Išbandymas

Norėdami išbandyti, kaip veikia mūsų įskiepis, turime jį aktyvuoti (WP Admin > Plugins > tinyRelated > Activate). Tuomet tinkamoje išvaizdos temos vietoje, pavyzdžiui single.php faile, pagrindinio loop'o viduje, tuojaus po <?php the_content(); ?> (jeigu nežinote, kas yra WordPress loop'as, rekomenduoju plačiau pasiskaityti čia), reikia įterpti štai tokią eilutę:

<?php echo tinyRelated::build_list(get_the_ID()); ?>

Funkcija get_the_ID() gražina dabar vaizduojamo įrašo numerį, o build_list() - pagal šį numerį sugeneruotą susijusių įrašų sąrašą.

Dabar, atsidarius atskiro įrašo puslapį, WordPress po įrašo tekstu rodys 5 atsitiktinių įrašų antraščių sąrašą, su nuorodomis į tuos įrašus.

Ar galima būtų šį sąrašą įterpti nemodifikuojant išvaizdos temos failų? Taip, galima. Tam reikėtų pasinaudoti WordPress kablių (hooks) sistema, apie kurią plačiau ir kalbėsime kitoje pamokoje.



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