22 β Custom blok yaratish asoslari¶
β¬ οΈ Oldingi: 21 β Site Editor va hybrid temalar Β· π README Β· Keyingi: 23 β Edit/Save, attributes va InspectorControls β‘οΈ
Bu bobda: Endi biz tayyor bloklardan o'tib, o'z blokimizni yaratamiz. Custom blok qachon kerakligini (mavjud bloklar yetmaganda) aniqlaymiz,
@wordpress/scriptsasbobini sozlaymiz, blok loyihasi tuzilishini (src/,build/,block.json) o'rganamiz,block.jsonning har bir muhim maydonini ko'rib chiqamiz, blokniregister_block_typebilan PHP'da ro'yxatdan o'tkazamiz va eng muhimi β birinchi blokimizniwp-scripts buildbilan haqiqatan quramiz. Bobdagi blok npm bilan qurib ko'rildi:build/index.jsvabuild/block.jsonreal hosil bo'ldi.
Nega custom blok kerak?¶
V qismga xush kelibsiz. Shu paytgacha biz block temani mavjud bloklar bilan yig'dik: core/group, core/paragraph, core/query, core/image va boshqalar. Ko'pchilik sayt uchun bu yetarli. Lekin ba'zan kerakli ko'rinishni hech qanday core blok bera olmaydi β mana shunda custom blok (o'z blokingiz) yaratish vaqti keladi.
Avvalo bir muhim qoidani yodda tuting: custom blok β oxirgi chora, birinchi emas. WordPress'da blok yaratish nisbatan ko'p ish (npm, build, JavaScript). Shuning uchun har safar o'zingizga savol bering: "Bu ko'rinishni core bloklar va pattern (20-bob) bilan chiqara olamanmi?" Agar javob "ha" bo'lsa β pattern yarating, blok emas.
Custom blok haqiqatan kerak bo'ladigan tipik holatlar:
- Maxsus UI / sozlamalar. Masalan, "narx jadvali" bloki: 3 ustun, har birida sarlavha, narx, xususiyatlar ro'yxati va tugma. Core bloklar bilan buni yig'ish mumkin, lekin mijoz uchun qulay, soddalashtirilgan sozlamalar paneli kerak bo'lsa β custom blok afzal.
- Dinamik ma'lumot. Blok serverdan yangi ma'lumot ko'rsatishi kerak bo'lsa β masalan "oxirgi 5 ta post", "ob-havo", "valyuta kursi". Bunday blok har yuklanganda yangilanadi (24-bobdagi dinamik bloklar).
- Brendli takroriy komponent. Sayt bo'ylab bir xil ko'rinadigan, lekin har joyda ozgina farq qiladigan element β masalan "xizmat kartochkasi" yoki "jamoa a'zosi".
- Interaktivlik. Akkordeon, tab, kalkulyator kabi foydalanuvchi bilan o'zaro ta'sir qiladigan elementlar (25-bobdagi Interactivity API).
- core'da umuman yo'q maket. Standart bloklar qoplay olmaydigan o'ziga xos joylashuv.
Pattern vs custom blok β farqni aniq tushuning. Pattern (20-bob) β bu mavjud bloklarning oldindan tayyorlangan kombinatsiyasi, faqat HTML/markup. Custom blok β bu yangi JavaScript komponent: o'z tahrirlash interfeysi, o'z sozlamalari, o'z save mantig'i bilan. Agar sizga shunchaki "tugma + matn + rasm"ning chiroyli birikmasi kerak bo'lsa β pattern. Agar yangi xulq-atvor (sozlamalar, dinamik ma'lumot, interaktivlik) kerak bo'lsa β custom blok.
Blok tema'da yoki plaginda blok?¶
Ko'p o'rganuvchini chalkashtiradigan savol: blokni tema ichida yaratamizmi yoki plagin ichida? Ikkalasi ham texnik jihatdan ishlaydi, lekin tavsiya aniq:
Asosiy qoida: blok odatda PLAGINda bo'ladi. Sababi β blok bu kontent, tema esa ko'rinish. Foydalanuvchi temani almashtirsa (masalan, dizaynni yangilash uchun), uning kontenti yo'qolmasligi kerak. Agar "narx jadvali" bloki temaga bog'langan bo'lsa va tema o'chsa, mijozning barcha sahifalaridagi narx jadvallari "Bu blok mavjud emas" xatosiga aylanadi. Plaginda bo'lsa β blok temadan mustaqil yashaydi.
Lekin tema-spetsifik blok ham bo'ladi. Agar blok faqat shu tema dizaynining ajralmas qismi bo'lsa (masalan, temangizning maxsus "hero" bloki, boshqa temada mantiqsiz) β uni tema ichida saqlash o'rinli. Bu kitobda biz blokni tema ichida o'rgatamiz, chunki kitob temaga bag'ishlangan; lekin texnika ikkalasida bir xil β farqi faqat register_block_type ni qaysi fayl chaqirishida.
| Mezon | Plaginda blok | Tema ichida blok |
|---|---|---|
| Tema almashganda saqlanadimi? | Ha (mustaqil) | Yo'q (yo'qoladi) |
| Mos holat | Umumiy, qayta ishlatiluvchi blok | Faqat shu tema dizayniga xos |
| Ro'yxatdan o'tkazish | Plagin asosiy faylida | functions.php da |
| Tavsiya | Odatda shu | Maxsus holatlar |
Amaliy maslahat: Mijoz loyihasida muhim kontent bloklarini doim plaginda saqlang ("site-specific plugin" deb ataladi). Tema sotyapsiz va blok dizaynning ajralmas qismi bo'lsa β temaga qo'shing. Shubha bo'lsa β plagin.
@wordpress/scripts β blok asbobi¶
Custom blok JavaScript (aniqrog'i JSX β React'ning kengaytmasi) bilan yoziladi. Lekin brauzer va WordPress JSX'ni to'g'ridan-to'g'ri tushunmaydi β uni avval oddiy JavaScript'ga kompilyatsiya (build) qilish kerak. Bu jarayonni qo'lda webpack va babel sozlash bilan qilish murakkab. Shuning uchun WordPress rasmiy asbob beradi: @wordpress/scripts (qisqacha wp-scripts).
wp-scripts β bu "hammasi sozlangan" to'plam: u ichida webpack, babel, SCSS kompilyatori, linter va boshqa hammasini olib keladi. Siz faqat ikki buyruqni bilishingiz kifoya:
wp-scripts buildβsrc/papkadagi koddni bir martalik production uchun quradi (build/papkaga).wp-scripts startβ watch rejimi: faylni har saqlaganingizda avtomatik qayta quradi (ishlab chiqish paytida).
Eng tez yo'l: create-block¶
Yangi blok yaratishning eng oson usuli β rasmiy shablon generatori:
Bu buyruq mening-blokim/ papkasini yaratadi va ichiga to'liq ishlaydigan blok skeleti joylaydi: package.json, block.json, src/ papkasi (edit.js, save.js, index.js, style.scss), hatto blokni ro'yxatdan o'tkazadigan PHP faylgacha. So'ng npm start qilsangiz β tayyor.
Foydali bayroqlar:
# Faqat fayllarni yaratish, plagin sifatida emas (mavjud tema/plagin ichiga):
npx @wordpress/create-block@latest salom-quti --no-plugin
# Tema ichida ishlatish uchun src'ni o'z papkangizga yaratib, keyin build qilasiz.
create-blocknima qiladi? U sizga o'rgatish maqsadida biz qo'lda yozadigan barcha fayllarni avtomatik generatsiya qiladi. Real ishda ko'pincha shundan boshlanadi. Lekin ichida nima borligini tushunish uchun biz bu bobda fayllarni qo'lda ham yozamiz β shunda generatordan chiqqan kodni o'qiy olasiz.
Qo'lda sozlash (nima sodir bo'layotganini tushunish uchun)¶
create-block siz uchun qiladigan ishni qo'lda ham qilish mumkin. Bo'sh papkada:
So'ng package.json ga build buyruqlarini qo'shasiz:
Diqqat β
"type": "commonjs"qo'shmang.npm init -yba'zi muhitlardapackage.jsonga"type": "commonjs"yozib qo'yishi mumkin. Bu webpack'ga.jsfayllarni eski "script" rejimida o'qishni buyuradi va buildimport/exportustida xato beradi ('import' and 'export' may appear only with 'sourceType: module').create-blockbunday qatorni qo'shmaydi β agarnpm initqo'shgan bo'lsa, uni o'chiring. (Bu xato bu bobni yozishda real uchradi va aynan shu sabab edi.)
Blok loyihasi tuzilishi¶
Tayyor blok loyihasi quyidagicha ko'rinadi. Ikki asosiy papkani ajrating: siz src/ ga yozasiz, wp-scripts esa build/ ni generatsiya qiladi.
mening-blokim/
βββ package.json # npm sozlamalari va build buyruqlari
βββ src/ # SIZ YOZASIZ (manba kod)
β βββ block.json # blokning "pasporti" (metama'lumot)
β βββ index.js # kirish nuqtasi: registerBlockType
β βββ edit.js # editorda blok qanday ko'rinadi (JSX)
β βββ save.js # bazaga saqlanadigan markup (JSX)
β βββ style.scss # frontend + editor uslubi
β βββ editor.scss # faqat editor uslubi
βββ build/ # WP-SCRIPTS GENERATSIYA QILADI (qo'l tegma)
β βββ block.json # src'dan nusxa
β βββ index.js # kompilyatsiya qilingan JS
β βββ index.asset.php # bog'liqliklar va versiya (avtomatik)
β βββ index.css # editor.scss'dan
β βββ style-index.css # style.scss'dan
βββ mening-blokim.php # register_block_type (plagin yoki temada)
Ikki muhim qoida:
build/ni hech qachon qo'lda tahrirlamang β har build'da ustiga yoziladi.build/ni git'ga qo'shmang β uni.gitignorega yozing. Repo'da faqatsrc/va sozlama fayllari bo'lsin; build'ni har kim o'zinpm run buildbilan tiklaydi.
src/vabuild/β oshpaz analogiyasi.src/β bu xom mahsulotlar va retsept (siz yozgan kod).build/β tayyor taom (WordPress yeydigan kompilyatsiyalangan kod). Siz retseptni o'zgartirasiz, oshpaz (wp-scripts) taomni qayta tayyorlaydi. Hech qachon tayyor taomning ustidan tuz sepib o'zgartirmaysiz β retseptni o'zgartirasiz.
block.json β blokning pasporti¶
block.json β har bir custom blokning markazi. Bu fayl blok haqida hamma narsani bir joyda e'lon qiladi: nomi, sarlavhasi, ma'lumotlari, qaysi JS/CSS fayllarni yuklash kerakligi. Editor ham, frontend ham, PHP ham shu bitta fayldan o'qiydi β bu "bitta haqiqat manbai" tamoyili.
Mana bizning birinchi blokimizning to'liq block.json faylimiz (bu fayl npm build bilan tekshirildi):
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "mening-tema/salom-quti",
"version": "1.0.0",
"title": "Salom quti",
"category": "widgets",
"icon": "smiley",
"description": "Birinchi custom blok: oddiy salomlashish qutisi.",
"keywords": [ "salom", "demo" ],
"textdomain": "mening-tema",
"attributes": {
"xabar": {
"type": "string",
"default": "Salom, custom blok!"
}
},
"supports": {
"html": false,
"color": {
"background": true,
"text": true
}
},
"editorScript": "file:./index.js",
"editorStyle": "file:./index.css",
"style": "file:./style-index.css"
}
Endi har bir maydonni ko'rib chiqamiz:
$schemaβ IDE (VS Code) uchun avtomat-to'ldirish va xato tekshiruvi. Majburiy emas, lekin foydali.apiVersionβ blok API versiyasi. Hozir3(eng zamonaviy). API v3 da editor blokniiframeichida chizadi, bu uslublarning yaxshi izolyatsiyasini beradi. Yangi blokda doim3yozing.nameβ blokning global noyob identifikatori, doimnamespace/slugko'rinishida (masalanmening-tema/salom-quti). Namespace β sizning tema/plagin prefiksingiz; slug β blok nomi. Faqat kichik harf, raqam va-ishlatilsin. Bu nom butun WordPress'da takrorlanmasligi kerak.versionβ blokning o'z versiyasi. Asset kesh-buzish uchun ishlatiladi (yangilanganda foydalanuvchi eski JS'ni keshdan olmasin).titleβ blok inserter'da (qo'shish menyusida) ko'rinadigan nom.categoryβ qaysi guruhda turishi:text,media,design,widgets,theme,embed. O'z kategoriyangizni ham yaratish mumkin.iconβ Dashicon nomi (masalansmiley,star-filled) yoki o'z SVG.descriptionβ blok haqida qisqa izoh (inspector panelida ko'rinadi).keywordsβ inserter'da qidiruv uchun qo'shimcha so'zlar.textdomainβ tarjima (i18n, 28-bob) uchun matn domeni; odatda tema/plagin slug'i.attributesβ blokning ma'lumotlari (23-bobda chuqur). Har attributtype(string, number, boolean, array, object), ixtiyoriydefault, va ba'zansource/selector(markupdan qiymat o'qish) bilan e'lon qilinadi.supportsβ blok WordPress'ning umumiy imkoniyatlaridan qaysilarini qo'llab-quvvatlaydi:color(matn/fon rangi),spacing(padding/margin),typography,html(falseqilsangiz, foydalanuvchi blok HTML'ini qo'lda tahrirlay olmaydi). Bu β "tekin" funksiya: bir qator yozasiz, WordPress sozlamalar panelini o'zi qo'shadi.editorScriptβ"file:./index.js". Editorda yuklanadigan JS (edit + save mantig'i).file:prefiksiwp-scriptsga bu nisbiy yo'l ekanini aytadi.editorStyleβ faqat editorda yuklanadigan CSS (index.css, ya'nieditor.scss'dan).styleβ ham editor, ham frontendda yuklanadigan CSS (style-index.css, ya'nistyle.scss'dan).viewScriptβ faqat frontendda yuklanadigan JS (interaktiv bloklar uchun, 25-bob). Bizning oddiy blokda kerak emas.renderβ"file:./render.php"β dinamik blok uchun PHP render fayli (24-bob). Statik blokda (bu bobdagidek,save.jsmarkup chizadi) kerak emas.
build/block.jsonichidagi yo'llar. Diqqat qiling:block.jsondaeditorScript: "file:./index.js"deb yozasiz, lekinstyle: "file:./style-index.css"deysiz β g'alati ko'rinadi, chunkisrc/dastyle.scssdeb nomlangan. Sababi:wp-scriptsSCSS'ni kompilyatsiya qilgandastyle.scssnistyle-index.cssga,editor.scssniindex.cssga aylantiradi.block.jsonda build natijasidagi nom yoziladi, manba nomi emas. Bu β boshlovchilarni ko'p chalkashtiradigan nuqta.
register_block_type β blokni PHP'da ro'yxatga olish¶
block.json va build tayyor bo'lgach, WordPress'ga "menda blok bor" deyish kerak. Buni PHP qiladi β bitta funksiya: register_block_type(). U init hookida chaqiriladi va build/ papkadagi block.json ni o'qib, blokni ro'yxatga oladi.
Tema ichida (functions.php ga qo'shasiz):
<?php
/**
* Tema'dagi custom bloklarni ro'yxatdan o'tkazadi.
*/
function mening_tema_bloklarni_royxatdan_otkaz() {
register_block_type( __DIR__ . '/build/salom-quti' );
}
add_action( 'init', 'mening_tema_bloklarni_royxatdan_otkaz' );
Plagin ichida (plaginning asosiy faylida β bu fayl php -l bilan tekshirildi):
<?php
/**
* Plugin Name: Mening custom blokim
* Description: block.json orqali ro'yxatdan o'tadigan custom blok.
* Version: 1.0.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Blokni build/ papkadagi block.json orqali ro'yxatdan o'tkazadi.
*/
function mening_tema_blokni_royxatdan_otkaz() {
register_block_type( __DIR__ . '/build' );
}
add_action( 'init', 'mening_tema_blokni_royxatdan_otkaz' );
Bu yerda muhim nuqtalar:
register_block_type( __DIR__ . '/build' )β funksiyagabuild/papka yo'lini beramiz, alohida fayl emas. WordPress o'zi ichidanblock.jsonni topadi va undan barcha metama'lumotni (script, style, attributes, supports) o'qiydi. Bu zamonaviy, qisqa usul.__DIR__β joriy fayl turgan papka. Shuning uchun yo'l absolyut bo'ladi va ko'chirilganda ham ishlaydi.add_action( 'init', ... )βinithooki. Bloklarni doiminitda ro'yxatdan o'tkazing (oldinroq emas), aks holda WordPress hali tayyor bo'lmaydi.if ( ! defined( 'ABSPATH' ) ) exit;β plaginda xavfsizlik: faylga WordPress'dan tashqari to'g'ridan-to'g'ri kirishni to'sadi (27-bob).
Bir nechta blok bo'lsachi? Agar temada/plaginda bir necha blok bo'lsa, har biri o'z papkasida (
build/salom-quti/,build/narx-jadvali/) bo'ladi va har birini alohidaregister_block_typebilan ro'yxatdan o'tkazasiz. WP 6.8+ da bir nechta blokni bitta manifest bilan ro'yxatga olish ham bor (wp_register_block_types_from_metadata_collection), lekin boshlash uchun har bittasini alohida ro'yxatdan o'tkazish eng tushunarli.
Build jarayoni amalda¶
Endi hammasini bir joyga yig'amiz va blokni haqiqatan quramiz. Quyidagi jarayonni bosqichma-bosqich bajaramiz.
1-qadam: manba fayllar (src/)¶
src/block.json β yuqorida ko'rsatilgan. Endi JavaScript fayllar.
src/index.js β kirish nuqtasi. U block.json dan metama'lumotni o'qiydi va blokni JavaScript tomonida ro'yxatga oladi:
import { registerBlockType } from '@wordpress/blocks';
import metadata from './block.json';
import Edit from './edit';
import save from './save';
import './style.scss';
registerBlockType( metadata.name, {
edit: Edit,
save,
} );
src/edit.js β blok editorda qanday ko'rinishi (JSX). useBlockProps blokga kerakli class va atributlarni qo'shadi:
import { useBlockProps } from '@wordpress/block-editor';
import { __ } from '@wordpress/i18n';
import './editor.scss';
export default function Edit( { attributes } ) {
const blockProps = useBlockProps();
return (
<p { ...blockProps }>
{ attributes.xabar || __( 'Salom, custom blok!', 'mening-tema' ) }
</p>
);
}
src/save.js β bazaga saqlanadigan markup (statik blok uchun):
import { useBlockProps } from '@wordpress/block-editor';
export default function save( { attributes } ) {
const blockProps = useBlockProps.save();
return <p { ...blockProps }>{ attributes.xabar }</p>;
}
(edit va save ning farqi, attributes va JSX tafsilotlari β 23-bobning mavzusi. Hozir biz build jarayoniga e'tibor qaratamiz.)
src/style.scss va src/editor.scss β oddiy uslub fayllari:
/* style.scss β frontend va editorda */
.wp-block-mening-tema-salom-quti {
padding: 1rem;
border: 1px solid #2563eb;
border-radius: 8px;
}
2-qadam: build¶
Bu buyruq wp-scripts build ni ishga tushiradi. U src/ ni o'qib, JSX'ni oddiy JS'ga, SCSS'ni CSS'ga aylantiradi va build/ papkaga yozadi. Mana shu bobni yozishda olingan haqiqiy chiqish:
> wp-scripts build
asset index.js 1.37 KiB [emitted] [minimized] (name: index)
asset index.asset.php 146 bytes [emitted] (name: index)
asset style-index.css 90 bytes [emitted] (name: ./style-index) (id hint: style)
asset index.css 54 bytes [emitted] (name: index)
asset block.json 674 bytes [emitted] [from: src/block.json] [copied]
webpack 5.107.2 compiled successfully in 3810 ms
Build'dan keyin build/ papkada quyidagilar paydo bo'ladi (real tasdiqlangan):
build/
βββ block.json # src'dan nusxa
βββ index.js # kompilyatsiya qilingan, minify qilingan JS
βββ index.asset.php # bog'liqliklar + versiya hash
βββ index.css # editor uslubi
βββ index-rtl.css # RTL (o'ngdan-chapga) varianti β avtomatik
βββ style-index.css # frontend + editor uslubi
βββ style-index-rtl.css # RTL varianti
Eng muhimi β build/index.js va build/block.json hosil bo'ldi. Bu blok tayyorligini bildiradi.
index.asset.phpnima? Bu faylniwp-scriptsavtomatik yaratadi. Uning ichida ikki narsa bor: blokning JS bog'liqliklari (masalanwp-blocks,wp-block-editor,wp-i18n) va versiya hash.register_block_typeshu fayldan WordPress'ga "bu blok qaysi WP kutubxonalarini talab qiladi"ni aytadi β siz bog'liqliklarni qo'lda yozmaysiz. Bizning blokda u quyidagilarni topdi:react-jsx-runtime,wp-block-editor,wp-blocks,wp-i18n.
3-qadam: ishlab chiqish rejimi (watch)¶
Build paytida har safar qo'lda npm run build yozish zerikarli. Buning o'rniga:
Bu wp-scripts start ni ishga tushiradi β watch rejimi. Endi src/ dagi faylni har saqlaganingizda blok avtomatik qayta quriladi. Brauzerda editorni yangilab, o'zgarishni darhol ko'rasiz. Tugatganda Ctrl+C bilan to'xtatasiz va deploy'dan oldin yana npm run build (production, minify bilan) qilasiz.
startvsbuildβ qachon qaysi?start(watch) β ishlab chiqish paytida; tez, minify qilmaydi, source map bilan (xato qidirish oson).buildβ deploy/production uchun; minify qiladi, optimallashtiradi. Saytga doimbuildnatijasini yuklang,startnatijasini emas.
Hammasi birga: jarayonning to'liq ko'rinishi¶
Custom blokning butun hayot sikli:
- Sozlash:
npx @wordpress/create-block@latest salom-quti(yoki qo'ldanpm init+npm i @wordpress/scripts). - Yozish:
src/dablock.json,index.js,edit.js,save.js, uslublarni tahrirlaysiz. - Qurish:
npm run start(watch) bilan ishlaysiz, tugagandanpm run build. - Ro'yxatga olish: PHP'da
register_block_type( __DIR__ . '/build' )niinithookida. - Ishlatish: WordPress editorida blok inserter'dan blokingizni qo'shasiz.
Keyingi boblarda bu poydevor ustiga quramiz: 23-bobda edit/save va attributes'ni chuqur o'rganamiz, 24-bobda dinamik bloklar (PHP render), 25-bobda InnerBlocks va Interactivity API.
Eslatma β eski usul (
registerBlockTypeqo'lda). Eski qo'llanmalarda blokni faqat JS'da,block.jsonsiz ro'yxatdan o'tkazishni ko'rishingiz mumkin (register_block_typega obyekt berib). Bu eskirgan yondashuv. Hozir doimblock.jsonishlatiladi β u editor, frontend va PHP'ni bitta manbadan boshqaradi, asset'larni avtomatik yuklaydi va WP'ning blok katalogiga moslashadi.
<?php
// β ESKI USUL β ishlatmang. block.json siz, hammasi PHP'da:
register_block_type( 'mening-tema/salom-quti', array(
'editor_script' => 'mening-blok-skript',
'render_callback' => 'mening_blok_render',
) );
// Bu asset'larni qo'lda enqueue qilishni talab qiladi va xatoga moyil.
Mashqlar¶
Oson¶
-
Yangi blok loyihasini
create-blockbilan boshlang:npx @wordpress/create-block@latest mening-birinchi-blokimbuyrug'ini ishga tushiring. Yaratilgan papkada qaysi fayllar borligini ro'yxatlang va har birining vazifasini bir jumlada yozing. -
Quyidagi
block.jsonga yetishmayotgan majburiy maydonlarni qo'shing (apiVersion,name,title,category):
-
Bo'sh papkada qo'lda blok loyihasini sozlang:
npm init -y,npm install @wordpress/scripts --save-dev, vapackage.jsongabuildhamdastartskriptlarini qo'shing. -
register_block_typeniinithookida chaqiradigan PHP kodini yozing. Blokbuild/papkada deb faraz qiling.
O'rta¶
- Quyidagi
block.jsonningnamemaydonida xato bor. Toping va tuzating, nega xato ekanini tushuntiring:
-
block.jsonga bitta attribut qo'shing:sarlavhanomli,stringturidagi, default qiymati"Mening sarlavham". To'liqattributesblokini yozing. -
block.jsongasupportsqo'shing: blok matn va fon rangini (color), hamda padding/margin (spacing) sozlamalarini qo'llab-quvvatlasin. To'liqsupportsblokini yozing. -
Bitta blokda
editorScript,editorStyle,stylevaviewScriptmaydonlarining har biri qachon yuklanishini (editor / frontend / ikkalasi) jadval ko'rinishida tushuntiring. -
Plagin uchun asosiy faylni yozing: plagin header izohi (
Plugin Name),ABSPATHxavfsizlik tekshiruvi, varegister_block_type( __DIR__ . '/build' )niinithookida. Faylniphp -lbilan tekshiring.
Qiyin¶
-
To'liq blok qurib ko'ring. Vaqtinchalik papkada
npm init -yqiling,@wordpress/scriptso'rnating,src/ichidablock.json,index.js,edit.js,save.jsyarating, so'ngnpx wp-scripts buildishga tushiring.build/index.jsvabuild/block.jsonhosil bo'lganini tasdiqlang (ls build/). -
Build paytida
'import' and 'export' may appear only with 'sourceType: module'xatosi chiqdi. Sabab nimada bo'lishi mumkin va qanday tuzatasiz? (Maslahat:package.jsondagi"type"maydonini tekshiring.) -
src/style.scssfaylida yozgan uslubingiz build'dan keyin qaysi nomdagi faylga aylanadi vablock.jsonda uni qaysi maydonda qanday yo'l bilan ko'rsatasiz?editor.scssuchun ham javob bering. Nega manba nomi vablock.jsondagi nom farq qiladi? -
Bitta tema ichida ikkita custom blok (
salom-qutivanarx-jadvali) bo'lsa, build natijasi qanday tuzilishda bo'ladi vafunctions.phpda ularni qanday ro'yxatdan o'tkazasiz? PHP kodini yozing. -
Mijoz loyihasida "narx jadvali" bloki kerak. Uni temaga qo'shasizmi yoki plaginga? Tanlovingizni kamida uchta sabab bilan asoslang. Mijoz keyinchalik temani almashtirsa nima bo'ladi?
-
npm run startvanpm run buildo'rtasidagi farqni tushuntiring: qaysi biri minify qiladi, qaysi biri watch rejimida ishlaydi, va saytga (production) qaysi birining natijasini yuklash kerak? Nega?
Yechimlar¶
Yechim β 1
npx @wordpress/create-block@latest mening-birinchi-blokim ishga tushgandan keyin yaratiladigan asosiy fayllar:
package.jsonβ npm sozlamalari vabuild/startskriptlari.block.jsonβsrc/ichida; blokning metama'lumoti (name, title, category, attributes, supports, script/style yo'llari).src/index.jsβ kirish nuqtasi:registerBlockTypeni chaqiradi.src/edit.jsβ blok editorda qanday ko'rinishi (JSX).src/save.jsβ bazaga saqlanadigan markup (JSX).src/style.scssβ frontend + editor uslubi.src/editor.scssβ faqat editor uslubi.mening-birinchi-blokim.phpβ plagin asosiy fayli,register_block_typebilan blokni ro'yxatga oladi.readme.txtva.gitignoreβ yordamchi fayllar (build/ignorelanadi).
Yechim β 2
{
"apiVersion": 3,
"name": "mening-tema/yulduz",
"title": "Yulduz",
"category": "design",
"icon": "star-filled",
"editorScript": "file:./index.js"
}
apiVersion: 3 (zamonaviy API), name doim namespace/slug ko'rinishida, title inserter'da ko'rinadi, category blokning guruhi. Bularsiz blok WordPress'da to'g'ri ro'yxatdan o'tmaydi.
Yechim β 3
So'ng package.json ni tahrirlang:
Agar npm init -y "type": "commonjs" qo'shgan bo'lsa β uni o'chiring, aks holda build import/export ustida xato beradi.
Yechim β 4
<?php
function mening_tema_blokni_royxatdan_otkaz() {
register_block_type( __DIR__ . '/build' );
}
add_action( 'init', 'mening_tema_blokni_royxatdan_otkaz' );
register_block_type ga build/ papka yo'lini beramiz β WP o'zi ichidan block.json ni topadi. __DIR__ joriy fayl papkasi (yo'l ko'chirilganda ham ishlaydi). init hooki β bloklar uchun to'g'ri vaqt. (Bu kod bobni yozishda php -l bilan tekshirildi β sintaksis xatosi yo'q.)
Yechim β 5
Xato: "name": "Salom Quti" β noto'g'ri. To'g'ri:
Sabablar:
- name doim namespace/slug ko'rinishida bo'lishi shart (slash bilan).
- Faqat kichik harf, raqam va - (defis) ishlatiladi β bo'shliq va bosh harf mumkin emas.
- title esa odamga mo'ljallangan, istalgan matn bo'lishi mumkin ("Salom quti"). name β texnik identifikator, title β ko'rinadigan nom. Bu ikkisini aralashtirmang.
Yechim β 6
type attribut ma'lumot turini belgilaydi (string, number, boolean, array, object). default β foydalanuvchi o'zgartirmaguncha amal qiladigan boshlang'ich qiymat. (Attributes 23-bobda chuqur o'rganiladi.)
Yechim β 7
{
"supports": {
"color": {
"background": true,
"text": true
},
"spacing": {
"padding": true,
"margin": true
}
}
}
supports β WordPress'ning umumiy imkoniyatlaridan foydalanish. Bir qator yozasiz, WordPress sozlamalar paneliga rang va bo'shliq boshqaruvlarini avtomatik qo'shadi β JS yozish kerak emas. Bu "tekin" funksionallik.
Yechim β 8
| Maydon | Editor | Frontend | Izoh |
|---|---|---|---|
editorScript |
Ha | Yo'q | edit/save mantig'i (index.js) |
editorStyle |
Ha | Yo'q | faqat editor uslubi (index.css) |
style |
Ha | Ha | ikkalasida ham uslub (style-index.css) |
viewScript |
Yo'q | Ha | faqat frontend JS (interaktivlik) |
Asosiy mantiq: editor* β faqat tahrirlash ekranida, view* β faqat tashrif buyuruvchi ko'radigan saytda, style β har ikkala joyda bir xil ko'rinishi uchun.
Yechim β 9
<?php
/**
* Plugin Name: Mening custom blokim
* Description: block.json orqali ro'yxatdan o'tadigan custom blok.
* Version: 1.0.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
function mening_tema_blokni_royxatdan_otkaz() {
register_block_type( __DIR__ . '/build' );
}
add_action( 'init', 'mening_tema_blokni_royxatdan_otkaz' );
- Plagin header (
Plugin Name) β WordPress plaginni tanishi uchun majburiy. if ( ! defined( 'ABSPATH' ) ) exit;β faylga to'g'ridan-to'g'ri (WP'siz) kirishni to'sadi (xavfsizlik, 27-bob).register_block_type( __DIR__ . '/build' )inithookida β blokni ro'yxatga oladi.
Tekshiruv: php -l plagin.php -> No syntax errors detected. (Bu kod aynan shunday tekshirildi.)
Yechim β 10
mkdir test-blok && cd test-blok
npm init -y
# Agar package.json da "type": "commonjs" bo'lsa β o'chiring!
npm install @wordpress/scripts --save-dev
mkdir src
src/block.json, src/index.js, src/edit.js, src/save.js ni bu bobdagi misollar bilan yarating. package.json ga build skriptini qo'shib:
Kutilgan natija: build/ papkada index.js, block.json, index.asset.php, index.css, style-index.css (va RTL variantlari) paydo bo'ladi. webpack ... compiled successfully chiqsa β muvaffaqiyat.
Bu mashq bobni yozishda haqiqatan bajarildi: npm install 1532 paket o'rnatdi, npm run build muvaffaqiyatli yakunlandi va build/index.js (1.37 KiB) hamda build/block.json (674 bayt) real hosil bo'ldi.
Yechim β 11
Sabab: package.json da "type": "commonjs" bor. Bu webpack'ga .js fayllarni eski CommonJS "script" rejimida o'qishni buyuradi, lekin blok kodi ESM (import/export) ishlatadi β natijada parse xatosi.
Tuzatish: package.json dan "type": "commonjs" qatorini o'chiring. create-block bu qatorni hech qachon qo'shmaydi; muammo odatda qo'lda npm init -y qilganda paydo bo'ladi (ba'zi npm versiyalari uni avtomatik qo'shadi). O'chirgandan keyin node_modules/.cache ni tozalab (rm -rf node_modules/.cache) qayta build qiling.
(Bu xato bu bobni tayyorlashda haqiqatan uchradi va aynan shu yechim ishladi β "type": "commonjs" ni o'chirgandan keyin build muvaffaqiyatli o'tdi.)
Yechim β 12
src/style.scss-> build'dan keyinstyle-index.cssbo'ladi.block.jsonda:"style": "file:./style-index.css".src/editor.scss-> build'dan keyinindex.cssbo'ladi.block.jsonda:"editorStyle": "file:./index.css".
Nega farq qiladi: block.json da siz build natijasidagi (kompilyatsiyalangan CSS) nomni yozasiz, manba .scss nomini emas. wp-scripts SCSS'ni standart nomlash konvensiyasi bilan kompilyatsiya qiladi: style.scss -> style-index.css, asosiy entry (index.js + uning import qilgan editor.scss) -> index.css. WordPress oxir-oqibat faqat build/ dagi .css fayllarni yuklaydi, shuning uchun block.json ham o'shalarga ishora qiladi.
Yechim β 13
Build tuzilishi (har blok o'z papkasida):
build/
βββ salom-quti/
β βββ block.json
β βββ index.js
β βββ ...
βββ narx-jadvali/
βββ block.json
βββ index.js
βββ ...
functions.php:
<?php
function mening_tema_bloklarni_royxatdan_otkaz() {
register_block_type( __DIR__ . '/build/salom-quti' );
register_block_type( __DIR__ . '/build/narx-jadvali' );
}
add_action( 'init', 'mening_tema_bloklarni_royxatdan_otkaz' );
Har blokni alohida register_block_type bilan, har biriga o'z papka yo'li bilan ro'yxatga olasiz. (Bir nechta blokni qurish uchun package.json build sozlamasini ham moslash kerak bo'ladi β create-block har blok uchun alohida loyiha tavsiya etadi yoki bitta loyihada bir necha src/<blok>/ papka ishlatiladi.)
Yechim β 14
"Narx jadvali" blokini plaginga qo'shaman. Sabablar:
- Kontent saqlanishi. Narx jadvali β bu kontent (sayt ma'lumoti), ko'rinish emas. Tema almashganda u yo'qolmasligi kerak.
- Mustaqillik. Plagin temadan mustaqil ishlaydi β mijoz dizaynni yangilash uchun temani almashtirsa ham, narx jadvallari joyida qoladi.
- Qayta ishlatish. Plagin boshqa loyiha/saytlarda ham ishlatilishi mumkin; temaga bog'lansa β yo'q.
Tema almashtirilsa: agar blok temada bo'lsa va tema o'chsa, barcha narx jadvallari "Bu blok mavjud emas / xato kontent" holatiga tushadi (markup qoladi, lekin blok ro'yxatdan o'tmagani uchun buziladi). Plaginda bo'lsa β hech narsa o'zgarmaydi.
(Istisno: agar blok faqat shu tema dizaynining ajralmas qismi bo'lsa β masalan temaga maxsus "hero" β temada saqlash o'rinli.)
Yechim β 15
| Xususiyat | npm run start |
npm run build |
|---|---|---|
| Rejim | Watch (avtomatik qayta quradi) | Bir martalik |
| Minify | Yo'q | Ha |
| Source map | Ha (xato qidirish oson) | Yo'q (yoki cheklangan) |
| Tezlik | Tez (ishlab chiqish uchun) | Optimallashtirilgan |
| Maqsad | Ishlab chiqish (development) | Production / deploy |
Saytga doim npm run build natijasini yuklang. Sababi: build kod minify qilingan (kichikroq fayl, tez yuklanadi) va optimallashtirilgan. start natijasi katta, optimallashtirilmagan va ishlab chiqish uchun mo'ljallangan β uni production'ga yuklash sayt tezligini pasaytiradi. Ish jarayoni: start bilan ishlang, tugaganda build qilib deploy qiling.
β¬ οΈ Oldingi: 21 β Site Editor va hybrid temalar Β· π README Β· Keyingi: 23 β Edit/Save, attributes va InspectorControls β‘οΈ