{"id":6072,"date":"2021-02-28T14:03:42","date_gmt":"2021-02-28T13:03:42","guid":{"rendered":"https:\/\/florianbrinkmann.com\/en\/?p=6072"},"modified":"2021-02-28T14:04:15","modified_gmt":"2021-02-28T13:04:15","slug":"block-attributes-depending-on-block-position","status":"publish","type":"post","link":"https:\/\/florianbrinkmann.com\/en\/block-attributes-depending-on-block-position-6072\/","title":{"rendered":"Set block attributes depending on the block position"},"content":{"rendered":"\n<p>In a project, I wanted to use the <code>sizes<\/code> attribute for the images in a slider block. But because the slider is used in different widths, the value of the <code>sizes<\/code> attribute needs to change depending on the position of the slider block.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>I use the <code>subscribe()<\/code> function for the solution. When the editor\u2019s state changes, the block list is checked and the <code>maxWidth<\/code> attribute for slide blocks is updated depending on the position of its slider parent block in the block list.<\/p>\n\n\n\n<p>This is the complete code (<a href=\"https:\/\/gist.github.com\/florianbrinkmann\/4e7d81b5401632c09e84a6bc786084b1\">or as a Gist<\/a>):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">const<\/span> {\n<\/span><\/span><span class='shcb-loc'><span>\tselect,\n<\/span><\/span><span class='shcb-loc'><span>} = wp.data;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>wp.domReady( <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Get the slider blocks.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * <\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param <span class=\"hljs-type\">{object}<\/span> <span class=\"hljs-variable\">block<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\">\t * <span class=\"hljs-doctag\">@param <span class=\"hljs-type\">{array}<\/span> <\/span>sliderBlocks <\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-doctag\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\">\t<span class=\"hljs-keyword\">const<\/span> getSliderBlocks = <span class=\"hljs-function\">(<span class=\"hljs-params\"> block, sliderBlocks <\/span>) =&gt;<\/span> {<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( block.innerBlocks.length === <span class=\"hljs-number\">0<\/span>  ) {<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\">\t\t<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Check if it is a slider block. If so, push innerBlocks to the sliderBlocks array.<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( block.name === <span class=\"hljs-string\">'slug\/slider'<\/span> ) {<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\">\t\t\tsliderBlocks.push( block );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\">\t\tblock.innerBlocks.map( <span class=\"hljs-function\"><span class=\"hljs-params\">innerBlock<\/span> =&gt;<\/span> getSliderBlocks( innerBlock, sliderBlocks ) );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t};<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">const<\/span> getBlockList = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> select( <span class=\"hljs-string\">'core\/editor'<\/span> ).getBlocks();<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\twp.data.subscribe( <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">let<\/span> blockList = getBlockList();<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( blockList ) {<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-comment\">\/\/ Get slider blocks.<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">let<\/span> sliderBlocks = &#91;];<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\tblockList.map( <span class=\"hljs-function\"><span class=\"hljs-params\">block<\/span> =&gt;<\/span> getSliderBlocks( block, sliderBlocks ) );<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\tsliderBlocks.map( <span class=\"hljs-function\"><span class=\"hljs-params\">sliderBlock<\/span> =&gt;<\/span> {<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-comment\">\/\/ Set maxWidth depending on position and settings of block.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">const<\/span> blockParents = select( <span class=\"hljs-string\">'core\/block-editor'<\/span> ).getBlockParents( sliderBlock.clientId );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">let<\/span> maxWidth;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-comment\">\/\/ Check if the slider block has no parents.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( blockParents.length === <span class=\"hljs-number\">0<\/span> ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">const<\/span> align = sliderBlock.attributes.align;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-comment\">\/\/ Set maxWidth to 100vw if full align.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( align !== <span class=\"hljs-literal\">undefined<\/span> &amp;&amp; align === <span class=\"hljs-string\">'full'<\/span> ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t\tmaxWidth = <span class=\"hljs-string\">'100vw'<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-comment\">\/\/ Set maxWidth to 1170 if no align.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( align === <span class=\"hljs-literal\">undefined<\/span> || align !== <span class=\"hljs-string\">'full'<\/span> ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t\tmaxWidth = <span class=\"hljs-string\">'1170'<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t} <span class=\"hljs-keyword\">else<\/span> {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-comment\">\/\/ Get column parents.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">const<\/span> columnParents = select( <span class=\"hljs-string\">'core\/block-editor'<\/span> ).getBlockParentsByBlockName( sliderBlock.clientId, <span class=\"hljs-string\">'core\/column'<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( columnParents.length &gt; <span class=\"hljs-number\">0<\/span> ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t\t<span class=\"hljs-keyword\">const<\/span> columnParent = select( <span class=\"hljs-string\">'core\/block-editor'<\/span> ).getBlock( columnParents&#91;<span class=\"hljs-number\">0<\/span>] );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t\t<span class=\"hljs-keyword\">let<\/span> columnWidth = columnParent.attributes !== <span class=\"hljs-literal\">undefined<\/span> &amp;&amp; columnParent.attributes.width !== <span class=\"hljs-literal\">undefined<\/span> &amp;&amp; columnParent.attributes.width !== <span class=\"hljs-string\">''<\/span> ? columnParent.attributes.width : <span class=\"hljs-number\">50<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t\tmaxWidth = <span class=\"hljs-number\">1170<\/span> \/ <span class=\"hljs-number\">100<\/span> * columnWidth;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t} <span class=\"hljs-keyword\">else<\/span> {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t\tmaxWidth = <span class=\"hljs-string\">'1170'<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-comment\">\/\/ Set the attributes for the slide blocks.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\tsliderBlock.innerBlocks.map( <span class=\"hljs-function\"><span class=\"hljs-params\">slideBlock<\/span> =&gt;<\/span> {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\tslideBlock.attributes.maxWidth = maxWidth;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t} );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t} );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t} );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><span class=\"hljs-doctag\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">} );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>After the DOM is ready, we define the function <code>getSliderBlocks()<\/code> at line 12, which gets a block and an array. The slider block works with the <code>InnerBlocks<\/code> component with the single slides being blocks themself, so if <code>block.innerBlocks.length<\/code> is <code>0<\/code>, it cannot be a slider block and we exit the function early.<\/p>\n\n\n\n<p>If the block is a slider block, we add it to the array we got as a function parameter and quit the function again. If it is not a slider block but has <code>innerBlocks<\/code>, we run the <code>getSliderBlocks()<\/code> function again for the <code>innerBlocks<\/code>, to also get sliders inside group blocks, columns, or other blocks that contain other blocks.<\/p>\n\n\n\n<p>At line 26, we create the <code>getBlockList()<\/code> function to get a list of the blocks in the editor. After that, we listen to editor changes via <code>wp.data.subscribe()<\/code> and fetch the current block list. If we have blocks, we create a <code>sliderBlocks<\/code> array and run the <code>getSliderBlocks()<\/code> function for the top-level blocks at line 32. And, like described above, <code>getSliderBlocks()<\/code> also handles nested blocks, so after line 32 we have all slider blocks in <code>sliderBlocks<\/code>.<\/p>\n\n\n\n<p>Now we need to loop the slider blocks and check their current position. For that, we get the parent blocks to each slider block at line 36 via <code>wp.data.select( 'core\/block-editor' ).getBlockParents()<\/code>.<\/p>\n\n\n\n<p>If we get an empty result for parent blocks, the slider is on the top level in the editor. Now we need to check if the block width is set to full width, and that setting is saved in the <code>align<\/code> attribute. So we get the <code>align<\/code> value at line 42 and check if it equals <code>full<\/code>. If that is the case, we set <code>maxWidth<\/code> to <code>100vw<\/code>. If <code>align<\/code> is something other than <code>full<\/code>, we set <code>maxWidth<\/code> to <code>1170<\/code>, the content width of my website project in pixels.<\/p>\n\n\n\n<p>If we have parent blocks, we check for column blocks in them, and if there are column blocks, we use the width of the first parent column block to calculate a percentage value for the <code>maxWidth<\/code>.<\/p>\n\n\n\n<p>If the slider is not inside a column block, we set the <code>maxWidth<\/code> to <code>1170<\/code>.<\/p>\n\n\n\n<p>To use the calculated width value for the image, we loop through the slide blocks at lines 66 to 68 and set its <code>maxWidth<\/code> attribute. With that, the <code>maxWidth<\/code> attribute of a slide block should always contain the correct value for <code>sizes<\/code> depending on the position of the slider block.<\/p>\n\n\n\n<p>It would be great to not run that code on every editor status change but just when something changes for a slider block. If someone knows a solution for that, I would be happy to hear about it \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In a project, I wanted to use the sizes attribute for the images in a slider block. But because the slider is used in different widths, the value of the sizes attribute needs to change depending on the position of the slider block.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wpf_show_in_dewp_planet_feed":false,"flobn_post_versions":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"lazy_load_responsive_images_disabled":false,"footnotes":""},"categories":[115],"tags":[],"class_list":["post-6072","post","type-post","status-publish","format-standard","hentry","category-wordpress-snippets"],"wp-worthy-pixel":{"ignored":false,"public":"9f968c14f9d0434c8a42f6556fc5c784","server":"vg07.met.vgwort.de","url":"https:\/\/vg07.met.vgwort.de\/na\/9f968c14f9d0434c8a42f6556fc5c784"},"wp-worthy-type":"normal","_links":{"self":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/6072","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/comments?post=6072"}],"version-history":[{"count":2,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/6072\/revisions"}],"predecessor-version":[{"id":6074,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/6072\/revisions\/6074"}],"wp:attachment":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/media?parent=6072"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/categories?post=6072"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/tags?post=6072"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}