{"id":233835,"date":"2023-02-23T18:01:00","date_gmt":"2023-02-23T15:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233835"},"modified":"2023-02-23T18:05:44","modified_gmt":"2023-02-23T15:05:44","slug":"opetus-looge-liugur-duenaamilise-gutenbergi-plokina","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/opetus-looge-liugur-duenaamilise-gutenbergi-plokina\/","title":{"rendered":"\u00d5petus: looge liugur d\u00fcnaamilise Gutenbergi plokina"},"content":{"rendered":"\n<p>Selles \u00f5petuses k\u00e4sitletakse d\u00fcnaamilise WordPressi Gutenbergi ploki loomist. L\u00f5pptulemus on liugur, mis n\u00e4itab valitud kategooria postituste esilet\u00f5stetud pilti. Kood h\u00f5lmab k\u00f5rgema j\u00e4rgu komponendi (<code>withSelect<\/code>) kasutamist k\u00f5igi kategooriate toomiseks plokiredaktoris.<\/p>\n<h2>Mida me teeme<\/h2>\n<p>Plokk renderdab lihtsa liuguri, kasutades skripti <a href=\"http:\/\/jquery.malsup.com\/cycle2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery Cycle2<\/a>. Kuid v\u00f5ite kasutada mis tahes muud liuguri skripti. Plokk kuvab redaktoris k\u00f5igi kategooriate loendi, mis v\u00f5imaldab kasutajal valida \u00fche kategooria. Kui kuvate ploki kasutajaliideses, toob see d\u00fcnaamiliselt postitusi valitud kategooriast ja kuvab nende esilet\u00f5stetud pilte slaididena. See \u00f5petus muudab selle \u00fcsna lihtsaks, v\u00f5imaldades teil liugurit vastavalt soovile laiendada ja reguleerida.<\/p>\n<p>Olen otsustanud slaidiesitlust redaktoris mitte renderdada. Tavaliselt peaksite veenduma, et redigeerija ja kasutajaliidese renderdus on sama. Kuid liuguri puhul meeldib mulle asi lihtsana hoida, et mitte tekitada kasutajat redaktoris pidevate animatsioonidega.<\/p>\n<p>Plokis on ainult kaks seadet; kategooria valik ja slaidide (postituste) arv. Soovitan lisada rohkem s\u00e4tteid, nagu slaidikiirus, pillide kuvamise s\u00e4tted, nooled, tekst ja muud t\u00fc\u00fcpilised liuguri s\u00e4tted. Nende seadete ise lisamine peaks olema \u00fcsna lihtne.<\/p>\n<p>Kogu kood on kirjutatud Javascript ES6 \/ ES2015+. Pidage meeles, et see kood vajab l\u00f5plike Javascripti failide teisendamiseks ja koostamiseks Babelit. Kui te ei tea, kuidas seda teha, vaadake allolevat juhendit.<\/p>\n<h2>Seadistage failid<\/h2>\n<p>Selles n\u00e4ites loome ploki teema sees. Teemakaustas on mul alamkaust &#8216; <code>gutenberg\/<\/code>&#8216;, kuhu olen paigutanud oma <code>package.json<\/code>ja <code>webpack-config.js<\/code>. Selle kausta alamkaustas &quot; <code>src\/<\/code>&quot; paigutan k\u00f5ik oma ehitusfailid. Minu veebipaketi konfiguratsioon on seadistatud paigutama ehitusfailid minu teema alamkausta &quot; <code>assets\/js\/<\/code>&quot;.<\/p>\n<p>Looge uus t\u00fchi l\u00e4htefail <code>theme-folder\/gutenberg\/src\/block-slider.js<\/code>ja seadistage Webpack, et luua ehitusfail asukohta <code>theme-folder\/assets\/js\/block-slider.js<\/code>. Saate asukohti ja\/v\u00f5i failinimesid vastavalt soovile muuta, lihtsalt \u00e4rge unustage allolevat koodi kohandada.<\/p>\n<p>Samuti peame alla laadima vajaliku liuguri skripti. Cycle2 saate <a href=\"http:\/\/jquery.malsup.com\/cycle2\/download\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">alla laadida sellelt lingilt<\/a> v\u00f5i kasutada m\u00f5nda muud slaidiskripti ja kohandada allolevat koodi. Asetan <code>jquery.cycle2.min.js<\/code>faili oma teemakausta <code>\/assets\/js\/<\/code>kausta.<\/p>\n<p>Valmistan ette ka v\u00e4ikese CSS-faili, mis laaditakse ainult redaktorisse. Teeme vaid v\u00e4ikese stiilit\u00fcki, et kategooria oleks optimaalne. Loon t\u00fchja faili <code>editor-block-slider.css<\/code>ja asetan selle kausta <code>theme-folder\/assets\/css\/<\/code>.<\/p>\n<p>L\u00f5puks l\u00e4heme teemasse laaditud PHP-faili juurde. Lihtsuse huvides teen PHP osa teemas <code>functions.php<\/code>.<\/p>\n<h2>Registreerige Gutenbergi plokk PHP-s<\/h2>\n<p>K\u00f5ik Gutenbergi plokid peavad olema registreeritud aadressil <code>[register_block_type](https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/)()<\/code>. Eelistan seda nimetada funktsiooni sees, mis on \u00fchendatud <code>init<\/code>. Esimene parameeter on teie ploki nimi, sealhulgas nimeruum. Otsustasin kutsuda oma liuguri skripti <code>awp\/slider<\/code>(reguleerige nii, nagu soovite). Teine argument on argumentide hulk.<\/p>\n<p>Sama funktsiooni raames registreerin koostamise skripti rakendusega <code>[wp_register_script](https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_script\/)()<\/code>ja oma redaktori CSS-faili <code>[wp_register_style](https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_style\/)()<\/code>. M\u00f5lemad k\u00e4epidemed lisatakse argumentidena vastavalt parameetritele &quot; <code>editor_script<\/code>&quot; ja &quot; <code>editor_style<\/code>&quot;. S\u00f5ltuvuste osas olen lisanud skripti jaoks m\u00f5ned k\u00f5ige elementaarsemad paketid, et tagada meie plokiskripti \u00f5iges j\u00e4rjekorras laadimine. Mis puutub redaktori stiili, siis on &#8216; <code>wp-edit-blocks<\/code>&#8216; kasutamine hea s\u00f5ltuvus, et v\u00e4ltida stiilide \u00fclekirjutamist.<\/p>\n<p>Ja l\u00f5puks, kuna see on d\u00fcnaamiline plokk, peame lisama ka <code>render_callback<\/code>argumendi &quot; &quot;, osutades funktsioonile, mis vastutab ploki esiotsas renderdamise eest.<\/p>\n<pre><code>add_action('init', function() {\n    wp_register_script(\n        'awp-block-slider-js', \n        get_template_directory_uri(). '\/assets\/js\/block-slider.js', \n        ['wp-blocks', 'wp-element', 'wp-editor', 'wp-components', 'wp-data']\n    );\n    wp_register_style(\n        'awp-block-slider-style', \n        get_template_directory_uri(). '\/assets\/css\/editor-block-slider.css', \n        ['wp-edit-blocks']\n    );\n\u00a0\n    register_block_type('awp\/slider', [\n        'editor_script' =&gt; 'awp-block-slider-js',\n        'editor_style' =&gt; 'awp-block-slider-style',\n        'render_callback' =&gt; 'awp_gutenberg_slider_render',\n    ]);\n});<\/code><\/pre>\n<p>L\u00f5puks m\u00e4\u00e4ratleme renderdusfunktsiooni. Funktsiooni tagasihelistamisele saame kaks parameetrit; ploki atribuutide massiiv ja sisemine sisu (selles plokis ei kasutata). Ma lihtsalt tagastan m\u00f5ne n\u00e4ivn\u00f6\u00f6ri. Tuleme tagasi ja t\u00e4psustame renderdusfunktsiooni hiljem. \u00c4rge unustage tagastada stringi, mitte kaja.<\/p>\n<pre><code>function awp_gutenberg_slider_render($attributes, $content) {\n    return 'Slider render comes here.';\n}<\/code><\/pre>\n<p>Tuleme PHP renderdamisfunktsiooni juurde tagasi selle \u00f5petuse l\u00f5pus. N\u00fc\u00fcd on aeg liikuda edasi Javascripti juurde!<\/p>\n<h2>Registreerige kohandatud Gutenbergi plokk Javascriptis<\/h2>\n<p>Avame oma <code>block-slider.js<\/code>l\u00e4htefaili. Siinkohal k\u00e4ivitan skripti (<code>npm run start<\/code>), et muuta k\u00f5ik, mida me selles failis teeme, ehitusfailiks. Peame ploki registreerima, kasutades <code>[registerBlockType](https:\/\/developer.wordpress.org\/block-editor\/developers\/block-api\/block-registration\/)()<\/code>. K\u00f5igi v\u00f5imalike argumentide n\u00e4gemiseks vaadake linki.<\/p>\n<p>Nagu PHP-s otsustasime, <code>register_block_type()<\/code>on meie ploki nimi <code>awp\/slider<\/code>. Nagu eelnevalt mainitud, tahame plokile lisada ka kaks atribuuti: \u00fche valitud termini ID ja teise slaidide arvu jaoks.<\/p>\n<p>Mulle meeldib lisada ka plokkide joondamise funktsionaalsus. See lisatakse automaatselt, lisades objektile &quot; <code>align<\/code>&quot;. <code>supports<\/code>Kui soovite k\u00f5iki plokkide joondusi, v\u00f5ite lihtsalt m\u00e4\u00e4rata <code>align<\/code>v\u00e4\u00e4rtusele T\u00f5ene. Kuid vasakule v\u00f5i paremale joondatud liuguril pole erilist m\u00f5tet, nii et ma m\u00e4\u00e4ratlen konkreetsed plokkide joondamise t\u00fc\u00fcbid, mida see plokk toetab: &quot;Joonda keskele&quot; (&#8216; <code>center<\/code>&#8216;), &quot;Lai laius&quot; (&#8216; <code>wide<\/code>&#8216;) ja &quot; T\u00e4islaius&quot; (&#8216; <code>full<\/code>&#8216;). Samuti lisan <code>align<\/code>meie plokki atribuudina atribuudi &#8216; &#8216;, et m\u00e4\u00e4rata vaikimisi joondus ja muuta see PHP-st k\u00e4ttesaadavaks.<\/p>\n<p>Seadsin ploki <code>edit<\/code>argumendi eraldi komponendiks, mille me j\u00e4rgmisena loome. Ja l\u00f5puks <code>save<\/code>tagastab funktsioon lihtsalt <code>null<\/code>, sest see on d\u00fcnaamiline plokk.<\/p>\n<pre><code>const { __ } = wp.i18n;\nconst { registerBlockType } = wp.blocks;\n\u00a0\nregisterBlockType('awp\/slider', {\n    title: __('AWP Slider', 'awp'),\n    icon: 'slides',\n    category: 'common',\n    supports: {\n        align: ['center', 'wide', 'full']\n    },\n    attributes: {\n        align: {\n            type: 'string',\n            default: 'center'\n        },\n        termId: {\n            type: 'number',\n            default: 0\n        },\n        numSlides: {\n            type: 'number',\n            default: 3\n        },\n    },\n    edit: BlockEdit,\n    save:() =&gt; { return null; }\n});<\/code><\/pre>\n<p>Peame m\u00e4\u00e4ratlema <code>edit<\/code>atribuudi komponendi. Enne registreerimiskoodi defineerin funktsiooni komponendi <code>BlockEdit<\/code>, mis lihtsalt renderdab a <code>div<\/code>ja a <code>Placeholder<\/code>koos n\u00e4iva tekstiga.<\/p>\n<pre><code>const { __ } = wp.i18n;\nconst { registerBlockType } = wp.blocks;\nconst { Placeholder } = wp.components;\nconst BlockEdit = (props) =&gt; {\n    return(\n        &lt;div className={props.className}&gt;\n            &lt;Placeholder\n                label={__('Slider Category', 'awp')}\n            &gt;\n                Select category comes here.\n            &lt;\/Placeholder&gt;\n        &lt;\/div&gt;\n    );\n}\n\u00a0\nregisterBlockType('awp\/slider', {\n    ...<\/code><\/pre>\n<p><code>[Placeholder](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/placeholder)<\/code>on kena komponent ala renderdamiseks s\u00e4tete jaoks \u2013 ja mitte tingimata ploki tegelikuks renderdamiseks. Komponendi sees <code>Placeholder<\/code>renderdame terminite loendi, mille hulgast valida.<\/p>\n<p>Praegu peaks meie plokk olema WordPressis Gutenbergis saadaval! Loome uue postituse, lisame uue ploki ja leiame oma ploki jaotisest \u00dchine. Meie plokk n\u00e4eb praegu v\u00e4lja selline:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d14fb8d7b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d14fb8d7b.png\" alt=\"\u00d5petus: looge liugur d\u00fcnaamilise Gutenbergi plokina\"><\/a><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d150ae184.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d150ae184.png\" alt=\"\u00d5petus: looge liugur d\u00fcnaamilise Gutenbergi plokina\"><\/a><\/p>\n<h2>Inspektori s\u00e4tete lisamine<\/h2>\n<p>Lisame Inspectorile (redaktori parempoolsele k\u00fclgribale) m\u00f5ned s\u00e4tted. Nagu mainitud, on meie plokil ainult \u00fcks seadistus; slaidide arv. Siin soovitan teil lisada liuguriploki jaoks rohkem s\u00e4tteid. \u00c4rge unustage registreerida atribuudid iga lisatava s\u00e4tte jaoks.<\/p>\n<p>Inspektorile millegi lisamiseks kasutame komponenti <code>[InspectorControls](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/block-editor\/src\/components\/inspector-controls)<\/code>( <code>wp.blockEditor<\/code>). Sees renderdame uue kokkupandava jaotise lisamiseks <code>[PanelBody](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/panel#panelbody)<\/code>( ). <code>wp.components<\/code>Seej\u00e4rel renderdame lihtsalt <code>[RangeControl](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/range-control)<\/code>( <code>wp.components<\/code>), et luua sisendseade slaidide arvu valimiseks. Seame miinimumi 1 ja maksimumi 10. \u00dchendame atribuudiga <code>value<\/code>ja <code>onChange<\/code>s\u00fcndmuse <code>numSlides<\/code>.<\/p>\n<pre><code>const { __ } = wp.i18n;\nconst { registerBlockType } = wp.blocks;\nconst { InspectorControls } = wp.blockEditor;\nconst { Placeholder, PanelBody, RangeControl } = wp.components;\n\u00a0\nconst BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    return(\n        &lt;div className={props.className}&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelBody\n                    title={__('Slider Settings', 'awp')}\n                    initialOpen={true}\n                &gt;\n                    &lt;RangeControl\n                        label={__('Number of slides', 'awp')}\n                        value={attributes.numSlides}\n                        onChange={(val) =&gt; setAttributes({ numSlides: val })}\n                        min={1}\n                        max={10}\n                    \/&gt;\n                &lt;\/PanelBody&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;Placeholder\n                ...<\/code><\/pre>\n<p>\u00dclaltoodud koodiga peaksime n\u00fc\u00fcd saama kena jaotise vahemiku liuguriga slaidide arvu m\u00e4\u00e4ramiseks.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d15191aa1.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d15191aa1.png\" alt=\"\u00d5petus: looge liugur d\u00fcnaamilise Gutenbergi plokina\"><\/a><\/p>\n<p>J\u00e4llegi soovitan teil liugurile seadete lisamisega m\u00e4ngida. J\u00e4rgmine samm on elemendi loomine kategooriate loendi renderdamiseks, mille hulgast valida.<\/p>\n<h2>Kategooria valimise komponendi loomine<\/h2>\n<p>Et meie kood oleks korras ja korduvkasutatav, loome kategooriavalija komponendi eraldi failis. Ehitamise kaustas loon uue faili <code>awp-category-picker.js<\/code>.<\/p>\n<p>Selles failis m\u00e4\u00e4ratleme komponendi, mis liigub l\u00e4bi k\u00f5igi WordPressi praeguste kategooriate ja renderdab need mingil viisil. Kategooriate saamiseks peame selle pakkima nn k\u00f5rgema j\u00e4rgu komponendi sisse, mis varustab meie komponenti rekvisiitide kaudu vajalikuga. Selleks kasutame <code>[withSelect](https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-data\/#withSelect)<\/code>. Sees <code>withSelect<\/code>saame esitada taotluse k\u00f5igi WordPressi kategooriate toomiseks, kasutades poevalijat <code>[select](https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-data\/#select)()<\/code>. Saame kasutada:<\/p>\n<pre><code>select('core').getEntityRecords('taxonomy', '&lt;category_slug&gt;', &lt;args&gt;)<\/code><\/pre>\n<p>et tuua k\u00f5ik terminid pakutud taksonoomia n\u00e4lkjas. Kui te ei tunne WordPress Gutenbergi k\u00f5rgema j\u00e4rgu komponente ja selektoreid, on mul postitus, mis selgitab seda kontseptsiooni \u00fcksikasjalikumalt: <a href=\"https:\/\/wordpress.mediadoma.com\/et\/looge-kohandatud-gutenbergi-plokk-10-osa-postituste-ja-korgema-jaergu-komponentide-toomine\/\" title=\"Kohandatud Gutenbergi ploki loomine \u2013 10. osa: Postituste ja k\u00f5rgema j\u00e4rgu komponentide toomine\">Kohandatud Gutenbergi ploki loomine \u2013 10. osa: Postituste ja k\u00f5rgema j\u00e4rgu komponentide toomine<\/a>.<\/p>\n<p>Kuna peame sellest failist komponendi eksportima, asetame avalduse kombinatsiooni <code>withSelect<\/code>ja meie m\u00e4\u00e4ratletud komponendi <code>export default<\/code>. Meie <code>CategorySelect<\/code>komponent lihtsalt tagastab div koos n\u00e4iva tekstiga, et saaksime n\u00e4ha, et see t\u00f6\u00f6tab. <code>withSelect<\/code>Peaks andma prop &quot; <code>terms<\/code>&quot; <code>CategorySelect<\/code>. Lisasin <code>console.log()<\/code>sellele rekvisiidile lisa, et saaksime n\u00e4ha, kas see t\u00f6\u00f6tab.<\/p>\n<pre><code>const { withSelect } = wp.data;\n\u00a0\nconst CategorySelect = (props) =&gt; {\n    console.log(props.terms);\n\u00a0\n    return(\n        &lt;div&gt;This is category select&lt;\/div&gt;\n    );\n}\n\u00a0\nexport default withSelect((select, props) =&gt; {\n    return {\n        terms: select('core').getEntityRecords('taxonomy', 'category', {per_page: -1})\n    }\n})(CategorySelect);<\/code><\/pre>\n<p>Viimane asi, mida peame tegema, on tegelikult importida ja kasutada seda kategooria valija komponenti meie kohandatud plokis.<\/p>\n<p>Tagasi sisse <code>block-slider.js<\/code>peame esmalt importima faili \u00fclaosas oleva komponendi. Ja meie <code>Placeholder<\/code>komponendi sees muudame komponendi lihtsalt v\u00e4lja.<\/p>\n<pre><code>const { Placeholder, PanelBody, RangeControl } = wp.components;\n\u00a0\nimport CategorySelect from '.\/awp-category-picker';\n\u00a0\nconst BlockEdit = (props) =&gt; {\n        ...\n            &lt;Placeholder\n                label={__('Slider Category', 'awp')}\n            &gt;\n                &lt;CategorySelect \n                \/&gt;\n            &lt;\/Placeholder&gt;\n        ...<\/code><\/pre>\n<p>\u00dclaltoodud koodiga peaks teie plokk n\u00fc\u00fcd renderdama <code>CategorySelect<\/code>komponendi div. Kui avate oma brauseris konsooli, peaksite n\u00e4gema ka m\u00f5ningaid logisid. Pidage meeles, et <code>withSelect<\/code>see on as\u00fcnkrooniline p\u00e4ring, mis t\u00e4hendab, et seda v\u00f5idakse renderdada mitu korda. Esimest korda on rekvisiidi terminid <code>null<\/code>. Kuid viimane (viimased logid) peaks l\u00f5ppema kategooriaterminite massiiviga.<\/p>\n<p>Suurep\u00e4rane! J\u00e4tkame oma <code>CategorySelect<\/code>komponendiga t\u00f6\u00f6d ja paneme selle reaalselt renderdama terminite loendi, mis v\u00f5imaldab kasutajal \u00fche valida!<\/p>\n<h3>Terminite loendi renderdamine, mille hulgast valida<\/h3>\n<p>Valikute loendi renderdamiseks, kus kasutaja saab valida \u00fche \u00fcksuse, on palju v\u00f5imalusi. Kui soovite midagi v\u00e4ga lihtsat, v\u00f5ite renderdada tavalise valiku rippmen\u00fc\u00fc (<code>[SelectControl](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/select-control)<\/code>). See on t\u00e4iesti sinu otsustada. Olen valinud puhtama ja kenama l\u00e4henemisviisi, kasutades <code>[MenuGroup](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/menu-group)<\/code>( <code>wp.components<\/code>) ja <code>[MenuItem](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/menu-item)<\/code>( <code>wp.components<\/code>).<\/p>\n<p>Komponendi sees <code>MenuGroup<\/code>peame <code>props.terms<\/code>massiivi l\u00e4bima ja iga \u00fcksuse jaoks tahame kuvada <code>MenuItem<\/code>komponendi, mis renderdab termini nime. Ja loomulikult tahame seda renderdada ainult siis, kui <code>props.terms<\/code>see sisaldab midagi (as\u00fcnkroonimistaotlus, m\u00e4letate?).<\/p>\n<pre><code>const { withSelect } = wp.data;\nconst { MenuGroup, MenuItem } = wp.components;\n\u00a0\nconst CategorySelect = (props) =&gt; {\n    const { terms } = props;\n    return(\n        &lt;MenuGroup\n            className=\"awp-categoryselect\"\n        &gt;\n            {terms &amp;&amp; (terms.map((item) =&gt; (&lt;MenuItem\n                        role=\"menuitemradio\"\n                    &gt;\n                        {item.name}\n                    &lt;\/MenuItem&gt;\n                ))\n            )}\n        &lt;\/MenuGroup&gt;\n    );\n}\n\u00a0\nexport default withSelect((select, props) =&gt; {\n    ...<\/code><\/pre>\n<p>Andsin <code>MenuGroup<\/code>komponendile kohandatud klassi, kuna peame selle sihtima CSS-iga. Ja ma olen seadnud rekvisiidi olekusse <code>role<\/code>&quot; <code>MenuItem<\/code>&quot; <code>menuitemradio<\/code>, et olla kindel, et korraga saab valida ainult \u00fche. Vaikimisi t\u00f6\u00f6tavad need m\u00e4rkeruutudena, v\u00f5imaldades seega valida mitu \u00fcksust.<\/p>\n<p>\u00dclaltoodud koodiga peaks meie plokk n\u00fc\u00fcd (v\u00e4ikese sekundi p\u00e4rast) esitama kena loendi k\u00f5igist teie WordPressi eksemplari kategooriatest.<\/p>\n<p>V\u00f5ite m\u00e4rgata, et meie plokk laieneb, et see h\u00f5lmaks k\u00f5iki kategooriaid. Kui oleme WordPressi eksemplaris, kus on palju kategooriaid, muutub see kiiresti probleemiks. Tahame veenduda, et valija on maksimaalse k\u00f5rgusega konteiner, mis saab vertikaalse kerimisriba, kui kategooriaid on palju. See on koht, kus meie CSS-fail siseneb.<\/p>\n<p>Lisage meie <code>editor-block-slider.css<\/code>faili:<\/p>\n<pre><code>.awp-categoryselect div {\n    max-height: 200px;\n    overflow: hidden scroll;\n    border: 1px solid #b3bcc0;\n}<\/code><\/pre>\n<p>See CSS sihib <code>div<\/code>meie sisemust <code>MenuGroup<\/code>ja tagab, et see ei \u00fcletaks kunagi 200 pikslit. Kui sisu <code>MenuGroup<\/code>muutub suuremaks (rohkem kategooriaid), kuvatakse vertikaalne kerimisriba. See on meie ploki jaoks CSS-i miinimum, kuid loomulikult saate soovi korral lisada rohkem CSS-i.<\/p>\n<p>Viimane asi, mida peame oma kategooriavalijas parandama, on funktsioon, mis n\u00e4itab praegu valitud \u00fcksust ja v\u00f5imaldab kasutajal valida loendist termini. Selleks peame oma plokist sellele komponendile edastama m\u00f5ned rekvisiidid.<\/p>\n<p><code>block-slider.js<\/code>Peame edastama praeguse valitud termini (atribuudi v\u00e4\u00e4rtus) <code>termId<\/code>ja funktsiooni valitud termini v\u00e4rskendamiseks (<code>setAttributes<\/code>) meie kategooriavalija komponendi rekvisiidina.<\/p>\n<pre><code>...\n\u00a0\nconst BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    const selectTerm = (termId) =&gt; {\n        setAttributes({ termId: termId });\n    }\n\u00a0\n    return(\n        ...\n            &lt;Placeholder\n                label={__('Slider Category', 'awp')}\n            &gt;\n                &lt;CategorySelect \n                    selectedTermId={attributes.termId}\n                    selectTerm={selectTerm}\n                \/&gt;\n            &lt;\/Placeholder&gt;\n        ...<\/code><\/pre>\n<p>\u00dclaltoodud koodi real <code>#6<\/code>m\u00e4\u00e4ratleme funktsiooni, mis lihtsalt v\u00e4rskendab atribuuti <code>termId<\/code>. Anname selle funktsiooni nime propina edasi <code>CategorySelect<\/code>reale <code>#17<\/code>. Ja real <code>#16<\/code>me edastame praeguse v\u00e4\u00e4rtuse <code>termId<\/code>. Sellega saame v\u00e4rskendada oma <code>CategorySelect<\/code>komponenti, et see kajastaks valitud \u00fcksust, ja v\u00f5imaldada kasutajal terminit tegelikult valida.<\/p>\n<p>Tagasi <code>awp-category-picker.js<\/code>lisame lehele m\u00f5ned uued rekvisiidid <code>MenuItem<\/code>. Tagastame <code>true<\/code>v\u00f5i <code>false<\/code>rekvisiidi jaoks, <code>isSelected<\/code>kas praegune termin ID on sama, mis praegu valitud. <code>selectTerm<\/code>Funktsiooni k\u00e4ivitame s\u00fcndmuses <code>onClick<\/code>, edastades m\u00f5iste ID. Ja selleks, et valitud \u00fcksus oleks visuaalne, lisame iga \u00fcksuse ette tingimuslikult ikooni.<\/p>\n<pre><code>...\nconst CategorySelect = (props) =&gt; {\n    const { terms, selectedTermId, selectTerm } = props;\n\u00a0\n    return(\n        &lt;MenuGroup\n            className=\"awp-categoryselect\"\n        &gt;\n            {terms &amp;&amp; (terms.map((item) =&gt; (&lt;MenuItem\n                        role=\"menuitemradio\"\n                        isSelected={item.id == selectedTermId}\n                        icon={item.id == selectedTermId? 'yes': 'no-alt'}\n                        onClick={() =&gt; selectTerm(item.id)}\n                    &gt;\n                        {item.name}\n                    &lt;\/MenuItem&gt;\n                ))\n            )}\n        ...<\/code><\/pre>\n<p>Sellega peaks meie kategooriavalija v\u00e4lja n\u00e4gema j\u00e4rgmine:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d1525afb7.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d1525afb7.png\" alt=\"\u00d5petus: looge liugur d\u00fcnaamilise Gutenbergi plokina\"><\/a><\/p>\n<p>Loendis tuleks valitud termin selgelt m\u00e4rgistada linnukese ikooniga ja selle asemel v\u00f5ite kl\u00f5psata mis tahes terminil.<\/p>\n<p>See oli toimetaja ja Javascripti osa jaoks k\u00f5ik! N\u00fc\u00fcd j\u00e4\u00e4b alles eesmise renderdus, mida teeme PHP-s.<\/p>\n<h2>Renderdage d\u00fcnaamiline plokk PHP-s<\/h2>\n<p>Enne renderdusfunktsiooni sukeldumist hoolitseme k\u00f5igepealt m\u00f5ne asja eest.<\/p>\n<p>K\u00f5igepealt peame j\u00e4rjekorda seadma skripti cycle2 esiservas, et meie liuguri kood muutuks tegelikult liuguriks. Teeme seda lihtsa funktsiooniga, mis on \u00fchendatud <code>wp_enqueue_scripts<\/code>. Kui valisite m\u00f5ne muu liuguri skripti, kohandage allolevat valikut.<\/p>\n<pre><code>add_action('wp_enqueue_scripts', function() {\n    wp_enqueue_script(\n        'cycle2-slider-js', \n        get_template_directory_uri(). '\/assets\/js\/jquery.cycle2.min.js', \n        ['jquery'], \n        '', \n        true\n    );\n});<\/code><\/pre>\n<p>Teiseks tahame naasta <code>register_block_type()<\/code>funktsioonikutse juurde. D\u00fcnaamiliste plokkide k\u00e4sitlemisel peaksime kindlasti lisama uue argumendi; <code>attributes<\/code>. Selles argumendis m\u00e4\u00e4ratleme k\u00f5ik atribuudid, mille oleme <code>registerBlockType<\/code>Javascriptis m\u00e4\u00e4ratlenud, sealhulgas nende vaikev\u00e4\u00e4rtused. Kui me seda ei tee, ei ole k\u00f5ik atribuudid meie renderdamise tagasihelistamisel saadaval. Kui atribuut j\u00e4eti plokiredaktoris muutmata, ei ole atribuut ja selle v\u00e4\u00e4rtus PHP atribuutide massiivis saadaval. Seega soovitan teil d\u00fcnaamiliste plokkidega t\u00f6\u00f6tades alati lisada <code>attributes<\/code>massiiv PHP <code>register_block_type()<\/code>funktsioonile. Meie ploki jaoks n\u00e4eks see v\u00e4lja j\u00e4rgmine:<\/p>\n<pre><code>register_block_type('awp\/slider', [\n    'editor_script' =&gt; 'awp-block-slider-js',\n    'editor_style' =&gt; 'awp-block-slider-style',\n    'render_callback' =&gt; 'awp_gutenberg_slider_render',\n    'attributes' =&gt; [\n        'align' =&gt; ['type' =&gt; 'string', 'default' =&gt; 'center'],\n        'termId' =&gt; ['type' =&gt; 'number', 'default' =&gt; 0],\n        'numSlides' =&gt; ['type' =&gt; 'number', 'default' =&gt; 3]\n    ]\n]);<\/code><\/pre>\n<p>N\u00fc\u00fcd p\u00f6\u00f6rdume tagasi tagasihelistamisfunktsiooni juurde <code>awp_gutenberg_slider_render()<\/code>. V\u00e4ljund on t\u00e4ielikult teie enda otsustada, eriti kui olete valinud m\u00f5ne muu liuguri skripti kasutamise. Allpool on lihtne n\u00e4ide.<\/p>\n<p>P\u00f5hiidee seisneb selles, et kontrollime, kas termin on valitud v\u00f5i mitte (<code>$attributes['termId']<\/code>). Kui see on t\u00e4idetud, loome <code>[WP_Query](https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/)()<\/code>argumentidega postituste arvu (<code>$attributes['numSlides']<\/code>) ja valitud kategooria ID. Seej\u00e4rel tuleb luua \u00f5ige HTML, et ts\u00fckkel2 t\u00f6\u00f6taks, postitused \u00fcle k\u00e4ia ja nende esiletoodud pildid slaididena kuvada.<\/p>\n<pre><code>function awp_gutenberg_slider_render($attributes, $content) {\n    if (empty($attributes['termId'])) {\n        return '';\n    }\n\u00a0\n    $postQuery = new WP_Query([\n        'posts_per_page' =&gt; $attributes['numSlides'],\n        'cat' =&gt; $attributes['termId']\n    ]);\n\u00a0\n    if ($postQuery-&gt;have_posts()) {\n        $output = '&lt;div class=\"wp-block-awp-slider align'. $attributes['align']. '\"&gt;';\n        $output .= '&lt;div class=\"cycle-slideshow\" data-cycle-timeout=4000&gt;';\n        while ($postQuery-&gt;have_posts()) {\n            $postQuery-&gt;the_post();\n\u00a0\n            if (has_post_thumbnail()) {\n                $img_url = get_the_post_thumbnail_url(get_the_ID(), 'loop-thumbnail');\n                $output .= '&lt;img src=\"'. $img_url. '\" \/&gt;';\n            }\n        }\n        wp_reset_postdata();\n        $output .= '&lt;\/div&gt;';\n        $output .= '&lt;\/div&gt;';\n\u00a0\n        return $output;\n\u00a0\n    } else {\n        return '';\n    }\n}<\/code><\/pre>\n<p>Pange t\u00e4hele, kuidas ma lisan reale \u00f5ige ploki joondusklassi <code>#12<\/code>. Tulemuseks peaks olema esiletoodud piltide liugur. Pidage meeles, et see on p\u00f5hin\u00e4ide, millel on m\u00f5ned vead. N\u00e4iteks toome valitud kategooriast kolm viimast postitust. Kuid eeldades, et \u00fchel neist pole esiletoodud pilti, kuvab liugur ainult kahte postitust.<\/p>\n<p>Oluline on meeles pidada, et string tuleb tagastada ja seda mitte korrata. Samuti soovitan selliste d\u00fcnaamiliste plokkide renderdamiste jaoks oma teemas kasutada m\u00f5nda mallifunktsiooni. HTML-i stringina parandamine ja koostamine v\u00f5ib kiiresti muutuda segaseks.<\/p>\n<h2>L\u00f5pus\u00f5nad<\/h2>\n<p>See \u00f5petus on n\u00e4idanud, kuidas luua kohandatud d\u00fcnaamiline WordPress Gutenbergi plokk, kus renderdate selle esiserva sisu PHP-s. Ja olete n\u00e4inud, kuidas kasutada k\u00f5rgema j\u00e4rgu komponenti <code>withSelect<\/code>k\u00f5igi kategooriaterminite p\u00e4ringute tegemiseks ja meetodit valitava loendi kuvamiseks.<\/p>\n<p>K\u00f5ik \u00fclaltoodud kood on kirjutatud nii lihtsalt kui v\u00f5imalik. Lisasin ainult absoluutse miinimumi seadistusi. Liugur t\u00f6\u00f6tab, kuid tavaliselt soovite rohkemat \u2013 n\u00e4iteks slaidide linkide loomine, postituste pealkirjade kuvamine, liuguri nooled v\u00f5i kiiruse v\u00f5i muude liuguri s\u00e4tete kohandamise v\u00f5imalus. Idee on n\u00e4idata teile p\u00f5hit\u00f5desid ja h\u00f5lbustada teie projekti laiendamist, edasi arendamist ja muutmist vastavalt oma projekti vajadustele.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00d5petus, kuidas luua d\u00fcnaamilist WordPressi Gutenbergi plokki withSelecti ja PHP renderdusega. L\u00f5pptulemus on liugur.<\/p>\n","protected":false},"author":1,"featured_media":151907,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,894,718,937,937,894,1110,842,812,812,842,863,863],"tags":[1165],"class_list":{"0":"post-233835","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-arendaja","8":"category-kood","10":"category-gutenberg-4","13":"category-n-a","14":"category-opetused","15":"category-pistikprogrammid","18":"category-wordpress-4","20":"tag-affiai-et"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/233835","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=233835"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/233835\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/151907"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=233835"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=233835"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=233835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}