02 β Lokal muhit va asboblar¶
β¬ οΈ Oldingi: 01 β WordPress arxitekturasi va plugin falsafasi Β· π README Β· Keyingi: 03 β Birinchi plugin: tuzilish va hayot sikli β‘οΈ
Bu bobda: plugin yozish uchun professional lokal muhit quramiz β nega jonli saytda eksperiment qilmaslik kerakligidan boshlab,
wp-env(rasmiy, Docker asosidagi asbob), Local, sof Docker va MAMP/XAMPP variantlarini taqqoslaymiz;.wp-env.jsonconfig, portlar va tozalashni o'rganamiz; WP-CLI (wp) bilan saytni terminal orqali boshqaramiz;WP_DEBUG/WP_DEBUG_LOG/SCRIPT_DEBUGdebug rejimi vadebug.logni sozlaymiz, Query Monitor bilan ko'ramiz; plugin papkasini symlink bilan ulaymiz va VS Code + Intelephense + Xdebug ni qisqacha sozlaymiz β shu bilan keyingi boblardagi har bir misolni o'z mashinangizda xavfsiz sinaydigan holatga kelamiz.
Muammo: nega jonli saytda kod yozib bo'lmaydi¶
Tasavvur qiling: mijozning ishlab turgan do'koni bor, har kuni buyurtmalar tushadi. Siz "kichik" plugin qo'shasiz, bitta nuqtali vergulni unutasiz β va butun sayt oq ekran (white screen of death) bo'lib qoladi. Mijoz pul yo'qotadi, siz esa tunda telefon ko'taradigan odamga aylanasiz.
Jonli (production) sayt β eksperiment maydoni emas. Plugin ishlab chiqishda sizga shunday muhit kerakki, unda:
- xato qilsangiz hech kim ko'rmaydi va hech narsa yo'qolmaydi;
- xatolarni to'liq ko'rasiz (jonli saytda ular yashiriladi);
- WordPress va PHP versiyasini xohlaganingizcha o'zgartirasiz;
- saytni bir komanda bilan ko'tarib, buzilsa bir komanda bilan noldan tiklaysiz.
Bu β lokal muhit: o'z kompyuteringizda ishlaydigan, internetga ulanmagan, faqat sizniki bo'lgan WordPress. Bu bobda uni quramiz.
π Oltin qoida. Kod avval lokalda yoziladi va sinaladi, keyin staging (sinov nusxasi), keyingina production. Plugin'ni to'g'ridan-to'g'ri jonli saytga "tahrirla va saqla" qilish β havaskorlik belgisi.
Variantlar: qaysi muhitni tanlash¶
Lokal WordPress ko'tarishning to'rtta asosiy yo'li bor. Hammasi ishlaydi, lekin plugin ishlab chiqish uchun bittasi ayniqsa qulay.
| Variant | Asos | Talab | Kuchli tomoni | Kim uchun |
|---|---|---|---|---|
@wordpress/env (wp-env) |
Docker | Docker + Node/npm | Rasmiy, .wp-env.json versiyaga kiradi, dev+tests sayt, takrorlanadi |
Plugin dev (afzal) |
| Local (Flywheel) | Docker (yashirin) | Yo'q (o'zida) | Grafik, "klik bilan sayt", SSL/mail tayyor | Boshlovchi, dizayner |
| Sof Docker compose | Docker | Docker + YAML | To'liq nazorat, istalgan xizmat | Murakkab stek kerak bo'lsa |
| MAMP / XAMPP | Apache+MySQL+PHP | Yo'q | Docker shart emas | Eski uslub, sodda saytlar |
Biz wp-env ni tanlaymiz, chunki:
- Uni rasmiy WordPress jamoasi ishlab chiqaradi va Gutenberg, keyingi boblardagi blok asboblari bilan bir xil oilada.
- Konfiguratsiya
.wp-env.jsonfaylida bo'ladi β uni Git'ga qo'shsangiz, jamoadagi har kim aynan bir xil muhitni bir komanda bilan oladi. - U sizga ikkita sayt beradi: ishlash uchun (dev) va avtomatik testlar uchun (tests) β bu 25-bobda kerak bo'ladi.
π‘ Agar Docker o'rnatishni xohlamasangiz yoki terminaldan qo'rqsangiz β Local dan boshlang, u grafik va juda oson. Kitobdagi tushunchalar (debug, WP-CLI, plugin papkasi) hamma muhitga bir xil tegishli; faqat saytni ko'tarish usuli farq qiladi.
β οΈ wp-env, Local va Docker compose β uchchalasi ham Docker ga tayanadi. Avval Docker Desktop o'rnatib, uni ishga tushiring (daemon yoqilgan bo'lsin), aks holda wp-env start "cannot connect to Docker" xatosi beradi.
wp-env: bir komanda bilan WordPress¶
βΉοΈ Halol eslatma. Quyidagi
wp-env/wpbuyruqlari ishlash uchun mashinangizda Docker ishga tushgan bo'lishi shart. Bu bob buyruqlarni va ularning natijasini o'z mashinangizda (illustrativ) bajarishingizni nazarda tutadi; men bu yerda soxta chiqindi yozmayman β natijani o'zingiz ko'rasiz.
Talablar¶
- Docker Desktop β o'rnatilgan va ishlab turgan.
- Node.js + npm β
wp-envNode paketidir. (Node yangi bo'lsa, JavaScript kitobiga qarang.)
Tekshiring:
Ishga tushirish¶
Eng tez yo'l β global o'rnatmasdan, npx bilan:
Yoki global o'rnatib, qisqa wp-env komandasidan foydalaning (rasmiy hujjat shu yo'lni ko'rsatadi):
Birinchi marta Docker WordPress va MySQL "image"larini yuklab oladi β biroz vaqt ketadi. Tugagach terminal sayt manzilini chiqaradi: odatda http://localhost:8888 (admin: http://localhost:8888/wp-admin). Standart admin login β admin, parol β password.
π wp-env start aynan nima qiladi: .wp-env.json ni o'qiydi, Docker'da WordPress (PHP+Apache) va MySQL konteynerlarini ko'taradi, plugin papkangizni konteyner ichiga ulaydi (mount). Kodingizni o'zgartirsangiz β darhol konteynerda aks etadi, qayta ishga tushirish shart emas.
Foydali wp-env buyruqlari¶
wp-env start # muhitni ko'tarish (yoki yangilash)
wp-env stop # to'xtatish (ma'lumot saqlanib qoladi)
wp-env clean all # ma'lumotlar bazasini tozalash (qaytadan boshlash)
wp-env destroy # konteyner va ma'lumotni butunlay o'chirish
wp-env run cli wp ... # konteyner ichida WP-CLI buyrug'ini ishlatish
wp-env run ning birinchi argumenti β konteyner nomi. Asosiylari: cli (WP-CLI), wordpress (asosiy sayt), tests-cli/tests-wordpress (test sayti), mysql. Masalan, sayt ichidagi plugin'lar ro'yxatini ko'rish:
.wp-env.json config¶
Plugin papkangiz ildiziga .wp-env.json faylini qo'ying β bu muhitingizni "kodga aylantiradi". Quyidagi config JSON sifatida tekshirilgan (valid):
{
"core": "WordPress/WordPress#7.0",
"phpVersion": "8.3",
"plugins": [ "." ],
"port": 8888,
"testsPort": 8889,
"config": {
"WP_DEBUG": true,
"WP_DEBUG_LOG": true,
"WP_DEBUG_DISPLAY": false,
"SCRIPT_DEBUG": true
},
"mappings": {
"wp-content/mu-plugins": "./.dev/mu-plugins"
}
}
Maydonlarni o'qiymiz:
coreβ qaysi WordPress versiyasi."WordPress/WordPress#7.0"β aynan 7.0;nullβ eng so'nggi stable.phpVersionβ PHP versiyasi ("8.3"). Plugin'ingiz minimal PHP'da ishlashini shu yerda sinaysiz.pluginsβ o'rnatilib aktivlashtiriladigan plugin'lar ro'yxati."."β joriy papka (ya'ni siz yozayotgan plugin) konteynerga ulanadi va yoqiladi. Bu plugin dev uchun aynan kerakli narsa.port/testsPortβ dev sayt (standart 8888) va tests sayt (standart 8889) portlari. Agar 8888 band bo'lsa, shu yerda o'zgartiring.configβwp-config.phpga qo'shiladigan konstantalar. Debug'ni shu yerdan yoqamiz (pastda batafsil).mappingsβ qo'shimcha papkalarni konteynerga ulash (masalanmu-plugins).
π‘ .wp-env.json ni Git'ga qo'shing, lekin shaxsiy o'zgarishlaringizni .wp-env.override.json ga yozing (u odatda .gitignore da) β shunda jamoa configi toza qoladi.
WP-CLI: WordPress'ni terminaldan boshqarish¶
WP-CLI β wp buyrug'i orqali WordPress'ni brauzersiz, terminaldan boshqarish vositasi. Plugin'ni yoqish, post yaratish, foydalanuvchi qo'shish, hatto ixtiyoriy PHP kodini sayt kontekstida ishga tushirish β hammasi bitta qatorda.
wp-env ichida WP-CLI tayyor turadi; uni wp-env run cli wp ... orqali chaqirasiz:
# plugin'larni ro'yxatlash
wp-env run cli wp plugin list
# bizning namuna plugin'ni yoqish/o'chirish
wp-env run cli wp plugin activate kitoblar-katalogi
wp-env run cli wp plugin deactivate kitoblar-katalogi
# test ma'lumoti: "kitob" CPT'siga post yaratish (07-bobda CPT'ni quramiz)
wp-env run cli wp post create --post_type=kitob --post_title="Sukunat" --post_status=publish
# ixtiyoriy PHP'ni sayt ichida ishga tushirish
wp-env run cli wp eval 'echo get_bloginfo("version");'
Nega WP-CLI kuchli:
- Tezlik β 50 ta test post yaratishni bir
forsiklida qilasiz, qo'lda emas. - Avtomatlashtirish β skriptlar, CI, deploy.
- Debug β
wp evalbilan funksiyangizni jonli sayt kontekstida (barcha WP funksiyalari mavjud holatda) sinaysiz.
π wp (WP-CLI) β bu kitobda tez-tez ko'rinadi. Agar lokal muhitingiz Docker'siz bo'lsa (masalan Local), WP-CLI ko'pincha ilova ichida yoki PATH'da wp sifatida mavjud bo'ladi; u holda wp-env run cli o'rniga to'g'ridan wp ... yozasiz.
Debug rejimi: xatoni ko'rinadigan qilish¶
Standart WordPress xatolarni yashiradi β bu jonli sayt uchun to'g'ri, lekin dev uchun halokat. Lokal muhitda biz teskarisini xohlaymiz: har bir notice, warning va fatal error ko'rinsin yoki logga yozilsin.
Buni wp-config.php dagi (yoki .wp-env.json ning config bo'limidagi) bir nechta konstanta boshqaradi. Quyidagi snippet php -l dan o'tgan:
<?php
// wp-config.php (faqat debug qismi β "/* That's all, stop editing! */" dan YUQORIDA)
define( 'WP_DEBUG', true ); // debug rejimini umuman yoqadi
define( 'WP_DEBUG_LOG', true ); // xatolarni wp-content/debug.log ga yozadi
define( 'WP_DEBUG_DISPLAY', false ); // xatolarni sahifa HTML'ida KO'RSATMAYDI
@ini_set( 'display_errors', '0' ); // PHP darajasida ham ekranga chiqarmaslik
define( 'SCRIPT_DEBUG', true ); // core CSS/JS ning minify QILINMAGAN versiyasi
define( 'SAVEQUERIES', true ); // har bir SQL so'rovni $wpdb->queries ga saqlaydi
Har birini ochib beraylik:
WP_DEBUGβ bosh kalit.truebo'lsa, WordPress barcha xato darajalarini (notice/warning ham) faollashtiradi.WP_DEBUG_LOGβtruebo'lsa, xatolarwp-content/debug.logfayliga yoziladi. Bunga maxsus yo'l ham berishingiz mumkin:WP_DEBUG_DISPLAYβ xatolar sahifa HTML'iga chiqsinmi? Logga yozayotganda bunifalseqiling, aks holda har bir notice sahifa boshini buzadi (ayniqsa AJAX/REST javoblarini).SCRIPT_DEBUGβ core'ning va@wordpress/scriptsning minify qilinmagan (o'qilishi oson) JS/CSS versiyalarini yuklaydi. Blok boblarida (19-23) foydali.SAVEQUERIESβ bajarilgan har bir SQL so'rovni xotirada saqlaydi (Query Monitor undan foydalanadi). βΉοΈ Ishlab chiqishda yoqing, jonli saytda o'chiring β xotira yeydi.
β οΈ Bu konstantalar faqat lokal/dev uchun. Jonli saytda WP_DEBUG va ayniqsa WP_DEBUG_DISPLAY ni hech qachon true qoldirmang: xato matnlari fayl yo'llarini va sayt ichki tuzilishini ochib, hujumchiga yordam beradi.
debug.log bilan ishlash¶
Xato yuz berganda u wp-content/debug.log ga to'planadi. Oqim shunday:
Log faylni "jonli" kuzatish (yangi xatolar paydo bo'lishi bilan ko'rinadi):
O'z plugin kodingizdan logga yozishingiz mumkin. PHP'ning error_log() funksiyasi WP_DEBUG_LOG yoqilgan bo'lsa shu faylga yozadi. Kichik yordamchi (php -l dan o'tgan):
<?php
// plugin ichida: xavfsiz debug yordamchisi
function kk_debug( mixed $data ): void {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
error_log( print_r( $data, true ) );
}
}
// foydalanish:
kk_debug( [ 'kitob_id' => 42, 'holat' => 'saqlandi' ] );
π‘ print_r( $data, true ) β ikkinchi argument true bo'lsa, natijani ekranga chiqarmay, satr sifatida qaytaradi β aynan logga yozish uchun.
Query Monitor¶
Brauzerda debug qilishning eng qulay vositasi β Query Monitor plugin'i (wordpress.org'da bepul). U admin panelga panel qo'shadi va sahifaning: barcha SQL so'rovlarini (sekinlarini qizil bilan), ishga tushgan hook'larni, REST/AJAX so'rovlarni, PHP xato/notice'larni, qanday shablon yuklanganini ko'rsatadi. 26-bobda (performance) buni chuqur ishlatamiz.
Uni WP-CLI bilan tez o'rnatib yoqing:
Plugin papkasi va symlink bilan dev¶
WordPress plugin'larni wp-content/plugins/ papkasida qidiradi. Har bir plugin β shu papka ichidagi alohida papka:
wp-content/
βββ plugins/
βββ kitoblar-katalogi/ <- bizning namuna plugin (butun kitob bo'ylab)
βββ kitoblar-katalogi.php <- asosiy fayl (plugin header shu yerda)
βββ includes/
βββ assets/
βββ readme.txt
π Butun kitob bo'ylab bitta namuna plugin'ni quramiz: slug kitoblar-katalogi, namespace Oqil\KitobKatalog, text domain kitoblar-katalogi. 03-bobda uni noldan boshlaymiz.
wp-env da "plugins": [ "." ] yozsangiz, joriy papka avtomatik ulanadi β symlink kerak emas. Lekin Local yoki sof Docker'da plugin'ingizni boshqa joyda saqlab, plugins/ ga symlink (ramziy havola) qo'yish qulay (kod bitta joyda turadi, lekin saytlar uni ko'radi):
# Linux / macOS (yoki Windows'da Git Bash / WSL):
ln -s ~/loyihalar/kitoblar-katalogi /yo'l/wp-content/plugins/kitoblar-katalogi
Windows'da PowerShell orqali (administrator rejimida):
New-Item -ItemType SymbolicLink -Path "C:\...\wp-content\plugins\kitoblar-katalogi" -Target "C:\loyihalar\kitoblar-katalogi"
β οΈ Ba'zi muhitlarda WordPress symlink qilingan plugin'ning __FILE__ yo'lini boshqacha hal qiladi; agar plugins_url() noto'g'ri manzil bersa, symlink o'rniga to'g'ridan papkaga ko'chiring yoki wp-env/mappings'dan foydalaning.
IDE, Intelephense va Xdebug (qisqa)¶
Plugin'ni qulay yozish uchun muharrir sozlamasi:
- VS Code β bepul va WordPress dev'da keng tarqalgan. Yoki PhpStorm (pullik, WP'ni juda yaxshi tushunadi).
- PHP Intelephense kengaytmasi β avtoto'ldirish, "go to definition", xato belgilash. WordPress core funksiyalarini taniydi (
add_action,register_post_type...), shuning uchun xayoliy funksiya yozsangiz darhol ogohlantiradi β bu anti-hallucination uchun ham foydali. - WordPress stub'lari β Intelephense core funksiyalarini bilishi uchun loyihaga
php-stubs/wordpress-stubsni Composer bilan qo'shing (dev-dependency).
Xdebug β kodni qadam-baqadam (breakpoint qo'yib) kuzatadigan debugger. error_log() "print bilan debug" bo'lsa, Xdebug β "to'xtab, o'zgaruvchilarni ko'rib" debug. wp-env da xdebug rejimini yoqish mumkin:
So'ng VS Code'da "PHP Debug" kengaytmasini o'rnatib, 9003-portda tinglaydigan launch konfiguratsiyasi qo'shasiz va breakpoint qo'yib so'rov yuborasiz. Boshida error_log() yetarli; loyiha o'sgach Xdebug ancha vaqtni tejaydi.
π‘ 26 va 29-boblar (performance, xavfsizlik auditi) uchun Query Monitor + Xdebug juftligi β eng kuchli kombinatsiya.
Bularning hammasi birga: ish oqimi¶
Kundalik plugin dev sikli odatda shunday ko'rinadi:
wp-env startβ muhitni ko'tar (kuningiz boshida bir marta).- Muharrirda kod yoz β fayl saqlanishi bilan konteynerda aks etadi.
http://localhost:8888da natijani ko'r; xato bo'lsadebug.logyoki Query Monitor'ga qara.wp-env run cli wp ...bilan test ma'lumoti yarat yoki holatni tekshir.- Tugagach
wp-env stop; muhit buzilsawp-env clean allyokiwp-env destroybilan noldan boshla.
Bu sikl 03-bobda birinchi haqiqiy plugin'ni yozganimizda darhol ishga tushadi.
02-bob mashqlari¶
Ko'p mashqlar o'z mashinangizda (Docker bilan) bajariladi. Ularni haqiqatan ishga tushirib, natijani ko'ring β plugin o'qib emas, qilib o'rganiladi.
Oson¶
- (Oson) Docker Desktop, Node va npm o'rnatilganini tekshiring:
docker --version,node --version,npm --version. Uchchalasi versiya chiqarsa, tayyorsiz. - (Oson) Bo'sh papka yarating va unda
npx @wordpress/env startni ishga tushiring. Brauzerdahttp://localhost:8888/wp-adminni oching (admin/password). - (Oson)
wp-env stopvawp-env startni ketma-ket bajaring. To'xtatib yoqsangiz ma'lumot saqlanib qolishini kuzating. - (Oson) To'rt variant (
wp-env, Local, Docker compose, MAMP) dan qaysi biri Docker talab qilmasligini ayting (ikkitasi bor).
O'rta¶
- (O'rta) Plugin papkangizga
.wp-env.jsonyozing:core7.0,phpVersion8.3,pluginsga".", vaconfigdaWP_DEBUG/WP_DEBUG_LOG/SCRIPT_DEBUGyoqilgan. Faylni JSON sifatida tekshiring.
Yechim
JSON to'g'riligini tekshirish: `python -m json.tool .wp-env.json` (xato bo'lmasa β valid). `wp-env start` dan keyin `config` dagi konstantalar konteyner `wp-config.php` ga qo'shiladi.- (O'rta)
wp-env run cli wp plugin listni ishga tushiring va aktiv plugin'lar ro'yxatini ko'ring. - (O'rta) WP-CLI bilan uchta test post yarating (
wp post create --post_title="..." --post_status=publish) vawp post listbilan tekshiring. - (O'rta)
wp-config.php(yoki.wp-env.jsonconfig) daWP_DEBUG_DISPLAYni avvaltrue, keyinfalseqilib, sahifada xato ko'rinishi qanday o'zgarishini taqqoslang. - (O'rta) Query Monitor'ni
wp-env run cli wp plugin install query-monitor --activatebilan o'rnatib yoqing va admin panelda uning panelini oching.
Yechim
So'ng `http://localhost:8888/wp-admin` ga kirib, yuqori admin panelida Query Monitor ko'rsatkichini bosing. U joriy sahifaning SQL so'rovlari, hook'lar, PHP xatolari va shablon ma'lumotini ochadi. `SAVEQUERIES` yoqilgan bo'lsa, so'rovlar vaqti ham ko'rinadi.Qiyin¶
-
(Qiyin) Plugin kodi uchun
WP_DEBUGyoqilganda logga yozadigan, aks holda jim turadigankk_debug()yordamchi funksiyasini yozing.Yechim
<?php /** * Faqat WP_DEBUG yoqilganda wp-content/debug.log ga yozadi. */ function kk_debug( mixed $data ): void { if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { // skalyar bo'lsa to'g'ridan, massiv/obyekt bo'lsa o'qilishi oson ko'rinishda $matn = is_scalar( $data ) ? (string) $data : print_r( $data, true ); error_log( '[kitoblar-katalogi] ' . $matn ); } } // foydalanish: kk_debug( 'saqlash boshlandi' ); kk_debug( [ 'kitob_id' => 42, 'janr' => 'roman' ] );WP_DEBUG_LOGyoqilgan bo'lsa,error_log()wp-content/debug.logga yozadi.is_scalar()tekshiruvi satr/sonniprint_rbilan o'rab tashlamaslik uchun; prefiks ([kitoblar-katalogi]) log ichida o'z xabarlaringizni tez topishga yordam beradi. Bu fayl PHP sintaksisiphp -ldan o'tadi. -
(Qiyin) Sof PHP (WordPress'siz)
kk_slugify()funksiyasini yozing: satrni kichik harf, ortiqcha belgilarni-ga, chetlarini tozalaydi.php -ryoki test bilan" Salom Dunyo!! 123 "nisalom-dunyo-123ga aylantirishini tekshiring.Yechim
<?php function kk_slugify( string $s ): string { $s = strtolower( trim( $s ) ); $s = preg_replace( '/[^a-z0-9]+/', '-', $s ); return trim( $s, '-' ); } echo kk_slugify( ' Salom Dunyo!! 123 ' ); // salom-dunyo-123Bu funksiya WP'ga tayanmaydi, shuning uchun uni
php -rbilan haqiqatan ishga tushirib tekshirish mumkin (chiqishi:salom-dunyo-123). E'tibor bering: bu o'quv namunasi β haqiqiy plugin'da slug uchun WordPress'ningsanitize_title()funksiyasidan foydalaning (u Unicode va WP qoidalarini to'g'ri hal qiladi). 07-bobda CPT slug'ida shuni ishlatamiz. -
(Qiyin)
.wp-env.jsondaportni 8888 dan 8910 ga o'zgartiring,wp-env startni qayta bajaring va sayt yangi portda ochilishini tasdiqlang. Nega portni o'zgartirish kerak bo'lishi mumkinligini bir jumlada yozing.Yechim
wp-env startdan so'ng saythttp://localhost:8910da ochiladi. Sababi: standart 8888 porti boshqa dastur (yoki boshqawp-envloyihasi) tomonidan band bo'lishi mumkin β u holdastart"port already in use" beradi va portni o'zgartirish kerak bo'ladi.testsPortni ham (standart 8889) birga o'zgartirgan ma'qul, ular to'qnashmasin. -
(Qiyin) Tasavvur qiling: plugin'ingiz aktivlashganda fatal error berdi va sayt oq ekran bo'ldi.
WP_DEBUG/WP_DEBUG_LOG/WP_DEBUG_DISPLAYni qanday sozlasangiz, sayt ekranida xato chiqmay, lekin aniq sababdebug.logga yozilishini tushuntiring va sababnitailbilan qanday o'qishingizni yozing.Yechim
wp-config.php(yoki.wp-env.jsonconfig):define( 'WP_DEBUG', true ); // xato darajalarini yoq define( 'WP_DEBUG_LOG', true ); // debug.log ga yoz define( 'WP_DEBUG_DISPLAY', false ); // ekranga chiqarma (sahifa toza qolsin) @ini_set( 'display_errors', '0' );So'ng logni jonli kuzating:
Endi muammoli sahifani brauzerda yangilang β fatal error sahifaga chiqmaydi, lekin
tail -foynasida fayl nomi va satr raqami bilan ko'rinadi (masalanPHP Fatal error: ... in .../kitoblar-katalogi.php on line 12). Shu satrga borib tuzatasiz, yangilab, log toza qolishini tasdiqlaysiz. βΉοΈ Bu yondashuv jonli saytda ham (faqatWP_DEBUG_DISPLAYfalsebo'lishi shart) tashxis qo'yishning xavfsiz yo'li.
β¬ οΈ Oldingi: 01 β WordPress arxitekturasi va plugin falsafasi Β· π README Β· Keyingi: 03 β Birinchi plugin: tuzilish va hayot sikli β‘οΈ