21 β Site Editor va hybrid temalar¶
β¬ οΈ Oldingi: 20 β Block patterns Β· π README Β· Keyingi: 22 β Custom blok yaratish asoslari β‘οΈ
Bu bobda: Block temaning eng kuchli vositasi β Site Editor (FSE: Full Site Editing). Foydalanuvchi butun saytni (templates, parts, styles, navigation, patterns) brauzerda, kod yozmasdan tahrirlaydi. Biz Site Editor ish oqimini,
wp:navigationblokini va uning ortidagiwp_navigationpost type'ini, foydalanuvchi o'zgarishlari baza'da fayl ustiga qanday yozilishini ("Clear customizations") o'rganamiz. So'ng eng amaliy mavzu: hybrid tema (klassik + block aralash) va klassik temadan to'liq block temaga bosqichma-bosqich ko'chish strategiyasi. Hamma fakt va kod jonli WordPress 7.0 da tekshirilgan.
Site Editor nima?¶
15-20 boblarda block temaning qismlarini ko'rdik: theme.json, templates, parts, global styles, patterns. Site Editor β bularning hammasini bitta brauzer interfeysida birlashtiruvchi vosita.
Klassik temada (1-14 boblar) tema dizaynini o'zgartirish uchun PHP fayllarni qo'lda tahrirlash kerak edi. Foydalanuvchi (mijoz) buni qila olmasdi β har o'zgarish uchun dasturchi kerak bo'lardi. Site Editor shu to'siqni oladi: mijoz header'ni, footer'ni, sahifa shablonini, ranglarni va menyuni o'zi, vizual tahrirlaydi.
Kirish yo'li: WordPress admin panelida Appearance > Editor (Ko'rinish > Tahrirlovchi). Bu menyu faqat block tema aktiv bo'lganda ko'rinadi. Ichkarida WordPress Design bo'limida besh asosiy bo'lim taqdim etadi:
| Bo'lim | Nima tahrirlanadi | Qayerda saqlanadi |
|---|---|---|
| Templates | Sahifa shablonlari (index, single, page, 404...) | wp_template post type (baza) yoki templates/*.html (fayl) |
| Template Parts | Qayta ishlatiladigan bo'laklar (header, footer) | wp_template_part post type yoki parts/*.html |
| Styles | Ranglar, shriftlar, global stillar, variations | wp_global_styles post type (baza) |
| Navigation | Menyular | wp_navigation post type (baza) |
| Patterns | Block to'plamlar (20-bob) | tema patterns/*.php + foydalanuvchi yaratganlari baza'da |
Eslatma β atamalar: "Site Editor", "Full Site Editing (FSE)", "block tema tahrirlovchisi" β bularning hammasi bir narsani anglatadi. WordPress 6.x dan beri rasmiy nom shunchaki "Editor" (Appearance > Editor); "FSE" jamoa ichidagi qisqartma.
Block tema'mi yoki yo'q? β Editor menyusining sharti¶
Site Editor menyusi paydo bo'lishi uchun aktiv tema block tema bo'lishi shart. WordPress buni qanday aniqlaydi? Bu bobning kalit faktidir va hybrid temani tushunish uchun zarur:
WordPress temani block deb belgilashi uchun templates/index.html fayli (yoki eski block-templates/index.html) mavjud bo'lishi kerak. Boshqa hech narsa emas. Bu yadrodagi WP_Theme::is_block_theme() metodida shunday yozilgan (WordPress 7.0 da tekshirildi):
$paths_to_index_block_template = array(
$this->get_file_path( '/templates/index.html' ),
$this->get_file_path( '/block-templates/index.html' ),
);
Ya'ni: temada templates/index.html bo'lsa β block tema (Site Editor yoqiladi). Bo'lmasa β klassik tema (Site Editor yo'q), index.php ishlatiladi. theme.json ning bor-yo'qligi bu qarorga ta'sir qilmaydi β bu fakt hybrid tema asosida yotadi (pastda batafsil).
Site Editor ish oqimi¶
Site Editor'da ishlash klassik kod-tahrirlashdan tubdan farq qiladi. Tipik ish oqimi:
- Templates'ni ochish. Masalan
Single Postsshablonini ochasiz. Kanvasda haqiqiy postning ko'rinishi chiqadi (live preview). - Bloklar bilan tahrirlash. Sarlavha qo'shasiz, Query Loop sozlaysiz, ranglarni o'zgartirasiz β xuddi post yozgandek.
- Template Parts. Header yoki footer'ni alohida tahrirlaysiz; ular hamma shablonlarda bir vaqtda yangilanadi (chunki
<!-- wp:template-part {"slug":"header"} /-->bilan ulangan, 18-bob). - Styles. Global ranglar/shriftlarni o'zgartirasiz yoki tayyor style variation (19-bob) tanlaysiz.
- Navigation. Menyu tuzasiz (pastda batafsil).
- Saqlash. "Save" tugmasi bosilganda hamma o'zgarish baza'ga yoziladi.
Eng muhim tushuncha: Site Editor o'zgarishlari tema fayllarini O'ZGARTIRMAYDI. Ular baza'ga, alohida post type'larga yoziladi. Bu fayl ustiga "qatlam" qo'yadi β bu mantiqni keyingi bo'limda chuqurlashtiramiz.
template-canvas β block tema qanday render bo'ladi¶
Klassik temada har URL index.php/single.php kabi PHP faylga boradi (3-bob, template hierarchy). Block temada PHP shablon yo'q β unda saytni nima render qiladi?
Javob: WordPress yadrosidagi yagona fayl β wp-includes/template-canvas.php. Block tema aktiv bo'lganda har bir so'rov shu faylga keladi. Uning butun mazmuni (WordPress 7.0 da tekshirildi):
<?php
$template_html = get_the_block_template_html();
?><!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>" />
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<?php echo $template_html; ?>
<?php wp_footer(); ?>
</body>
</html>
Bu β block temaning "yagona index.php'si". U faqat bitta ish qiladi: get_the_block_template_html() bilan tegishli block template'ni (index.html, single.html...) topib, uni HTML'ga aylantiradi va <body> ichiga joylaydi. wp_head() va wp_footer() β klassik temadagidek (8-bob), majburiy hooklar bu yerda ham bor.
Diqqat qiling: template-canvas.php tema ichida emas, WordPress yadrosida. Siz uni yozmaysiz, o'zgartirmaysiz β block tema yaratganda u haqida bilishingiz kifoya. Bu klassik header.php/footer.php/index.php uchligini bitta yadro fayli bilan almashtiradi.
Navigation bloki (wp:navigation)¶
Menyu β har saytning asosiy qismi. 11-bobda klassik usulni ko'rdik: register_nav_menus() + wp_nav_menu() + Walker. Block temada bu butunlay boshqacha ishlaydi β Navigation bloki (core/navigation) orqali.
Navigation bloki jonli WordPress 7.0 da ro'yxatdan o'tgan core blok (tekshirildi: WP_Block_Type_Registry::is_registered("core/navigation") -> true). Eng oddiy ko'rinishi β header part ichida (bu markup Twenty Twenty-Five header pattern'idan olingan):
Bu o'z-o'zini yopuvchi (self-closing, /-->) blok. Ichida menyu havolalari ko'rinmaydi β chunki ular baza'da saqlanadi. Mana asosiy tushuncha.
wp_navigation post type β menyu qayerda yashaydi¶
Navigation blokining ortida maxsus post type turadi: wp_navigation. Menyu (havolalar to'plami) shu post type'ning bitta yozuvi sifatida baza'da (wp_posts jadvali) saqlanadi.
Jonli WordPress 7.0 da tekshirildi:
post_type_exists("wp_navigation") -> true
post_type: wp_navigation
public: false (front-endda /?p=... bilan to'g'ridan ochilmaydi)
show_in_rest: true (Site Editor / block editor REST orqali tahrirlaydi)
hierarchical: false
public: falseβ bu menyu sahifa emas; uni alohida URL bilan ochib bo'lmaydi. U faqat boshqa blok ichida ishlatiladigan ma'lumot.show_in_rest: trueβ Site Editor (React asosida) menyuni REST API orqali o'qiydi va yozadi.
Menyuning haqiqiy mazmuni (havolalar) wp_navigation postining post_content maydonida β core/navigation-link bloklari ketma-ketligi sifatida saqlanadi.
ref atributi β menyuga ishora¶
Navigation bloki menyuga ref atributi orqali bog'lanadi. ref β bu wp_navigation postining ID'si. Tekshirilgan jonli misol (bizning sayt'da ID 7 li "Navigation" yozuvi bor):
Bu markupni WordPress'ga parse_blocks() bilan berib tekshirdim: natija blockName = "core/navigation", attrs.ref = 7. render_block() bu blokni ID 7 li wp_navigation postidan menyuni o'qib chiqaradi.
ref ning kuchi: bitta menyu, ko'p joyda. Header'da ham, footer'da ham {"ref":7} yozsangiz β ikkalasida bir xil menyu chiqadi. Menyuni Site Editor'da bir marta o'zgartirsangiz, hamma joyda yangilanadi.
Inline (ref'siz) variant¶
Agar siz theme.json tema markupida menyuni qo'lda yozsangiz, refsiz, ichki bloklar bilan:
<!-- wp:navigation {"overlayMenu":"mobile"} -->
<!-- wp:navigation-link {"label":"Bosh","url":"/"} /-->
<!-- wp:navigation-link {"label":"Blog","url":"/blog"} /-->
<!-- wp:navigation-link {"label":"Aloqa","url":"/aloqa"} /-->
<!-- /wp:navigation -->
Buni ham parse_blocks() bilan tekshirdim: core/navigation ichida core/navigation-link bolalari to'g'ri o'qiladi. Lekin diqqat: foydalanuvchi bu menyuni Site Editor'da birinchi marta saqlaganda, WordPress uni avtomatik yangi wp_navigation postiga ko'chiradi va markupni {"ref":N} ga aylantiradi. Ya'ni inline variant β boshlang'ich holat, ref β barqaror holat.
Navigation blokining foydali atributlari¶
Navigation bloki (tekshirilgan, core/navigation atributlarida bor):
| Atribut | Vazifasi |
|---|---|
ref |
wp_navigation post ID'si (menyuga ishora) |
overlayMenu |
Mobil "hamburger" rejimi: "mobile" (faqat kichik ekran), "always", "never" |
layout |
Yo'nalish: {"type":"flex","orientation":"horizontal"} yoki "vertical" |
overlayBackgroundColor / overlayTextColor |
Ochilgan mobil menyu rangi |
core/page-list bloki ham bor (tekshirildi: ro'yxatdan o'tgan) β u barcha sahifalarni avtomatik menyu sifatida ko'rsatadi (qo'lda havola yozmasdan). Ko'pincha Navigation ichida ishlatiladi.
Foydalanuvchi o'zgarishlari: baza fayl ustida¶
Bu β Site Editor'ning eng ko'p chalkashtiradigan, lekin eng muhim tushunchasi. Aniq tushunib oling.
Tema fayllari (templates/index.html, parts/header.html, theme.json) β bu boshlang'ich qiymat (default). Foydalanuvchi Site Editor'da biror narsani o'zgartirib saqlasa, o'zgarish faylga emas, baza'ga yoziladi:
| Foydalanuvchi tahrirlaydi | Fayl (default) | Saqlangan o'zgarish (baza) |
|---|---|---|
| Template (Single) | templates/single.html |
wp_template post type |
| Template part (Header) | parts/header.html |
wp_template_part post type |
| Global stillar | theme.json (styles) |
wp_global_styles post type |
| Menyu | (markup ref) |
wp_navigation post type |
Mantiq: WordPress shablonni ko'rsatishda avval baza'ga qaraydi. Agar foydalanuvchi o'zgartirgan versiya baza'da bo'lsa β uni ishlatadi. Bo'lmasa β tema faylidagi default'ni ishlatadi. Ya'ni baza fayl ustiga qatlam (override) qo'yadi.
"Clear customizations" β default'ga qaytarish¶
Bu modelning amaliy oqibati: foydalanuvchi Site Editor'da shablonni buzib qo'ysa, uni asl tema versiyasiga qaytarish oson. WordPress shablon yonida "Clear customizations" (yoki "Reset" β O'zgarishlarni tozalash) tugmasini ko'rsatadi.
Bu tugma faqat o'sha shablonning baza'dagi override yozuvini o'chiradi. Tema faylidagi default daxlsiz qoladi β WordPress qaytadan unga murojaat qila boshlaydi. Ya'ni "Clear customizations" hech qachon tema faylingizni o'chirmaydi, faqat foydalanuvchi qatlamini olib tashlaydi.
Dasturchi uchun amaliy nuqta: temani yangilaganingizda (
templates/single.htmlni o'zgartirsangiz), agar mijoz o'sha shablonni Site Editor'da tahrirlagan bo'lsa, sizning yangi faylingiz ko'rinmaydi β chunki baza'dagi override ustun. Mijozdan "Clear customizations" bosishini so'rang yoki o'zgarishni Site Editor orqali kiriting. Bu klassik temada uchramaydigan yangi vaziyat.
Hybrid tema: klassik + block aralash¶
Endi bobning ikkinchi yarmiga, eng amaliy mavzuga o'tamiz. Ko'p o'quvchi shunday savol beradi: "Menda katta klassik tema bor (yoki klassik bilim). Hammasini tashlab, noldan block tema yozishim shartmi?" Javob: yo'q. Oraliq yo'l bor β hybrid tema.
Hybrid tema β klassik va block xususiyatlarni aralashtirgan tema. Ikki asosiy ko'rinishi bor:
- Klassik tema +
theme.json. Tema haliindex.php/single.php(PHP shablonlar) ishlatadi, lekintheme.jsonqo'shilgan β shu sababli block editor stillari, palitra va global sozlamalar ishlaydi. - Block templates + PHP mantiq. Tema
templates/*.html(block shablonlar) ishlatadi, lekinfunctions.phporqali jiddiy PHP mantiq qo'shadi (hooklar,render_blockfiltri, custom logika).
Hybrid asosini tasdiqlash (jonli test)¶
Eng kuchli dalil β kodning o'zi. Men jonli WordPress 7.0 da ch21-hybrid-test nomli tema yaratdim: index.php (klassik shablon) va theme.json (block sozlamalar) bilan. Natija:
is_block_theme: false <-- index.php bor, templates/index.html yo'q -> KLASSIK
wp_theme_has_theme_json: true <-- theme.json mavjud va ishlaydi
Va eng muhimi β bu klassik temaning theme.json'i haqiqatan parse qilindi (WP_Theme_JSON_Resolver::get_theme_data() bilan tekshirdim):
Ya'ni: klassik tema (is_block_theme: false) ham theme.json'dan to'liq foydalanadi. Palitra, layout, fluid typography β hammasi block editor'da va frontend'da ishlaydi, garchi tema PHP shablonlar bilan render bo'lsa ham. Bu β hybrid temaning poydevori, jonli tekshirilgan fakt.
Klassik temaga theme.json qo'shish¶
Mavjud klassik temaga theme.json qo'shish β eng kam mehnat, eng katta foyda beradigan birinchi qadam. Faqat tema ildiziga theme.json faylini qo'shasiz:
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"settings": {
"appearanceTools": true,
"layout": { "contentSize": "650px", "wideSize": "1100px" },
"color": {
"defaultPalette": false,
"palette": [
{ "slug": "asosiy", "color": "#2563eb", "name": "Asosiy" },
{ "slug": "matn", "color": "#1e293b", "name": "Matn" }
]
}
}
}
Bu yaroqli JSON ekani (json_decode) va kalitlari WP_Theme_JSON schema'ga mosligi tekshirilgan. Faqat shu faylni qo'shish bilan klassik temangiz darrov quyidagilarni oladi:
- Block editor (post/sahifa yozishda) sizning brend palitrangizni ko'rsatadi (WP standartlari emas).
--wp--preset--color--asosiykabi CSS o'zgaruvchilari avtomatik yaratiladi (style.cssda ishlatasiz).contentSize/wideSizebilan kontent kengligi boshqariladi.
Block editor uchun stillarni ulash (functions.php)¶
theme.json ko'p narsani avtomatik beradi, lekin klassik temada block editor ichida tema CSS'ini ko'rsatish uchun functions.php da editor stillarini yoqish foydali. Bu kod php -l bilan tekshirilgan:
<?php
add_action( 'after_setup_theme', 'mytheme_setup' );
function mytheme_setup() {
// Block-editor uchun tema stillarini yoqish.
add_theme_support( 'editor-styles' );
add_editor_style( 'assets/editor.css' );
// Klassik xususiyatlar ham qoladi.
add_theme_support( 'title-tag' );
add_theme_support( 'post-thumbnails' );
add_theme_support( 'html5', array( 'search-form', 'gallery', 'caption' ) );
// Menyu joyi (klassik wp_nav_menu uchun).
register_nav_menus( array(
'primary' => __( 'Asosiy menyu', 'mytheme' ),
) );
}
add_theme_support('editor-styles') + add_editor_style() block editorni tema stilingiz bilan moslaydi (10-bobdagi enqueue mantig'ining editor varianti). add_editor_style, register_nav_menus, wp_nav_menu funksiyalari jonli WP 7.0 da mavjudligi tekshirildi.
Block templates + PHP mantiq (ikkinchi hybrid ko'rinishi)¶
Aksincha yo'l: tema to'liq block (templates/*.html) bo'lsin, lekin PHP mantiq ham bo'lsin. Block tema'da ham functions.php ishlaydi β hooklar to'liq amal qiladi. Masalan, Navigation blokiga foydalanuvchi tizimga kirgan bo'lsa class qo'shadigan filtr (php -l bilan tekshirilgan):
<?php
add_filter( 'render_block', 'mytheme_filter_nav', 10, 2 );
function mytheme_filter_nav( $block_content, $block ) {
if ( 'core/navigation' === $block['blockName'] && is_user_logged_in() ) {
$block_content = str_replace(
'wp-block-navigation',
'wp-block-navigation is-logged-in',
$block_content
);
}
return $block_content;
}
render_block filtri har blokning chiqishini PHP'da o'zgartirishga imkon beradi. Bu β block markup (HTML) + klassik PHP hook tizimi (9-bob) birikmasi: aniq hybrid. Bunday yondashuv real loyihalarda juda keng tarqalgan β dizayn block bilan, biznes-mantiq PHP bilan.
Klassikdan block'ga bosqichma-bosqich ko'chish¶
Endi strategiyani yig'amiz. Katta klassik temani bir kechada block temaga aylantirish β xavfli va keraksiz. To'g'ri yo'l β bosqichma-bosqich, har bosqichda sayt ishlab tursin:
1-bosqich: theme.json qo'shing. Klassik temaga theme.json (settings) qo'shing. Sayt hali klassik (index.php ishlaydi), lekin block editor brendingizni biladi, palitra/CSS o'zgaruvchilari paydo bo'ladi. Eng kam xavf, darrov foyda. Bu β birinchi va eng muhim qadam.
2-bosqich: editor stillarini ulang. add_theme_support('editor-styles') + add_editor_style(). Endi block editor tema ko'rinishiga mos. theme.json ga styles (17-bob) qo'shib, frontend stilingizning bir qismini CSS'dan theme.json'ga ko'chiring.
3-bosqich: templates'ni birma-bir ko'chiring. Mana hal qiluvchi qadam. Bitta PHP shablonni block HTML shablonga aylantiring β lekin templates/index.html ni eng oxirida qo'shing, chunki u paydo bo'lishi bilan tema block ga aylanadi (yuqorida tekshirilgan fakt). Tartib odatda shunday:
- templates/page.html yoki templates/404.html (eng oddiy, kam xavfli) bilan boshlang.
- templates/single.html, templates/archive.html ni qo'shing.
- parts/header.html, parts/footer.html yarating (get_header()/get_footer() o'rnini bosadi).
- Hammasi tayyor bo'lganda templates/index.html qo'shing. Shu lahzada tema block bo'ladi, Site Editor yoqiladi, eski index.php endi ishlatilmaydi.
4-bosqich: tozalash. Endi PHP shablonlar (index.php, single.php...) keraksiz β o'chirishingiz mumkin (yoki ehtiyot uchun qoldirasiz; block temada ular e'tiborga olinmaydi). functions.php esa qoladi β hooklar, enqueue, custom mantiq block temada ham kerak.
| Bosqich | Qo'shasiz | Tema turi | Site Editor |
|---|---|---|---|
| 1 | theme.json (settings) |
Klassik | Yo'q |
| 2 | editor-styles + theme.json styles |
Klassik | Yo'q |
| 3a | page.html, single.html, parts... |
Klassik (hali index.html yo'q) |
Yo'q |
| 3b | templates/index.html |
Block | Ha |
| 4 | PHP shablonlarni olib tashlash | Block | Ha |
Bu strategiyaning go'zalligi: har bosqichda sayt to'liq ishlaydi. Xohlagan bosqichda to'xtashingiz mumkin β masalan 1-2 bosqichda qolib, "klassik + theme.json" hybrid tema sifatida yillab ishlatish mutlaqo to'g'ri tanlov.
Tez-tez uchraydigan xatolar¶
theme.jsonqo'shdim, lekin tema block bo'lib qoldi deb o'ylash.theme.jsontemani block QILMAYDI. Faqattemplates/index.htmlqiladi. Klassik tema + theme.json = hybrid, hali klassik.- Site Editor menyusi yo'q. Tema block emas (
templates/index.htmlyo'q) yoki aktiv tema klassik. Editor menyusi faqat block tema aktiv bo'lganda chiqadi. - Tema faylini o'zgartirdim, sayt'da ko'rinmadi. Foydalanuvchi o'sha shablonni Site Editor'da tahrirlagan β baza'dagi override fayl ustun. "Clear customizations" bosing.
- Navigation menyu havolalari
parts/header.htmlichida ko'rinmaydi. To'g'ri β menyuwp_navigationpost type'ida (baza), markupda faqat{"ref":N}. Havolalarni Site Editor > Navigation'da tahrirlaysiz. wp_navigationni front-endda URL bilan ochmoqchi bo'lish. Upublic: falseβ alohida sahifa emas, faqat boshqa blok ichida ishlatiladigan ma'lumot.- Inline menyu yozdim, lekin u
refga aylanib qoldi. Bu normal β foydalanuvchi birinchi saqlashda WordPress inline menyuniwp_navigationpostiga ko'chiradi. templates/index.htmlni birinchi qo'shish. Ko'chishda buni oxirida qo'shing β aks holda tema yarim tayyor holatda block bo'lib, boshqa shablonlar yo'qligi sababli sayt buziladi.
Mashqlar¶
Oson¶
- Site Editor'ni oching. Block tema (masalan Twenty Twenty-Five) aktiv qiling va Appearance > Editor'ga o'ting. Besh bo'lim (Templates, Template Parts, Styles, Navigation, Patterns) nimaga mas'ulligini bir jumladan yozing.
- Navigation blok markupini yozing. Header part uchun
refsiz, ichida 3 tanavigation-link(Bosh, Blog, Aloqa) bo'lganwp:navigationblok markupini yozing. template-canvasni tushuntiring. Block temada qaysi yadro fayli saytni render qiladi va u qaysi funksiyani chaqiradi? Bir jumlada javob bering.- Block tema shartini ayting. WordPress temani qaysi bitta fayl borligiga qarab "block tema" deb belgilaydi? Klassik vs block farqini shu fakt bilan tushuntiring.
O'rta¶
- Klassik temaga
theme.jsonqo'shing.version 3,appearanceTools: true,layout(contentSize 650px, wideSize 1100px) va 2 rangli palitra (asosiy, matn β default'lar o'chirilgan) bo'lgantheme.jsonyozing. JSON yaroqli bo'lsin. - Navigation blokini
refbilan yozing. Menyu post ID'si 12 bo'lsin; mobil rejimda hamburger menyu (overlayMenu: "mobile"), o'ngga tekislangan flex layout bilan markup yozing. - Editor stillarini ulang. Klassik temaga block editor stillarini ulaydigan
functions.phpqismini yozing (add_theme_support('editor-styles')+add_editor_style()),after_setup_themehookida. - "Clear customizations" ni tushuntiring. Foydalanuvchi Site Editor'da
single.htmlni tahrirladi. Bu o'zgarish qayerda saqlandi? "Clear customizations" bosilsa nima o'chadi va nima qoladi?
Qiyin¶
- Hybrid tema'ning ikki ko'rinishini farqlang. Hybrid temaning ikki ko'rinishini misol bilan tushuntiring: (a) klassik + theme.json, (b) block templates + PHP mantiq. Har biri uchun bitta amaliy stsenariy keltiring.
render_blockfiltri yozing. Block temadacore/navigationblokiga, faqat bosh sahifada (is_front_page()),is-home-navclass qo'shadiganrender_blockfiltrini yozing. Kod sintaksis-toza bo'lsin.- To'liq ko'chish rejasini tuzing. Klassik temani (index.php, single.php, page.php, header.php, footer.php, functions.php) to'liq block temaga ko'chirish rejasini 4 bosqichda yozing. Har bosqichda: nima qo'shiladi, tema turi (klassik/block), va sayt ishlaydimi.
templates/index.htmlni qaysi bosqichda qo'shasiz va nega? - Block templates + theme.json + PHP birlashtirilgan hybrid. Quyidagini tasvirlang (kod va izoh bilan): block tema (
templates/index.htmlbor) lekinfunctions.phpda (a)theme.jsonpalitra ranglarini enqueue qiluvchi inline style, (b)render_blockfiltri bilan custom logika. Nega bunday tema "hybrid" deb ataladi?
Yechimlar¶
Yechim β 1
Appearance > Editor (block tema aktiv bo'lganda ko'rinadi). Besh bo'lim:
- Templates β sahifa shablonlari (index, single, page, 404...) ni tahrirlash.
- Template Parts β qayta ishlatiladigan bo'laklar (header, footer) ni tahrirlash.
- Styles β global ranglar, shriftlar, stillar va style variations.
- Navigation β menyular (
wp_navigationpost type'ida). - Patterns β block to'plamlar (qayta ishlatiluvchi).
Hamma tahrir baza'ga yoziladi, tema fayllari daxlsiz qoladi.
Yechim β 2
<!-- wp:navigation {"layout":{"type":"flex","justifyContent":"left"}} -->
<!-- wp:navigation-link {"label":"Bosh","url":"/"} /-->
<!-- wp:navigation-link {"label":"Blog","url":"/blog"} /-->
<!-- wp:navigation-link {"label":"Aloqa","url":"/aloqa"} /-->
<!-- /wp:navigation -->
ref yo'q β havolalar markup ichida (inline). Bu parse_blocks() bilan tekshirilganda core/navigation ichida 3 ta core/navigation-link bolasini beradi. Foydalanuvchi birinchi saqlaganda WordPress buni wp_navigation postiga ko'chiradi va {"ref":N} ga aylantiradi.
Yechim β 3
Block temada saytni WordPress yadrosidagi wp-includes/template-canvas.php render qiladi. U get_the_block_template_html() funksiyasini chaqiradi β bu tegishli block template'ni (index.html, single.html...) topib HTML'ga aylantiradi va <body> ichiga joylaydi. wp_head() va wp_footer() ham shu faylda. Bu β klassik index.php/header.php/footer.php o'rnini bosadi (lekin tema ichida emas, yadroda).
Yechim β 4
WordPress temani templates/index.html (yoki eski block-templates/index.html) fayli borligiga qarab block tema deb belgilaydi (WP_Theme::is_block_theme()).
- Bor -> block tema, Site Editor yoqiladi,
template-canvas.phprender qiladi. - Yo'q -> klassik tema,
index.phpishlatiladi, template hierarchy (3-bob) amal qiladi.
theme.json ning bor-yo'qligi bu qarorga ta'sir qilmaydi β shu sababli klassik tema theme.json bilan ham mavjud bo'la oladi (hybrid).
Yechim β 5
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"settings": {
"appearanceTools": true,
"layout": {
"contentSize": "650px",
"wideSize": "1100px"
},
"color": {
"defaultPalette": false,
"palette": [
{ "slug": "asosiy", "color": "#2563eb", "name": "Asosiy" },
{ "slug": "matn", "color": "#1e293b", "name": "Matn" }
]
}
}
}
Bu fayl klassik temaga (index.php ishlatadigan) qo'shilsa ham, jonli WP 7.0 da tekshirildi: theme.json to'liq parse qilinadi (contentSize: 650px, 2 palitra rangi), block editor brendni biladi, --wp--preset--color--asosiy CSS o'zgaruvchisi yaratiladi. Tema esa is_block_theme: false bo'lib qoladi (hybrid).
Yechim β 6
<!-- wp:navigation {"ref":12,"overlayMenu":"mobile","layout":{"type":"flex","justifyContent":"right"}} /-->
ref: 12β menyuwp_navigationpost ID'si (havolalar baza'da).overlayMenu: "mobile"β kichik ekranda hamburger menyu, kattada oddiy.layoutβ flex, o'ngga tekislangan.
O'z-o'zini yopuvchi (/-->), chunki havolalar markupda emas, baza'da. ref va overlayMenu atributlari core/navigation blokida mavjudligi tekshirilgan.
Yechim β 7
<?php
add_action( 'after_setup_theme', 'mytheme_editor_styles' );
function mytheme_editor_styles() {
add_theme_support( 'editor-styles' );
add_editor_style( 'assets/editor.css' );
}
add_theme_support('editor-styles') WordPress'ga tema'ning maxsus editor stilini qabul qilishini aytadi; add_editor_style('assets/editor.css') esa o'sha CSS faylni block editor ichiga ulaydi. Natijada post yozayotgan foydalanuvchi tema ko'rinishini editor ichida ham ko'radi. Bu klassik temada ham, block temada ham ishlaydi. after_setup_theme β to'g'ri hook (9-bob). Funksiyalar jonli WP 7.0 da mavjud.
Yechim β 8
- Qayerda saqlandi: o'zgarish tema fayliga (
templates/single.html) emas, baza'ga,wp_templatepost type'iga yoziladi. Bu fayl ustiga "override qatlam" qo'yadi β WordPress shablonni ko'rsatishda avval baza'dagi versiyani ishlatadi. - "Clear customizations" bosilsa: faqat baza'dagi
wp_templateoverride yozuvi o'chadi. Tema faylidagisingle.html(default) daxlsiz qoladi β WordPress qaytadan unga murojaat qiladi. Ya'ni shablon asl tema versiyasiga qaytadi, fayl hech qachon o'chmaydi.
Yechim β 9
(a) Klassik + theme.json: tema index.php/single.php (PHP shablonlar) ishlatadi, lekin theme.json qo'shilgan. is_block_theme: false, lekin block editor palitra/sozlamalarni biladi.
- Stsenariy: mavjud katta klassik tema'ga brend palitra va CSS o'zgaruvchilarini tez qo'shish β PHP shablonlarni qayta yozmasdan.
(b) Block templates + PHP mantiq: tema templates/*.html (block shablonlar) ishlatadi, lekin functions.php da jiddiy PHP logika bor (hooklar, render_block, custom funksiyalar). is_block_theme: true.
- Stsenariy: dizayn Site Editor'da (vizual, mijoz tahrirlaydi), lekin biznes-mantiq β masalan foydalanuvchi roliga qarab kontent ko'rsatish, tashqi API'dan ma'lumot β PHP'da.
Ikkalasi ham "hybrid", chunki klassik (PHP) va block (theme.json / HTML templates) yondashuvlarini birlashtiradi.
Yechim β 10
<?php
add_filter( 'render_block', 'mytheme_home_nav_class', 10, 2 );
function mytheme_home_nav_class( $block_content, $block ) {
if ( 'core/navigation' === $block['blockName'] && is_front_page() ) {
$block_content = str_replace(
'wp-block-navigation',
'wp-block-navigation is-home-nav',
$block_content
);
}
return $block_content;
}
render_block filtri har blokning HTML chiqishini PHP'da o'zgartiradi. Bu yerda: blok core/navigation bo'lsa va joriy sahifa bosh sahifa bo'lsa (is_front_page()), navigation'ning asosiy class'iga is-home-nav qo'shamiz. Boshqa sahifalarda yoki boshqa bloklarda hech narsa o'zgarmaydi. Kod php -l bilan tekshirilgan (shu naqsh jonli WP'da sintaksis-toza). 4-argument (10, 2) β prioritet va argumentlar soni (9-bob).
Yechim β 11
To'liq ko'chish rejasi (4 bosqich):
| Bosqich | Nima qo'shiladi | Tema turi | Sayt ishlaydimi |
|---|---|---|---|
| 1 | theme.json (settings: palitra, layout) |
Klassik | Ha β index.php render qiladi, block editor brendni biladi |
| 2 | theme.json styles + editor-styles (functions.php) |
Klassik | Ha β frontend stilning bir qismi theme.json'ga ko'chadi |
| 3 | templates/page.html, single.html, archive.html, parts/header.html, parts/footer.html |
Klassik (hali) | Ha β index.html yo'qligi sababli WP klassik shablonlarga tushadi |
| 4 | templates/index.html + eski *.php shablonlarni olib tashlash |
Block | Ha β endi to'liq block, Site Editor yoqiladi |
templates/index.html ni 4-bosqichda (oxirida) qo'shaman, chunki u paydo bo'lishi bilan WordPress temani block deb belgilaydi (is_block_theme: true) va PHP shablonlarni e'tiborsiz qoldiradi. Agar uni erta qo'shsam, boshqa block shablonlar hali yo'qligi sababli sayt yarim-block holatda buziladi. Shuning uchun avval boshqa hamma block shablon/part tayyor bo'lsin, keyin index.html bilan "kalitni burab", temani block'ga o'tkazaman. functions.php hamma bosqichda qoladi.
Yechim β 12
Block tema (templates/index.html bor -> is_block_theme: true), lekin functions.php da klassik PHP mantiq:
<?php
// (a) theme.json palitrasiga asoslangan inline CSS frontend'ga ulash.
add_action( 'wp_enqueue_scripts', 'mytheme_brand_css' );
function mytheme_brand_css() {
$css = ':root { --brand-accent: var(--wp--preset--color--asosiy); }';
wp_register_style( 'mytheme-brand', false );
wp_enqueue_style( 'mytheme-brand' );
wp_add_inline_style( 'mytheme-brand', $css );
}
// (b) render_block bilan custom logika: maxsus postlarga belgi qo'yish.
add_filter( 'render_block', 'mytheme_highlight_featured', 10, 2 );
function mytheme_highlight_featured( $block_content, $block ) {
if ( 'core/post-title' === $block['blockName'] && is_sticky() ) {
$block_content = str_replace(
'wp-block-post-title',
'wp-block-post-title is-featured',
$block_content
);
}
return $block_content;
}
Nega "hybrid": tema dizayni block bilan (HTML templates, theme.json β Site Editor'da tahrirlanadi), lekin xatti-harakat va qo'shimcha mantiq klassik PHP hook tizimi bilan (wp_enqueue_scripts, wp_add_inline_style, render_block). (a) theme.json'ning CSS o'zgaruvchisini (--wp--preset--color--asosiy, 16-bob) PHP orqali qayta ishlatadi; (b) blok chiqishini PHP shartiga qarab o'zgartiradi. Ikki dunyoning eng yaxshisi birlashgani uchun "hybrid". Kod naqshlari php -l bilan sintaksis-toza tekshirilgan.
β¬ οΈ Oldingi: 20 β Block patterns Β· π README Β· Keyingi: 22 β Custom blok yaratish asoslari β‘οΈ