PHPPamokos.lt


5. Papildomi laukai (custom fields)

Namų darbai

Pirmiausiai - apie namų darbus. Kaip ir žadėjau, pateikiu pataisytą, v0.2.1 tinyRelated versiją.

Primąjai užduoties daliai reikėjo pakeisti vieno iš nustatymų (38 eilutė) duomenų tipą iš boolean į string, nes nuo šiol jis turės tris galimas reikšmes: 'before', 'after' ir false. Taip pat buvo pakeistas šio nustatymo pavadinimas (iš general_show_after į general_show), kad geriau atitiktų naująjį turinį.

Pakeitimai append_list() metode atspinidi pasikeitusį nustatymo pavadinimą (44 eilutė) ir atsiradusią papildomą sąlygą (47-54 eilutė) - patikrinimą, kur pridėti sugeneruotą sąrašą.

Antroji užduoties dalis įgyvendinta iš esmės vienos eilutės pridėjimu - 98 eilutėje atsirado kreipinys į funkciją apply_filters(), kuri leis išvaizdos/temų kitų įskiepių kūrėjams filtruoti sugeneruotus susijusius įrašus.

Papildomi laukai

O dabar - apie šios dienos temą. Daugeliui įskiepių reikia kažkur išsaugoti savo veikimo rezultatus arba vartotojo įvestus ir jų veikimui reikalingus papildomus duomenis. Įskiepio kūrėjas gali pasirinkti - pasinaudoti esama WordPress duomenų bazės struktūra, arba ją modifikuoti. Aš pats esu linkęs prie DB struktūros nagų nekišti, ir, esant galimybei, geriau naudotis standartiniais WordPress suteikiamais metodais:

  • Papildomų laukų API
  • Nuostatų / transient'ų API

Pastaba. Jeigu vistik reikia dirbti su duomenų baze, būtinai naudokitės $wpdb klase ir nesijunkite į MySQL tiesiogiai.

Apie nuostatų API kalbėsime vėliau, kai savo įskiepiui kursime nustatymų langą, o dabar aptarkime kitą native duomenų saugojimo API - papildomus laukus, angliškai žinomus kaip custom fields arba post/user meta. Dauguma informacijos apie turinį (įrašai, puslapiai, CPT, įkelti dokumentai, navigacijos meniu punktai) WordPress sistemoje yra saugoma wp_posts lentelėje. Papildomų laukų API pagalba kiekvienam tokiam įrašui galima pridėti meta informacijos.

Papildomų laukų API veikia labai paprastai. Iš esmės tėra keturios pagrindinės funkcijos, atliekančios keturias pagrindines duoemų valdymo operacihjas

add_post_meta    ( $post_id, $meta_key, $meta_value, $unique = false );
update_post_meta ( $post_id, $meta_key, $meta_value, $prev_vaule =  '' );
detete_post_meta ( $post_id, $meta_key, $prev_value = '' );
get_post_meta    ( $post_id, $meta_key, $meta_value, $single = false );

Funkcija update_post_meta() automatiškai iškviečia add_post_meta(), jeigu bandomas atnaujinti meta laukas neegzistuoja, todėl neretai update_post_meta() yra naudojama tiek įrašant naują meta lauką, tiek jo duomenis atnaujinant.

Argumentai:

  • $post_id - įrašo, kuriam priskiriamas meta laukas, ID
  • $meta_key - meta lauko raktas (iki 255 simbolių). Jeigu add_post_meta() komandoje nepažymimas $unique argumentas, galimi keli meta įrašai su tuo pačiu meta raktu.
  • $meta_value - meta lauko reikšmė, duomenų bazėje saugoma longtext duomenų lauke, taigi viename meta lauke galima išsaugoti labai daug duomenų. Jeigu $meta_value perduosite masyvą, o ne string tipo kintąmajį, išsaugant jis bus automatiškai serializuotas, o iškvietus get_post_meta() - automatiškai išserializuotas atgal į masyvą.
  • $unique - jei true, į duomenų bazę bus įrašomas tik vienas meta laukas su tokiu meta raktu;
  • $prev_value - kai duomenų bazėje yra daugiau nei vienas laukas su tuo pačiu meto raktu, atnaujinant/ištrinant reikia nurodyti buvusią lauko reikšmę, kad būtų atnaujinti/ištrinti teisingo lauko duomenys.
  • $single - standartiškai get_post_meta gražina atsakymą masyve. Jei žinote, kad išsaugota tik viena lauko su nurodytu raktu reikšmė, nustačius true, bus gražinama iš karto viena reikšmė.

Pavyzdžiai

Unikalus meta laukas

// sukuriamas meta laukas `vardas` įrašui su ID=5
add_post_meta( 5, 'vardas', 'Petras', true );
// `vardas` keičiamas į 'Jonas'
update_post_meta( 5, 'vardas', 'Jonas' );
// gaunama meta lauko `vardas` reikšmė
$vardas = get_post_meta( 5, 'vardas', true);
// vardas='Jonas'

Meta laukas su keliomis reikšmėmis

// sukuriamas meta laukas `vardas` įrašui su ID=5
add_post_meta( 5, 'vardas', 'Petras');
// sukuriamas antras meta laukas `vardas` įrašui su ID=5
add_post_meta( 5, 'vardas', 'Jonas');
// `vardas` 'Jonas' keičiamas į 'Kazys'
update_post_meta( 5, 'vardas', 'Kazys', 'Jonas' );
// gaunamos visos meta lauko `vardas` reikšmės
$vardas = get_post_meta( 5, 'vardas' );
// vardas=array( 'Petras', 'Kazys' )

Vartotojo sąsaja (WP-Admin)

Pagal nutylėjimą WP Admin panelėje papildomų laukų sąsaja yra paslėpta. Ją pamatyti galima įrašo redagavimo lango dešiniame viršutiniame kampe išskeidus Screen Options meniu ir uždėjus varnelę prie Custom Fields (Screen Options yra labai patogus, bet šiek tiek mažai žinomas įrankis, kurio pagalba galima paslėpti parodyti daug naudingų WP admin įrankių, pvz pakoreguoti įrašų skaičių WP Admin lango puslapyje).

Papildomų laukų valdymo sąsajos įjungimas

Pažymėjus šią varnelę įrašų redagavimo lange atsiranda naujas skydelis - „Custom fields“. Jame galima redaguoti, naikinti esamus ir pridėti naujus meta laukus. Šiuo metu pavyzdyje matote, kad yra pridėtas vienas meta laukas - tinyrelated_list - su reikšme 1,2,3.

Papildomų laukų valdymo skydelis

Paslėpti laukai

Reikėtų pastebėti, kad šiame skydelyje matomi tik tokie meta įrašai, kurių reikšmės yra tekstinės arba skaitinės - serializuoti masyvai yra automatiškai išfiltruojami. Tai - tam tikras saugumo mechanizmas. Rankiniu būdu redaguojant serializuotus duomenis, labai lengva juos sugadinti, todėl tokių laukų valdymas paliekamas programinėms priemonėms, o ne vartotojo sąsajai.

Paprastai įskiepiai sukuria savas vartotojo sąsajos priemones meta laukų reikšmių valdymui. Tokiu atveju jas reikia paslėpti iš standartinio papildomų laukų valdymo skydelio, net jei jų reikšmės ir yra tekstinės/skaitinės. Tuomet naudojamas kitas paprastas būdas paslėpti meta lauką iš vartotojo sąsajos - pradėti jo pavadinimą brūkšneliu apačioje (underscore): '_tinyrelated'. Tokio lauko eilinis vartotojas taip pat nematys ir negalės redaguoti rankiniu būdu.

Vartotojų / taksonomijų meta laukai

Panašiai, kaip ir įrašams, papildomus laukus galima pridėti ir WordPress vartotojams:

add_user_meta    ( $user_id, $meta_key, $meta_value, $unique = false );
update_user_meta ( $user_id, $meta_key, $meta_value, $prev_vaule =  '' );
detete_user_meta ( $user_id, $meta_key, $prev_value = '' );
get_user_meta    ( $user_id, $meta_key, $meta_value, $single = false );

Tiek naudojimas, tiek argumentai yra tokie patys, kaip ir įrašų atveju. Vienintelis skirtumas - WordPress WP admin skydelis neturi standartinės sąsajos šių laukų redagavimui - viską reikia daryti programiniu būdu.

Deja, WordPress neturi galimybės meta laukus pridėti taksonomijoms (kategorijoms, žymoms ir kt.). Apie tai diskutuojama jau 5 metus, tačiau kol kas vienintelis būdas meta informaciją prikabinti prie taksonomijų yra tam skirti įskiepiai.

tinyRelated v0.3.0

Metas mūsų įskiepyje skirti dėmesio tam, kokie įrašai rodomi susijusių įrašų sąraše. Iki šiol ten buvo rodomi tiesiog atsitiktiniai įrašai, o dabar suteiksime šiek tiek kontrolės vartotojui. tinyRelated v0.3.0 versijoje visi pakeitimai - get_list() metode. 90-97 eilutėje (+ sąlygos užbaigimo skliaustas 106 eilutėje) atsiranda nauja sąlyga. Dabar ši funkcija pirmiausiai patikrina, ar nėra meta lauko su išsaugotu susijusių įrašų sąrašu (tinyrelated_list). Jeigu yra - grąžina šį sąrašą, jei ne - generuoja atsitiktinius įrašus.

Įrašų sąrašas meta lauke yra saugomas kableliu atskirtų ID sąrašo pavidalu. Tam, kad šis laukas pasirodytų vartotojo sąsajoje ir galėtų būti redaguojamas paprastų vartotojų.

Namų darbas

  1. Patobulinti tinyRelated v0.3.0, pridedant papildomą meta lauką tinyrelated_hide. Jei šiame lauke nustatyta reikšmė true, susijusių įrašų sąrašas neturėtų būti rodomas, nepriklausomai nuo kitų įskiepio nustatymų.
  2. Patobulinti tinyRelated v0.3.0, pridedant papildomą meta lauką tinyrelated_count. Jeigu jame nustatytas už nulį didesnis skaičius, rodyti būtent tiek susijusių straipsnių prie to įrašo.


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