{"id":380,"date":"2026-03-05T11:24:05","date_gmt":"2026-03-05T10:24:05","guid":{"rendered":"https:\/\/helloblog.io\/hu\/php-only-blokk-regisztracio-wordpressben\/"},"modified":"2026-03-05T11:24:05","modified_gmt":"2026-03-05T10:24:05","slug":"php-only-blokk-regisztracio-wordpressben","status":"publish","type":"post","link":"https:\/\/helloblog.io\/hu\/php-only-blokk-regisztracio-wordpressben\/","title":{"rendered":"PHP-only blokkok WordPress-ben: egyszer\u0171 blokkok regisztr\u00e1ci\u00f3ja JavaScript n\u00e9lk\u00fcl"},"content":{"rendered":"\n<p>A WordPress blokkszerkeszt\u0151 (Gutenberg) vil\u00e1g\u00e1ban sok\u00e1ig az volt az alapfel\u00e1ll\u00e1s, hogy ha saj\u00e1t blokkot akarsz, akkor ahhoz JavaScript oldalon is hozz\u00e1 kell ny\u00falnod: blokkregisztr\u00e1ci\u00f3, editor UI, build folyamat, csomagkezel\u00e9s, stb. Ez teljesen indokolt a kifejezetten interakt\u00edv, kliensoldali \u00e9lm\u00e9nyt ig\u00e9nyl\u0151 blokkokn\u00e1l, de rengeteg olyan val\u00f3s ig\u00e9ny van, ahol t\u00fal nagy \u00e1gy\u00fa ver\u00e9bre.<\/p>\n\n\n\n<p>Most m\u00e1r lehet\u0151s\u00e9g van <em>egyszer\u0171<\/em> blokkok l\u00e9trehoz\u00e1s\u00e1ra kiz\u00e1r\u00f3lag PHP-val, kifejezetten olyan esetekre, amikor a blokk szerveroldali renderel\u00e9st (server-side rendering) haszn\u00e1l, \u00e9s nem c\u00e9l a magas interaktivit\u00e1s. Ez nem a klasszikus kliensoldali blokkparadigma lev\u00e1lt\u00e1s\u00e1ra k\u00e9sz\u00fclt, \u00e9s nem is az a c\u00e9l, hogy ugyanannyira \u201efeature-rich\u201d legyen, mint egy teljes \u00e9rt\u00e9k\u0171 JS-es blokk. Viszont sok projektn\u00e9l pont el\u00e9g, \u00e9s jelent\u0151sen cs\u00f6kkentheti a komplexit\u00e1st \u2013 k\u00fcl\u00f6n\u00f6sen klasszikus t\u00e9m\u00e1k (classic themes) vagy er\u0151sen szervervez\u00e9relt munkafolyamatok mellett.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mire j\u00f3 a PHP-only blokkregisztr\u00e1ci\u00f3 (\u00e9s mire nem)?<\/h2>\n\n\n\n<p>A PHP-only megk\u00f6zel\u00edt\u00e9s l\u00e9nyege: a blokkot <code>register_block_type()<\/code> seg\u00edts\u00e9g\u00e9vel regisztr\u00e1lod, megadod az attrib\u00fatumokat \u00e9s egy k\u00f6telez\u0151 <code>render_callback<\/code>-et, a szerkeszt\u0151 pedig \u2013 amennyire tud \u2013 automatikusan megjelen\u00edt szerkeszthet\u0151 vez\u00e9rl\u0151ket az Inspector Controls oldals\u00e1vban (a jobb oldali blokkbe\u00e1ll\u00edt\u00e1sokn\u00e1l). A blokk megjelen\u00edt\u00e9se a szerveren t\u00f6rt\u00e9nik, teh\u00e1t az editorban a m\u00f3dos\u00edt\u00e1sok kiszolg\u00e1l\u00e1sa is szerveroldali renderhez k\u00f6t\u0151dik.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Olyan blokkokhoz ide\u00e1lis, amik f\u0151leg be\u00e1ll\u00edt\u00e1sokb\u00f3l \u00e9s szerveroldali HTML kimenetb\u0151l \u00e1llnak (pl. \u201eauthor box\u201d, CTA, egyszer\u0171 list\u00e1z\u00f3k, t\u00e9maspecifikus dobozok).<\/li>\n\n\n<li>Nem arra k\u00e9sz\u00fclt, hogy er\u0151sen interakt\u00edv, kliensoldali logik\u00e1t ig\u00e9nyl\u0151 blokkokat v\u00e1lts ki.<\/li>\n\n\n<li>Nem c\u00e9l, hogy hossz\u00fa t\u00e1von ugyanazt a funkcionalit\u00e1st adja, mint a teljes \u00e9rt\u00e9k\u0171 JS-es block API (teh\u00e1t korl\u00e1tokkal kell sz\u00e1molni).<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Hogyan m\u0171k\u00f6dik: <code>autoRegister<\/code> a <code>register_block_type()<\/code>-ban<\/h2>\n\n\n\n<p>A haszn\u00e1lat kulcsa, hogy a <code>register_block_type()<\/code> h\u00edv\u00e1sban a <code>supports<\/code> t\u00f6mbben bekapcsolod az <code>autoRegister<\/code> z\u00e1szl\u00f3t, \u00e9s emellett <em>k\u00f6telez\u0151en<\/em> megadsz egy <code>render_callback<\/code> f\u00fcggv\u00e9nyt is. Ett\u0151l a blokk JavaScript-es regisztr\u00e1ci\u00f3 n\u00e9lk\u00fcl is meg fog jelenni a szerkeszt\u0151ben.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;?php\n\nfunction gutenberg_register_php_only_blocks() {\n    register_block_type(\n        'my-plugin\/example',\n        array(\n            'title'           =&gt; 'My Example Block',\n            'attributes'      =&gt; array(\n                'title'   =&gt; array(\n                    'type'    =&gt; 'string',\n                    'default' =&gt; 'Hello World',\n                ),\n                'count'   =&gt; array(\n                    'type'    =&gt; 'integer',\n                    'default' =&gt; 5,\n                ),\n                'enabled' =&gt; array(\n                    'type'    =&gt; 'boolean',\n                    'default' =&gt; true,\n                ),\n                'size'    =&gt; array(\n                    'type'    =&gt; 'string',\n                    'enum'    =&gt; array( 'small', 'medium', 'large' ),\n                    'default' =&gt; 'medium',\n                ),\n            ),\n            'render_callback' =&gt; function ( $attributes ) {\n                return sprintf(\n                    '&lt;div&gt;%s: %d items (%s)&lt;\/div&gt;',\n                    esc_html( $attributes['title'] ),\n                    $attributes['count'],\n                    $attributes['size']\n                );\n            },\n            'supports'        =&gt; array(\n                'autoRegister' =&gt; true,\n            ),\n        )\n    );\n}\n\nadd_action( 'init', 'gutenberg_register_php_only_blocks' );\n\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#F97583\">&#x3C;?<\/span><span style=\"color:#79B8FF\">php<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">function<\/span><span style=\"color:#B392F0\"> gutenberg_register_php_only_blocks<\/span><span style=\"color:#E1E4E8\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">    register_block_type<\/span><span style=\"color:#E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">        'my-plugin\/example'<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#79B8FF\">        array<\/span><span style=\"color:#E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">            'title'<\/span><span style=\"color:#F97583\">           =><\/span><span style=\"color:#9ECBFF\"> 'My Example Block'<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">            'attributes'<\/span><span style=\"color:#F97583\">      =><\/span><span style=\"color:#79B8FF\"> array<\/span><span style=\"color:#E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                'title'<\/span><span style=\"color:#F97583\">   =><\/span><span style=\"color:#79B8FF\"> array<\/span><span style=\"color:#E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                    'type'<\/span><span style=\"color:#F97583\">    =><\/span><span style=\"color:#9ECBFF\"> 'string'<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                    'default'<\/span><span style=\"color:#F97583\"> =><\/span><span style=\"color:#9ECBFF\"> 'Hello World'<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                ),<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                'count'<\/span><span style=\"color:#F97583\">   =><\/span><span style=\"color:#79B8FF\"> array<\/span><span style=\"color:#E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                    'type'<\/span><span style=\"color:#F97583\">    =><\/span><span style=\"color:#9ECBFF\"> 'integer'<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                    'default'<\/span><span style=\"color:#F97583\"> =><\/span><span style=\"color:#79B8FF\"> 5<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                ),<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                'enabled'<\/span><span style=\"color:#F97583\"> =><\/span><span style=\"color:#79B8FF\"> array<\/span><span style=\"color:#E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                    'type'<\/span><span style=\"color:#F97583\">    =><\/span><span style=\"color:#9ECBFF\"> 'boolean'<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                    'default'<\/span><span style=\"color:#F97583\"> =><\/span><span style=\"color:#79B8FF\"> true<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                ),<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                'size'<\/span><span style=\"color:#F97583\">    =><\/span><span style=\"color:#79B8FF\"> array<\/span><span style=\"color:#E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                    'type'<\/span><span style=\"color:#F97583\">    =><\/span><span style=\"color:#9ECBFF\"> 'string'<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                    'enum'<\/span><span style=\"color:#F97583\">    =><\/span><span style=\"color:#79B8FF\"> array<\/span><span style=\"color:#E1E4E8\">( <\/span><span style=\"color:#9ECBFF\">'small'<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">'medium'<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">'large'<\/span><span style=\"color:#E1E4E8\"> ),<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                    'default'<\/span><span style=\"color:#F97583\"> =><\/span><span style=\"color:#9ECBFF\"> 'medium'<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                ),<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">            ),<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">            'render_callback'<\/span><span style=\"color:#F97583\"> =><\/span><span style=\"color:#F97583\"> function<\/span><span style=\"color:#E1E4E8\"> ( $attributes ) {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">                return<\/span><span style=\"color:#79B8FF\"> sprintf<\/span><span style=\"color:#E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                    '&#x3C;div>%s: %d items (%s)&#x3C;\/div>'<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">                    esc_html<\/span><span style=\"color:#E1E4E8\">( $attributes[<\/span><span style=\"color:#9ECBFF\">'title'<\/span><span style=\"color:#E1E4E8\">] ),<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                    $attributes[<\/span><span style=\"color:#9ECBFF\">'count'<\/span><span style=\"color:#E1E4E8\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                    $attributes[<\/span><span style=\"color:#9ECBFF\">'size'<\/span><span style=\"color:#E1E4E8\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">                );<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">            },<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">            'supports'<\/span><span style=\"color:#F97583\">        =><\/span><span style=\"color:#79B8FF\"> array<\/span><span style=\"color:#E1E4E8\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                'autoRegister'<\/span><span style=\"color:#F97583\"> =><\/span><span style=\"color:#79B8FF\"> true<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">            ),<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    );<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">add_action<\/span><span style=\"color:#E1E4E8\">( <\/span><span style=\"color:#9ECBFF\">'init'<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">'gutenberg_register_php_only_blocks'<\/span><span style=\"color:#E1E4E8\"> );<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>A fenti minta j\u00f3l mutatja a tipikus fel\u00e1ll\u00e1st: van n\u00e9h\u00e1ny attrib\u00fatum (string, integer, boolean, enum-os string), \u00e9s ezekb\u0151l a <code>render_callback<\/code> legy\u00e1rtja a HTML-t. A szerkeszt\u0151 pedig a blokk jobb oldali be\u00e1ll\u00edt\u00e1sain\u00e1l pr\u00f3b\u00e1l automatikus mez\u0151ket gener\u00e1lni az attrib\u00fatumok m\u00f3dos\u00edt\u00e1s\u00e1hoz.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"998\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/2\/2026\/03\/php-block-autoregister-1024x998-1.png\" alt=\"Automatikusan gener\u00e1lt blokk-be\u00e1ll\u00edt\u00e1sok az Inspector Controls oldals\u00e1vban PHP-only blokkhoz\" class=\"wp-image-379\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/2\/2026\/03\/php-block-autoregister-1024x998-1.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/2\/2026\/03\/php-block-autoregister-1024x998-1-300x292.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/2\/2026\/03\/php-block-autoregister-1024x998-1-768x749.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/2\/2026\/03\/php-block-autoregister-1024x998-1-400x390.png 400w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">A szerkeszt\u0151 a blokk attrib\u00fatumai alapj\u00e1n automatikusan \u00e1ll\u00edt \u00f6ssze vez\u00e9rl\u0151ket az oldals\u00e1vban, ahol ez t\u00e1mogatott. \u2014 <em>Forr\u00e1s: make.wordpress.org<\/em><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Automatikus Inspector mez\u0151k: mikor m\u0171k\u00f6dik, \u00e9s mikor nem?<\/h2>\n\n\n\n<p>Az egyik legk\u00e9nyelmesebb r\u00e9sze ennek az eg\u00e9sznek, hogy a WordPress \u2013 ahol tudja \u2013 automatikusan legener\u00e1lja a megfelel\u0151 vez\u00e9rl\u0151ket (p\u00e9ld\u00e1ul sz\u00f6vegmez\u0151, sz\u00e1mmez\u0151, checkbox, leg\u00f6rd\u00fcl\u0151) az Inspector Controls oldals\u00e1vban. Ett\u0151l lesz igaz\u00e1n \u201ePHP-only\u201d \u00e9lm\u00e9ny: nincs k\u00fcl\u00f6n JS UI-k\u00f3d, m\u00e9gis van szerkeszthet\u0151 be\u00e1ll\u00edt\u00e1si fel\u00fclet.<\/p>\n\n\n\n<p>Fontos megk\u00f6t\u00e9sek:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Nem gener\u00e1l\u00f3dik vez\u00e9rl\u0151 azokra az attrib\u00fatumokra, amelyek <code>local<\/code> szerepk\u00f6rrel (role) rendelkeznek.<\/li>\n\n\n<li>Nem gener\u00e1l\u00f3dik vez\u00e9rl\u0151 olyan attrib\u00fatumt\u00edpusokra, amelyeket ez a rendszer nem t\u00e1mogat.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Milyen attrib\u00fatumt\u00edpusok t\u00e1mogatottak jelenleg?<\/h2>\n\n\n\n<p>Jelenleg a t\u00e1mogat\u00e1s kifejezetten sz\u0171k. Az automatikusan gener\u00e1lt mez\u0151k oldal\u00e1r\u00f3l n\u00e9zve ezekre \u00e9rdemes \u00e9p\u00edteni:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>string<\/code><\/li>\n\n\n<li><code>number<\/code><\/li>\n\n\n<li><code>integer<\/code><\/li>\n\n\n<li><code>boolean<\/code><\/li>\n\n<\/ul>\n\n\n\n<p>Van m\u00e9g egy nagyon l\u00e9nyeges felt\u00e9tel: az attrib\u00fatumok nem lehetnek \u201esourced\u201d attrib\u00fatumok. Magyarul: az \u00e9rt\u00e9keknek a blokkhat\u00e1ron bel\u00fcli JSON-ban kell t\u00e1rol\u00f3dniuk (ez az alap\u00e9rtelmez\u00e9s), \u00e9s nem lehet az, hogy az attrib\u00fatum \u00e9rt\u00e9ke a mentett HTML-b\u0151l van visszafejtve\/serializ\u00e1lva. Ez a korl\u00e1toz\u00e1s t\u00f6bb k\u00e9s\u0151bbi k\u00e9pess\u00e9g (p\u00e9ld\u00e1ul \u201esave jelleg\u0171\u201d megold\u00e1sok) el\u0151tt is falat h\u00faz.<\/p>\n\n\n\n<p>Ha szeretn\u00e9l belen\u00e9zni, a kapcsol\u00f3d\u00f3 bels\u0151 implement\u00e1ci\u00f3 egyik kapaszkod\u00f3ja ez a f\u00fcggv\u00e9nyr\u00e9szlet: <a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/db6e7acddf82cf14d3de71a06588dc2ecd236c94\/src\/wp-includes\/block-supports\/auto-register.php#L41-L53\">wp_mark_auto_generate_control_attributes()#L41-L53<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Inner blocks (be\u00e1gyazott blokkok) t\u00e1mogat\u00e1sa: jelenleg nincs<\/h2>\n\n\n\n<p>Gyakori k\u00e9rd\u00e9s, hogy lehet-e ezzel a m\u00f3dszerrel kont\u00e9ner blokkokat csin\u00e1lni, amik m\u00e1s blokkokat fogadnak (InnerBlocks). A v\u00e1lasz jelenleg: nem, \u00e9s nincs konkr\u00e9t, egy\u00e9rtelm\u0171 ir\u00e1nykijel\u00f6l\u00e9s arra, hogy ez mikor vagy hogyan lenne megoldva.<\/p>\n\n\n\n<p>A t\u00e9ma az\u00e9rt \u00f6sszetett, mert a blokkok egym\u00e1sba \u00e1gyaz\u00e1sa nem csak annyi, hogy \u201elegyen egy kont\u00e9ner\u201d. P\u00e9ld\u00e1ul ilyen k\u00e9rd\u00e9sek mer\u00fclnek fel:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Milyen konkr\u00e9t be\u00e1gyaz\u00e1si (nesting) forgat\u00f3k\u00f6nyveket v\u00e1rn\u00e1nak a fejleszt\u0151k a PHP-only regisztr\u00e1ci\u00f3val?<\/li>\n\n\n<li>Milyen blokk-szint\u0171 \u00e9s dokumentum-szint\u0171 szemantik\u00e1t v\u00e1runk el, \u00e9s ez milyen adatb\u00e1zis-strukt\u00far\u00e1t felt\u00e9telez?<\/li>\n\n\n<li>Milyen kapcsolatokat k\u00e9pzel\u00fcnk el blokk t\u00edpusok k\u00f6z\u00f6tt? P\u00e9ld\u00e1ul egy konkr\u00e9t parent P t\u00edpus, ami csak egy konkr\u00e9t child C p\u00e9ld\u00e1nyokat tartalmaz, \u00e9s mindkett\u0151 PHP-only regisztr\u00e1ci\u00f3t haszn\u00e1l? Vagy egy PHP-val gener\u00e1lt kont\u00e9ner, ami b\u00e1rmilyen blokkot befogadhat?<\/li>\n\n\n<li>Milyen legyen a fejleszt\u0151i ergonomika a k\u00f3doldalon: mit jelent ez egy kont\u00e9ner <code>render_callback<\/code>-j\u00e9ben?<\/li>\n\n\n<li>Milyen legyen a kliensoldali ergonomika, ha azt is figyelembe vessz\u00fck, hogy a PHP-only blokkok szerkeszt\u0151beli v\u00e1ltoz\u00e1sai szerver roundtripet ig\u00e9nyelnek (SSR miatt), mik\u00f6zben a szerkeszt\u0151 v\u00e1szna alapvet\u0151en er\u0151sen reakt\u00edv blokkokra van kital\u00e1lva?<\/li>\n\n\n<li>\u00c9s a legnehezebb k\u00e9rd\u00e9s: mi\u00e9rt lenne a PHP-only regisztr\u00e1ci\u00f3ra \u00e9p\u00edtett megold\u00e1s meggy\u0151z\u0151bb, mint a megl\u00e9v\u0151 \u2013 \u00e9s j\u00f3val er\u0151sebb \u2013 kliensoldali m\u00f3dszertan?<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Van-e \u201esave\u201d funkci\u00f3, ami a post_content-be mentene render_callback helyett?<\/h2>\n\n\n\n<p>Ebben a fel\u00e1ll\u00e1sban nincs <code>save<\/code> funkci\u00f3. A blokk outputja a <code>render_callback<\/code>-on kereszt\u00fcl k\u00e9sz\u00fcl, \u00e9s nincs olyan mechanizmus, amivel ugyanezt a modellt \u201esave a post_content-be\u201d ir\u00e1nyba \u00e1t lehetne ford\u00edtani.<\/p>\n\n\n\n<p>Ennek oka nem csak term\u00e9kd\u00f6nt\u00e9s, hanem technikai neh\u00e9zs\u00e9g is: egy ilyen l\u00e9p\u00e9s t\u00f6bb probl\u00e9m\u00e1t hozna mag\u00e1val, p\u00e9ld\u00e1ul azt, hogyan lehet teljes\u00edtm\u00e9nyesen \u00e9s megb\u00edzhat\u00f3an szerveroldalon \u201esourcingolni\u201d attrib\u00fatumokat HTML-b\u0151l. (A blokk attrib\u00fatumok value source t\u00e9m\u00e1j\u00e1hoz: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/#value-source\">Block attributes \u2013 value source<\/a>.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mit v\u00e1rhatsz a j\u00f6v\u0151t\u0151l?<\/h2>\n\n\n\n<p>Az <code>autoRegister<\/code> k\u00e9pess\u00e9g jelenleg sz\u00e1nd\u00e9kosan egyszer\u0171. Felmer\u00fclt, hogy a Gutenberg-ben k\u00e9sz\u00fcl\u0151 Fields API \u00e9s az \u00fagynevezett block fields ir\u00e1nyok id\u0151vel seg\u00edthetnek abban, hogy az <code>autoRegister<\/code> t\u00f6bb mez\u0151t\u00edpust is k\u00e9pes legyen automatikusan t\u00e1mogatni. Ett\u0151l f\u00fcggetlen\u00fcl erre most korai b\u00e1rmit \u00edg\u00e9rni; egyel\u0151re a fenti alapt\u00edpusokra \u00e9s a JSON-ban t\u00e1rolt attrib\u00fatumokra \u00e9rdemes tervezni.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00d6sszefoglal\u00e1s: mikor \u00e9rdemes ezt v\u00e1lasztani?<\/h2>\n\n\n\n<p>Ha olyan blokkot szeretn\u00e9l, ami alapvet\u0151en szerveroldali outputot ad (SSR), \u00e9s a szerkeszt\u0151ben el\u00e9g n\u00e9h\u00e1ny egyszer\u0171 be\u00e1ll\u00edt\u00e1s (sz\u00f6veg, sz\u00e1m, boolean, select), akkor a PHP-only blokkregisztr\u00e1ci\u00f3val rengeteg j\u00e1rul\u00e9kos terhet le tudsz venni a projektr\u0151l. Klasszikus t\u00e9m\u00e1khoz, kisebb \u00fcgyf\u00e9lig\u00e9nyek gyors kiel\u00e9g\u00edt\u00e9s\u00e9hez, illetve \u201esz\u0171k c\u00e9l\u00fa\u201d saj\u00e1t blokkokhoz ez kifejezetten j\u00f3 eszk\u00f6z \u2013 mik\u00f6zben a komoly, interakt\u00edv blokkokhoz tov\u00e1bbra is a hagyom\u00e1nyos, JS-es megk\u00f6zel\u00edt\u00e9s marad az igaz\u00e1n er\u0151s \u00fat.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Hivatkoz\u00e1sok \/ Forr\u00e1sok<\/h2>\n                <ul class=\"references-list\"><li><a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/03\/php-only-block-registration\/\" target=\"_blank\" rel=\"noopener noreferrer\">PHP-only block registration<\/a><\/li><li><a href=\"https:\/\/core.trac.wordpress.org\/ticket\/64639\" target=\"_blank\" rel=\"noopener noreferrer\">#64639<\/a><\/li><li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/db6e7acddf82cf14d3de71a06588dc2ecd236c94\/src\/wp-includes\/block-supports\/auto-register.php#L41-L53\" target=\"_blank\" rel=\"noopener noreferrer\">wp_mark_auto_generate_control_attributes()#L41-L53<\/a><\/li><li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/#value-source\" target=\"_blank\" rel=\"noopener noreferrer\">Block attributes \u2013 value source<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Ha eddig az\u00e9rt ker\u00fclted a Gutenberg-blokkokat, mert nem akart\u00e1l build l\u00e9p\u00e9st, Node-ot \u00e9s JS-regisztr\u00e1ci\u00f3t, van egy j\u00f3 h\u00edr: bizonyos blokkokat m\u00e1r tiszt\u00e1n PHP-val is fel tudsz venni a szerkeszt\u0151be.<\/p>\n","protected":false},"author":5,"featured_media":378,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[163,162,23,52],"class_list":["post-380","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-okoszisztema","tag-block-development","tag-blokkszerkeszto","tag-gutenberg","tag-php"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/hu\/wp-json\/wp\/v2\/posts\/380","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/hu\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/hu\/wp-json\/wp\/v2\/comments?post=380"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/hu\/wp-json\/wp\/v2\/posts\/380\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/hu\/wp-json\/wp\/v2\/media\/378"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/hu\/wp-json\/wp\/v2\/media?parent=380"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/hu\/wp-json\/wp\/v2\/categories?post=380"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/hu\/wp-json\/wp\/v2\/tags?post=380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}