<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Eightshift Development kit Blog</title>
        <link>https://eightshift.oceanamazon.com/blog</link>
        <description>Eightshift Development kit Blog</description>
        <lastBuildDate>Thu, 28 Mar 2024 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Using post templates]]></title>
            <link>https://eightshift.oceanamazon.com/blog/using-post-templates</link>
            <guid>https://eightshift.oceanamazon.com/blog/using-post-templates</guid>
            <pubDate>Thu, 28 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Explaining post templates and how to use them.]]></description>
            <content:encoded><![CDATA[<p>Sometimes you need your posts to follow a specific structure, or you simply want to provide a good starting point for the editors. This blog post will cover what post templates are, how to set them up, and what options they offer.</p>
<p>A simple use case of post templates can be a review or a testimonial. For example, if you want each review to be a separate post and to use a single Quote block.</p>
<p>If you don’t have the new post type registered, you can refer to one of the previous blog posts which explains how to <a class="" href="https://eightshift.oceanamazon.com/blog/using-cpts-and-taxonomies">register Custom Post Types</a>. Once the new post type is registered, you can set the <code>template_lock</code> argument.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="template-locking-options">Template locking options<a href="https://eightshift.oceanamazon.com/blog/using-post-templates#template-locking-options" class="hash-link" aria-label="Direct link to Template locking options" title="Direct link to Template locking options" translate="no">​</a></h2>
<p>The best way to lock the template is by adding the <code>template_lock</code> argument into a <code>return</code> statement from the <code>getPostTypeArguments</code> method in your post type class.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'template_lock'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'all'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>There are a few ways of locking the template:</p>
<ul>
<li class=""><code>all</code> - blocks can’t be inserted, removed, or moved around. Content can be edited for existing blocks</li>
<li class=""><code>insert</code> - you can’t insert or remove blocks, but you can move them around</li>
</ul>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>It’s not mandatory to use <code>template_lock</code> if you’re using post templates. You can leave it out and have it fully unlocked to give the editors the freedom to modify the proposed template.</p></div></div>
<p>Additionally, you can lock each block separately by adding the following attributes:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"lock"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"remove"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"move"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-a-template">Adding a template<a href="https://eightshift.oceanamazon.com/blog/using-post-templates#adding-a-template" class="hash-link" aria-label="Direct link to Adding a template" title="Direct link to Adding a template" translate="no">​</a></h2>
<p>A recommended approach for adding a post template is to add a service class. For this example, the post type is <strong>Review</strong>, so the WP-CLI command for creating a new service class looks like this:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create service-example --folder=Templates --file_name=ReviewTemplate</span><br></div></code></pre></div></div>
<p>If you’re adding a template for another post type, create a separate class, but include it in the same namespace (folder). That way you’ll have a much better overview of the templates in the project.</p>
<p>Here’s an example of how to add a single Quote block as a template:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * Register Review Template.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @return void</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">registerReviewTemplate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$reviewPostType</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">get_post_type_object</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name static-context">ReviewPostType</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">POST_TYPE_SLUG</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$reviewPostType</span><span class="token operator">-&gt;</span><span class="token property">template</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'eightshift-boilerplate/quote'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapperSimple'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token constant boolean" style="color:rgb(189, 147, 249)">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'quoteQuoteParagraphContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'Content placeholder'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'quoteQuoteAuthorContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'Author name placeholder'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>To assign a post template, you need to get the post type object and then update the <code>template</code> property. Alternatively, you can also lock the post template in this method with the <code>template_lock</code> property, but it’s much cleaner to do it during custom post type registration.</p>
<p>Don’t forget to register your method with <code>add_action</code>:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">add_action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'init'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$this</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'registerReviewTemplate'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">20</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-complex-layouts">Building complex layouts<a href="https://eightshift.oceanamazon.com/blog/using-post-templates#building-complex-layouts" class="hash-link" aria-label="Direct link to Building complex layouts" title="Direct link to Building complex layouts" translate="no">​</a></h2>
<p>As you can see from the previous example, you can set any attribute you want, including wrapper-related options. The easiest way to add a complex post template is by building it in the Gutenberg editor first, then switching to Code Editor and copying the content. This will have to be rewritten in PHP to make it work, and here’s how to do it. Let’s say the code for the blocks looks like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;!-- wp:eightshift-boilerplate/paragraph {"paragraphParagraphContent":"Placeholder text"} /--&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;!-- wp:eightshift-boilerplate/cta-modal {"ctaModalButtonContent":"Apply now!","ctaModalEndDateHide":true} --&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;!-- wp:eightshift-boilerplate/heading {"wrapperUseShowControl":false,"wrapperSimpleShowControl":false,"wrapperSimple":true,"wrapperAnchorId":"apply-now","headingHeadingContent":"Application form","headingHeadingSize":"h4:bold","headingAlign":"center"} /--&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;!-- wp:eightshift-forms/forms /--&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;!-- /wp:eightshift-boilerplate/cta-modal --&gt;</span><br></div></code></pre></div></div>
<p>This is how it looks when you rewrite it in PHP.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$eventPostType</span><span class="token operator">-&gt;</span><span class="token property">template</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// array that holds all blocks.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// array that holds a Paragraph block.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'eightshift-boilerplate/paragraph'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// full block name.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// array that holds block attributes.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'paragraphParagraphContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'Placeholder text'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// array that holds a CTA Modal block.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'eightshift-boilerplate/cta-modal'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// array that holds block attributes.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'ctaModalEndDateHide'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token constant boolean" style="color:rgb(189, 147, 249)">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'ctaModalButtonContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'Apply now!'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'ctaModalButtonAlign'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'center'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// array of inner blocks for a CTA Modal block.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'eightshift-boilerplate/heading'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapperAnchorId'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'apply-now'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'headingHeadingContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'Application form'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'headingHeadingSize'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'h4:bold'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'headingAlign'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'center'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'eightshift-forms/forms'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// not passing any attributes, so we just include an empty array.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>The comments were added above for an easier understanding of the structure. So, to summarize:</p>
<ul>
<li class="">the <code>template</code> property is an array that holds all blocks</li>
<li class="">each block is a separate array that accepts three values in the following order: block name (string), block attributes (array), and inner blocks (array)</li>
<li class="">the process of adding inner blocks is the same as for adding blocks to the main content</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="editor-options-for-unlocking-the-templates">Editor options for unlocking the templates<a href="https://eightshift.oceanamazon.com/blog/using-post-templates#editor-options-for-unlocking-the-templates" class="hash-link" aria-label="Direct link to Editor options for unlocking the templates" title="Direct link to Editor options for unlocking the templates" translate="no">​</a></h2>
<p>Even though the templates can be locked, some blocks can still be unlocked. This can be done by selecting a block and clicking on a lock icon. When locking or unlocking a block in this way, you can toggle two options, the ones already mentioned at the end of the <a href="https://eightshift.oceanamazon.com/blog/using-post-templates#template-locking-options" class="">Template locking options</a> section:</p>
<ul>
<li class=""><strong>Disable movement</strong> - disable moving the block around</li>
<li class=""><strong>Prevent removal</strong> - prevents the block from being deleted</li>
</ul>
<p>That way, even if you lock the template, some modifications can still be made to the template. Please note, that once you remove a block from the locked template, you can’t add it again because the button for adding blocks is disabled.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="suggestions-for-using-post-templates">Suggestions for using post templates<a href="https://eightshift.oceanamazon.com/blog/using-post-templates#suggestions-for-using-post-templates" class="hash-link" aria-label="Direct link to Suggestions for using post templates" title="Direct link to Suggestions for using post templates" translate="no">​</a></h2>
<p>Post templates offer a great way to streamline the process of adding content for specific post types and making the look and feel of the same post types more uniform. There are lots of ways to use them, so here are some suggestions to give you ideas:</p>
<p><strong>Posts/news articles</strong> - a news article needs a title, an image, author information, and some content.</p>
<p><strong>Events</strong> - you can put the important information at the top with a few accordions, then follow up with some content and add a CTA button at the bottom that opens a modal with an application form.</p>
<p><strong>Reviews</strong> - use a single quote block for displaying user reviews. To make it work with the Featured Content block, you can modify the Featured Content block to render the Reviews CPT content directly, instead of rendering cards.</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>templates</category>
        </item>
        <item>
            <title><![CDATA[Using inner blocks]]></title>
            <link>https://eightshift.oceanamazon.com/blog/using-inner-blocks</link>
            <guid>https://eightshift.oceanamazon.com/blog/using-inner-blocks</guid>
            <pubDate>Thu, 07 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Various tips and useful features for your project included in Eightshift DevKit.]]></description>
            <content:encoded><![CDATA[<p>InnerBlocks in WordPress enable the creation of nested block structures within the Gutenberg editor, allowing for the development of more complex and customizable content layouts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-use-inner-blocks">Why use inner blocks?<a href="https://eightshift.oceanamazon.com/blog/using-inner-blocks#why-use-inner-blocks" class="hash-link" aria-label="Direct link to Why use inner blocks?" title="Direct link to Why use inner blocks?" translate="no">​</a></h2>
<p>Use of inner blocks allows for more flexibility when building content. Let’s say you’re building a simple two-column layout with image on one side and content on the other side. You can define the components that will be used (e.g. header, paragraph, list, button) and then just toggle the ones you don’t need.</p>
<p>This approach works perfectly fine when you have a strict layout and don’t need larger content structure variations. Using inner blocks may introduce a bit more complexity - both for developers and content editors, but ultimately gives the editors much more freedom.</p>
<p>Another example where inner blocks are used is the Carousel block. Using inner blocks allows you to add as many slides as you'd like in your carousel. Let’s not forget about Columns and Group blocks. These also use inner blocks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-inner-block-support">Adding inner block support<a href="https://eightshift.oceanamazon.com/blog/using-inner-blocks#adding-inner-block-support" class="hash-link" aria-label="Direct link to Adding inner block support" title="Direct link to Adding inner block support" translate="no">​</a></h2>
<p>The example used in this blog post is a two-column Card that was made for a project. First thing that needs to be updated is the <em><strong>manifest.json</strong></em> file. For the sake of simplicity and not having too much code, the parts that aren’t related to the inner blocks have been removed.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"hasInnerBlocks"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"innerBlocksDependency"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string" style="color:rgb(255, 121, 198)">"heading"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string" style="color:rgb(255, 121, 198)">"paragraph"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"attributes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"cardTwoColumnAllowedBlocks"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"array"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string" style="color:rgb(255, 121, 198)">"eightshift-boilerplate/paragraph"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string" style="color:rgb(255, 121, 198)">"eightshift-boilerplate/heading"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string" style="color:rgb(255, 121, 198)">"eightshift-boilerplate/button"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string" style="color:rgb(255, 121, 198)">"eightshift-boilerplate/lists"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>The <code>hasInnerBlocks</code> key defines that this block supports inner blocks. The <code>innerBlocksDependency</code> is generally used to output block dependencies when adding a block via CLI, but it can also be used to add inner blocks automatically. You can see an example of using it in the Columns block <code>editor.js</code> file.</p>
<p>In case we need to limit which blocks can be added inside inner blocks, we can do so with an attribute. Usually, the attribute is named <code>{blockName}AllowedBlocks</code>. Set the default value as an array of strings that represent block names you want to allow.</p>
<p>Please note that the block names must include the block namespace! (<code>eightshift-boilerplate</code> by default, check in Global manifest)</p>
<p>Now you need to pass the allowed blocks attribute into the <code>InnerBlocks</code> component In the <code>{block-name}-editor.js</code> file. Here’s an example of the code related only to the inner blocks:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">InnerBlocks</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@wordpress/block-editor'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BlockInserter</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eightshift/frontend-libs/scripts'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(80, 250, 123)">CardTwoColumnEditor</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> attributes</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> setAttributes</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> clientId </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		cardTwoColumnAllowedBlocks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)">contentClass</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">InnerBlocks</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">allowedBlocks</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag script language-javascript keyword" style="color:rgb(189, 147, 249);font-style:italic">typeof</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)"> cardTwoColumnAllowedBlocks </span><span class="token tag script language-javascript operator" style="color:rgb(255, 121, 198)">===</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript string" style="color:rgb(255, 121, 198)">'undefined'</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript operator" style="color:rgb(255, 121, 198)">||</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)"> cardTwoColumnAllowedBlocks</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">orientation</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">'</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">vertical</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">'</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">renderAppender</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript arrow operator" style="color:rgb(255, 121, 198)">=&gt;</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag script language-javascript tag class-name" style="color:rgb(255, 121, 198)">BlockInserter</span><span class="token tag script language-javascript tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript tag attr-name" style="color:rgb(241, 250, 140)">clientId</span><span class="token tag script language-javascript tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript tag script language-javascript" style="color:rgb(255, 121, 198)">clientId</span><span class="token tag script language-javascript tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag script language-javascript tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">		</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>The <code>InnerBlocks</code> component comes from Gutenberg. In order to limit the allowed blocks, we need to pass the list of allowed inner blocks to the <code>allowedBlocks</code> attribute. If your inner blocks should be laid out horizontally in the editor, instead of vertically, you can pass <code>orientation='horizontal'</code>.</p>
<p><code>renderAppender</code> prop allows passing a custom block insert button. Due to relatively frequent changes in Gutenberg, a custom <code>BlockInserter</code> element is available in Frontend libs as a replacement, and can be passed to <code>InnerBlocks</code>.</p>
<p>Finally, to render the inner blocks in PHP, you need to add the following:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token delimiter important">&lt;?php</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// phpcs:ignore Eightshift.Security.ComponentsEscape.OutputNotEscaped</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">echo</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$innerBlockContent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token delimiter important">?&gt;</span><br></div></code></pre></div></div>
<p>And that’s it! Your block now supports inner blocks.</p>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>A block can have only one set of inner blocks.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overriding-inner-block-attributes">Overriding inner block attributes<a href="https://eightshift.oceanamazon.com/blog/using-inner-blocks#overriding-inner-block-attributes" class="hash-link" aria-label="Direct link to Overriding inner block attributes" title="Direct link to Overriding inner block attributes" translate="no">​</a></h2>
<p>Inner blocks behave like regular blocks, which means they also have a wrapper by default. This may not always be desired and manually removing wrapper or adding custom wrapper settings on each inner block can be tedious. That’s why Eightshift DevKit offers few helpers that allow you to override inner block attributes.</p>
<p>Both of these helpers go to your <code>{block-name}-block.js</code> file.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="overrideinnerblockattributes">overrideInnerBlockAttributes<a href="https://eightshift.oceanamazon.com/blog/using-inner-blocks#overrideinnerblockattributes" class="hash-link" aria-label="Direct link to overrideInnerBlockAttributes" title="Direct link to overrideInnerBlockAttributes" translate="no">​</a></h3>
<p>This helper allows you to set the attributes on all inner blocks by passing them as a third parameter. The example below shows how to disable the wrapper and hide wrapper controls.</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> useSelect </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@wordpress/data'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> overrideInnerBlockAttributes </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eightshift/frontend-libs/scripts'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(80, 250, 123)">Accordion</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">// Set these attributes to all inner blocks once inserted in DOM.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token function" style="color:rgb(80, 250, 123)">useSelect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">select</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token function" style="color:rgb(80, 250, 123)">overrideInnerBlockAttributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			select</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			props</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">clientId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token literal-property property">wrapperUse</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token literal-property property">wrapperNoControls</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>Keep in mind this helper allows you to set any attribute that the inner block supports, so you can even set a larger paragraph size and a different color, for example.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="useblockprops-and-useinnerblocksprops">useBlockProps and useInnerBlocksProps<a href="https://eightshift.oceanamazon.com/blog/using-inner-blocks#useblockprops-and-useinnerblocksprops" class="hash-link" aria-label="Direct link to useBlockProps and useInnerBlocksProps" title="Direct link to useBlockProps and useInnerBlocksProps" translate="no">​</a></h3>
<p>In case the default <code>InnerBlocks</code> limits your styling and/or layout options too much, you can opt into the newer block prop hooks to implement inner blocks as well!</p>
<p>Import the <code>useBlockProps</code> and <code>useInnerBlocksProps</code> hooks, configure them just like regular InnerBlocks, and spread the params into an element of your choice (<code>div</code> is recommended).</p>
<p>In code, it looks something like this:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> useBlockProps</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> useInnerBlocksProps </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@wordpress/block-editor'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(80, 250, 123)">DemoEditor</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> blockProps </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useBlockProps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> innerBlocksProps </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useInnerBlocksProps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">blockProps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token literal-property property">allowedBlocks</span><span class="token operator">:</span><span class="token plain"> demoAllowedBlocks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token function-variable function" style="color:rgb(80, 250, 123)">renderAppender</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">BlockInserter</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">clientId</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)">clientId</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">...</span><span class="token tag spread" style="color:rgb(255, 121, 198)">innerBlocksProps</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Do whatever you want with this.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://eightshift.oceanamazon.com/blog/using-inner-blocks#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The best way to understand how inner blocks work is to try to build your own block that supports inner blocks and try out various options and see what kind of results you’ll get. If you ever get stuck, you can refer to the official <a href="https://eightshift.com/docs/welcome" target="_blank" rel="noopener noreferrer" class="">Eightshift DevKit documentation</a> or check the blocks that already have inner blocks support. These blocks are:</p>
<ul>
<li class="">accordion</li>
<li class="">accordion item</li>
<li class="">columns</li>
<li class="">column</li>
<li class="">carousel</li>
<li class="">group</li>
</ul>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>inner blocks</category>
        </item>
        <item>
            <title><![CDATA[Tips & useful features]]></title>
            <link>https://eightshift.oceanamazon.com/blog/tips-useful-features</link>
            <guid>https://eightshift.oceanamazon.com/blog/tips-useful-features</guid>
            <pubDate>Thu, 29 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Various tips and useful features for your project included in Eightshift DevKit.]]></description>
            <content:encoded><![CDATA[<p>Eightshift DevKit has lots of features that can make your development experience easier. These are mostly minor features which can’t be a blog post of its own, so they’ll be listed here. This isn’t a complete list, so there may be a part 2 in the future.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-only-eightshift-blocks">Using only Eightshift blocks<a href="https://eightshift.oceanamazon.com/blog/tips-useful-features#using-only-eightshift-blocks" class="hash-link" aria-label="Direct link to Using only Eightshift blocks" title="Direct link to Using only Eightshift blocks" translate="no">​</a></h2>
<p>If you want to remove the default Gutenberg blocks and use only Eightshift blocks, it’s as easy as adding the following code in your <strong><em>src/Blocks/Blocks.php</em></strong> file:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// Limits the usage of only custom project blocks.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">add_filter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'allowed_block_types_all'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$this</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'getAllBlocksList'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="modifyadminappearance-class">ModifyAdminAppearance class<a href="https://eightshift.oceanamazon.com/blog/tips-useful-features#modifyadminappearance-class" class="hash-link" aria-label="Direct link to ModifyAdminAppearance class" title="Direct link to ModifyAdminAppearance class" translate="no">​</a></h2>
<p>When you have multiple environments (local, staging, production ...), you may accidentally change something on the wrong environment if you mix up your tabs. The <code>ModifyAdminAppearance</code> class changes your WP Admin color scheme depending on the environment type defined with the <code>WP_ENVIRONMENT_TYPE</code> constant. That way it’s much easier to differentiate on which environment you are when you're in WP Admin.</p>
<p>Now when you get a call from the client asking you why the blog post they published isn’t visible on the site, the first question you can ask is: “What color is the admin area?” 😄</p>
<p>To add it into your project, use the following WP-CLI command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create modify-admin-appearance</span><br></div></code></pre></div></div>
<p>After adding this class to your project, all you have to do is define the proper environment type in the <code>WP_ENVIRONMENT_TYPE</code> constant in <em><strong>wp-config.php.</strong></em></p>
<p>The supported values are:</p>
<ul>
<li class="">local</li>
<li class="">development</li>
<li class="">staging</li>
<li class="">production</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Different color schemes in WP Admin depending on the environment" src="https://eightshift.oceanamazon.com/assets/images/modify-admin-appearance-cc0e975f95d5dce4062cdeaf403a37d0.webp" width="1042" height="562" class="img_ev3q"></p>
<p>If you want to change any of the colors, you can do so by modifying the values in <code>COLOR_SCHEMES</code> array inside <code>ModifyAdminAppearance</code> class. For the full list of available color schemes, you can navigate to <strong><em>wp-admin/css/colors</em></strong>. The subfolders here represent the color schemes you can use. For example, if you want to change production environment color scheme to <code>coffee</code>, you would do it like this:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * List of admin color schemes.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @var array&lt;string, string&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">COLOR_SCHEMES</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'development'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'fresh'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'local'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'fresh'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'staging'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'blue'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'production'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'coffee'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="escapedview-class">EscapedView class<a href="https://eightshift.oceanamazon.com/blog/tips-useful-features#escapedview-class" class="hash-link" aria-label="Direct link to EscapedView class" title="Direct link to EscapedView class" translate="no">​</a></h2>
<p>This class can be used to define which tags and attributes are escaped or allowed in your project. To add the class into your project, use the following WP-CLI command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create escaped-view</span><br></div></code></pre></div></div>
<p>Here’s an example how to define the allowed tags so <code>wp_kses</code> doesn’t remove them:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * Add tags to allowed HTML list.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * @param array&lt;string, array&lt;mixed&gt;&gt; $tags Allowed tags.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * @return array&lt;string, array&lt;mixed&gt;&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">ksesAllowedHtml</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:rgb(189, 147, 249);font-style:italic">array</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'source'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'src'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'type'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'video'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'muted'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'src'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'autoplay'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'div'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'data-*'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token constant boolean" style="color:rgb(189, 147, 249)">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">array_merge</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token keyword static-context" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">SVG</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token keyword static-context" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">FORM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token keyword static-context" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">IFRAME</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="es-alert es-alert--caution m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-candy-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-candy-30"><path d="M1 21 12 2l11 19H1Zm2.883-1.667h16.234L12 5.333l-8.117 14Zm8.187-1.283a.815.815 0 0 0 .83-.836.815.815 0 0 0-.836-.83.814.814 0 0 0-.83.836.814.814 0 0 0 .836.83Zm-.837-2.85H12.9V9.8h-1.667v5.4Z" fill="currentColor"></path></svg><span class="text-grey-500">Caution</span></i><div class="font-sans text-16 text-black"><p>Please be wary of the attributes you allow, as this could expose your website to cross-site scripting (XSS) and similar attacks!</p></div></div>
<p>Don’t forget to add this to the <code>register</code> method:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">add_filter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wp_kses_allowed_html'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$this</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'ksesAllowedHtml'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">20</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="media-class">Media class<a href="https://eightshift.oceanamazon.com/blog/tips-useful-features#media-class" class="hash-link" aria-label="Direct link to Media class" title="Direct link to Media class" translate="no">​</a></h2>
<p>To add the Media class to your project, use the following WP-CLI command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create media</span><br></div></code></pre></div></div>
<p>You can use the Media class to define new media sizes or allow uploads of the mime types that are not allowed by default.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * Allow additional types for uploads in media.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * @param array&lt;string, string&gt; $mimes Load all mimes types.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * @return array&lt;string, string&gt; Return original and updated.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">enableMimeTypes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword type-hint" style="color:rgb(189, 147, 249);font-style:italic">array</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$mimes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:rgb(189, 147, 249);font-style:italic">array</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$mimes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'svg'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">  </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'image/svg+xml'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$mimes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'zip'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">  </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'application/zip'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$mimes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'json'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'application/json'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$mimes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>And register the filter:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">add_filter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'upload_mimes'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$this</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'enableMimeTypes'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>This class also supports converting your media into <strong><em>WebP</em></strong> format, but more on that below.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="automatic-webp-conversion">Automatic WebP conversion<a href="https://eightshift.oceanamazon.com/blog/tips-useful-features#automatic-webp-conversion" class="hash-link" aria-label="Direct link to Automatic WebP conversion" title="Direct link to Automatic WebP conversion" translate="no">​</a></h2>
<p>The WebP file format is becoming more and more popular, with its smaller file sizes and better compression, it is a preferred replacement for .jpg and .png formats. Eightshift DevKit supports converting your existing files to WebP format.</p>
<p>If you already have the Media class in your project, you need to run this WP-CLI command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create webp-media-column</span><br></div></code></pre></div></div>
<p>This command will add a new column in your <em><strong>List view</strong></em> in Media Library that shows if the media is converted to WebP or not.</p>
<p><img decoding="async" loading="lazy" alt="WebP column in Media Library" src="https://eightshift.oceanamazon.com/assets/images/webp-column-5f5ad6cace4b91fa19882b3060fda7b0.webp" width="2100" height="834" class="img_ev3q"></p>
<p>To enable and convert existing media to WebP, run the following commands:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate run use-webp-media</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate run regenerate-media</span><br></div></code></pre></div></div>
<p>After running these commands, you’ll have your images converted to WebP. Some formats like <code>svg</code> will not be converted, this is intended.</p>
<p>Please note that the original files will not be deleted and you’ll have to add additional logic to your Image component for replacing the URLs.</p>
<p>Here’s a simple example how to do it:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// Check if webP is used from admin.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$isWebPUsed</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">isWebPMediaUsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// If webP is used override the url for large.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$isWebPUsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$sourceWebPLarge</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">getWebPMedia</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$imageUrl</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'large'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name static-context">Media</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">WEBP_ALLOWED_EXT</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$sourceWebPLarge</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$imageUrl</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'large'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$sourceWebPLarge</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'src'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-cookies-for-wp-rocket">Dynamic cookies for WP Rocket<a href="https://eightshift.oceanamazon.com/blog/tips-useful-features#dynamic-cookies-for-wp-rocket" class="hash-link" aria-label="Direct link to Dynamic cookies for WP Rocket" title="Direct link to Dynamic cookies for WP Rocket" translate="no">​</a></h2>
<p>This is quite useful when you have a GDPR plugin and you have to take the cookie value into consideration when serving the cached version of the site.</p>
<p>To add the GDPR cookie to the list of dynamic cookies, create a new class called Rocket with the following WP-CLI command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create service-example --folder=Plugins/Rocket --file_name=Rocket</span><br></div></code></pre></div></div>
<p>Add the following method to the Rocket class:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * List all dynamic cookies that will create new cached version.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * @param array&lt;string&gt; $items Items from the admin.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * @return array&lt;string&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">dynamicCookiesList</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword type-hint" style="color:rgb(189, 147, 249);font-style:italic">array</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$items</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:rgb(189, 147, 249);font-style:italic">array</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$items</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'gdpr'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$items</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Finally, add the following filter to the <code>register</code> method:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">add_filter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'rocket_cache_dynamic_cookies'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$this</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'dynamicCookiesList'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="yoast-seo-helper">Yoast SEO helper<a href="https://eightshift.oceanamazon.com/blog/tips-useful-features#yoast-seo-helper" class="hash-link" aria-label="Direct link to Yoast SEO helper" title="Direct link to Yoast SEO helper" translate="no">​</a></h2>
<p>The content generated by Eightshift blocks may be difficult for Yoast SEO to interpret, but there is a Yoast SEO helper included in our DevKit that fixes the issue and makes the content readable to Yoast SEO. By default, Yoast SEO can't read the content from custom dynamic blocks, so this helper tells it how to parse the content from the blocks.</p>
<p>To enable this, you have to add the following in <strong><em>src/Blocks/assets/scripts/application-blocks-editor.js</em></strong>:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> yoastSeo </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eightshift/frontend-libs/scripts/plugins'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">yoastSeo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="linters-and-coding-standards-checks">Linters and Coding Standards checks<a href="https://eightshift.oceanamazon.com/blog/tips-useful-features#linters-and-coding-standards-checks" class="hash-link" aria-label="Direct link to Linters and Coding Standards checks" title="Direct link to Linters and Coding Standards checks" translate="no">​</a></h2>
<p>Eightshift DevKit includes coding standards checks that will help you improve your code quality.</p>
<p>To run these commands, you have to be in the theme root folder. Here’s the list:</p>
<ul>
<li class=""><code>npm run lintStyle</code> - check your CSS files with StyleLint</li>
<li class=""><code>npm run lintJs</code> - check your JS files with ESLint</li>
<li class=""><code>composer test:standards</code> - check PHP coding standards errors with PHPCS</li>
<li class=""><code>composer test:types</code> - runs PHPStan static code analysis</li>
</ul>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>blocks</category>
            <category>plugins</category>
            <category>colors</category>
            <category>images</category>
            <category>classes</category>
        </item>
        <item>
            <title><![CDATA[Making your project multilingual]]></title>
            <link>https://eightshift.oceanamazon.com/blog/making-your-project-multilingual</link>
            <guid>https://eightshift.oceanamazon.com/blog/making-your-project-multilingual</guid>
            <pubDate>Thu, 01 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Examples of using I18n in a project]]></description>
            <content:encoded><![CDATA[<p>Tools like Google Translate can automatically translate websites with reasonable quality. However, users will have a much better experience if you add support for multiple languages in your project and manage the translations yourself.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="making-strings-translatable-in-php">Making strings translatable in PHP<a href="https://eightshift.oceanamazon.com/blog/making-your-project-multilingual#making-strings-translatable-in-php" class="hash-link" aria-label="Direct link to Making strings translatable in PHP" title="Direct link to Making strings translatable in PHP" translate="no">​</a></h2>
<p>A good practice is to use one of the I18n (internationalization) functions for your hardcoded strings, even if your website starts with a single language. This way, you can add multilingual support more easily later.</p>
<p>If you've worked on a multilanguage-capable project, you most likely came across <code>__()</code> and <code>_e()</code> functions. The main difference between the <code>__()</code> and <code>_e()</code> is that <code>__()</code> returns the value, while <code>_e()</code> echoes it. Both functions take two arguments: the first one is the string to be translated, and the second one is the textdomain that identifies the translation file.</p>
<blockquote>
<p>Textdomain is usually your project name written in kebab-case.</p>
</blockquote>
<p>While WordPress functions like <code>__()</code> and <code>_e()</code> will definitely do the job, it is much better to use the variants of these functions that also escape the output. These are <code>esc_html__()</code> and <code>esc_html_e()</code>. There are also a few more functions for I18n you can use, but to keep it simple, we'll just mention these two for now.</p>
<p>Here is an example of using one of these functions:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token delimiter important">&lt;?php</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">echo</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">esc_html__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'Contact'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'project-name'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token delimiter important">?&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="making-strings-translatable-in-js">Making strings translatable in JS<a href="https://eightshift.oceanamazon.com/blog/making-your-project-multilingual#making-strings-translatable-in-js" class="hash-link" aria-label="Direct link to Making strings translatable in JS" title="Direct link to Making strings translatable in JS" translate="no">​</a></h2>
<p>To translate the strings in the Block editor or options, you will first have to import the function from the <code>@wordpress/i18n</code> library.</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> __ </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@wordpress/i18n'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>To output your string, simply use it like this:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token function" style="color:rgb(80, 250, 123)">__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Icon position'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'project-name'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Alternative functions you can use are:</p>
<ul>
<li class=""><code>_n</code> for singular/plural forms</li>
<li class=""><code>_nx</code> for singular/plural forms with <em>gettext</em> context</li>
<li class=""><code>_x</code> for a translated string with a <em>gettext</em> context</li>
</ul>
<p>You can refer to the <a href="https://developer.wordpress.org/block-editor/reference-guides/packages/packages-i18n/" target="_blank" rel="noopener noreferrer" class="">block editor handbook</a> for more information on these functions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-i18n-class">The I18n class<a href="https://eightshift.oceanamazon.com/blog/making-your-project-multilingual#the-i18n-class" class="hash-link" aria-label="Direct link to The I18n class" title="Direct link to The I18n class" translate="no">​</a></h2>
<p>The easiest way to add I18n support to a project created with Eightshift boilerplate is by using the WP-CLI command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create i18n</span><br></div></code></pre></div></div>
<p>This command generated a new class inside the <code>src/I18n</code> folder. This class instructs WordPress to look for translations in <code>src/I18n/languages</code> with the textdomain defined as your project name. The next step is generating .po and .mo files that are used for translation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="generating-pot-file">Generating .pot file<a href="https://eightshift.oceanamazon.com/blog/making-your-project-multilingual#generating-pot-file" class="hash-link" aria-label="Direct link to Generating .pot file" title="Direct link to Generating .pot file" translate="no">​</a></h2>
<p>You can create a <code>.pot</code> (<em>Portable object template</em>) file by using WP-CLI. Run the following command in your project root:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp i18n make-pot</span><br></div></code></pre></div></div>
<p>Alternatively, you can use tools like <a href="https://poedit.net/" target="_blank" rel="noopener noreferrer" class="">Poedit</a> to generate a <code>.pot</code> file and generate translations from it later.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="translating-with-poedit">Translating with Poedit<a href="https://eightshift.oceanamazon.com/blog/making-your-project-multilingual#translating-with-poedit" class="hash-link" aria-label="Direct link to Translating with Poedit" title="Direct link to Translating with Poedit" translate="no">​</a></h2>
<p>Once you have the <code>.pot</code> file, you can use Poedit to generate <code>.po</code> and <code>.mo</code> files that are used for translating hardcoded strings in your project. When generating the files, you can choose for which locale you're creating the translation for. For example, if you are creating a translation for the German language, your files should be named <code>de_DE.po</code> and <code>de_DE.mo</code>.</p>
<p>After generating the files, go to <strong>Translation -&gt; Properties</strong> and navigate to the <strong>Sources Paths</strong> tab. Set the <em>Base path</em> to the theme folder path. In <em>Excluded paths</em> you can add folders like <code>node_modules</code>, <code>vendor</code>, and <code>public</code> to exclude external packages.</p>
<p>In the <em>Sources keywords</em> tab you can set additional functions for use in your project for translations. Commonly used functions are:</p>
<ul>
<li class=""><code>_e</code> for translating a string and echoing it</li>
<li class=""><code>__</code> for returning a translated string</li>
<li class=""><code>esc_html__</code> for returning a translated string which is escaped in a way it's safe to use within HTML</li>
<li class=""><code>esc_html_e</code> for echoing a translated string which is escaped in a way it's safe to use within HTML</li>
<li class=""><code>esc_attr__</code> for returning a translated string which is escaped in a way it's safe to use within an attribute</li>
<li class=""><code>esc_html_x</code> for returning a translated string which is escaped in a way it's safe to use within HTML, with a <em>gettext</em> context</li>
<li class=""><code>_n</code> for returning a translated string in a singular or plural form, based on the supplied number</li>
</ul>
<blockquote>
<p>If you're missing a string in your <code>.po</code> file be sure to check which function is used for translation for that string, and that the function is added to <em>Sources keywords</em>.</p>
</blockquote>
<p>After updating the settings, click on <em>Update from source code</em> option to get the updated list of strings to translate.</p>
<p>The translation process is simple. The left column represents the source text, and the right column the translation. When you have finished translating the strings, copy the <code>.po</code> and <code>.mo</code> files to the <code>src/I18n/languages</code> folder.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="js-translations">JS translations<a href="https://eightshift.oceanamazon.com/blog/making-your-project-multilingual#js-translations" class="hash-link" aria-label="Direct link to JS translations" title="Direct link to JS translations" translate="no">​</a></h2>
<p>The process of translating strings in JS has a couple of extra steps.</p>
<p>In order to translate strings in JS (e.g. Block editor strings), you will have to generate translation file. To do this, navigate to your <code>src/I18n/languages</code> folder and use the following WP-CLI command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp i18n make-json &lt;po-file&gt; --no-purge</span><br></div></code></pre></div></div>
<p>This will generate a <code>.json</code> file for each JS file present. The strings are extracted from <code>.po</code> files, so you'll already have the translations added. The <code>--no-purge</code> flag is used to keep the existing translations in the <code>.po</code> file.</p>
<p>The method used for setting the script translations is <code>setScriptTranslations()</code> from the <code>I18n</code> class.</p>
<p>The default way this works in Eightshift DevKit is that you need to have a single <code>.json</code> file with all the JS translations. If needed, you can either modify this method to read from multiple files, or just merge all the <code>.json</code> files into one.</p>
<p>If using the default setup (everything in one file) follow this naming structure: <code>{textdomain}-{locale}-{handle}.json</code>.</p>
<p>For example, if your <em>textdomain</em> is <code>project-name</code> and your locale is <code>de_DE</code>, your file should be named <code>project-name-de_DE-project-name-block-editor-scripts.json</code>.</p>
<blockquote>
<p>The block-related translations depend on the language the user has set in WP admin.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enabling-languages-and-content-translation">Enabling languages and content translation<a href="https://eightshift.oceanamazon.com/blog/making-your-project-multilingual#enabling-languages-and-content-translation" class="hash-link" aria-label="Direct link to Enabling languages and content translation" title="Direct link to Enabling languages and content translation" translate="no">​</a></h2>
<p>If the website itself needs to support content in multiple languages, a plugin is a good option.</p>
<p>The most common multi-language plugins are:</p>
<ul>
<li class=""><strong>WPML</strong> - one of the most popular plugins on the market. It is a paid plugin, but offers a lot of advanced options.</li>
<li class=""><strong>Polylang</strong> - a free plugin (also has a paid <em>Pro</em> version).</li>
</ul>
<blockquote>
<p>Explore other options as well, you might find a plugin that is a better fit for your project than WPML or Polylang.</p>
</blockquote>
<p>Most of the translation work will be done through the editor, since you'll need to translate the content on posts and pages.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="additional-resources">Additional resources<a href="https://eightshift.oceanamazon.com/blog/making-your-project-multilingual#additional-resources" class="hash-link" aria-label="Direct link to Additional resources" title="Direct link to Additional resources" translate="no">​</a></h2>
<p>Internationalization (<em>I18n</em>) and Localization (<em>L10n</em>) are very broad topics, so it's impossible to cover everything in a single blog post.</p>
<p>If you wish to know about the core I18n functionalities, or a bit more about how it is used in the Eightshift DevKit, here are a few resources which you may find interesting:</p>
<ul>
<li class=""><a href="https://codex.wordpress.org/I18n_for_WordPress_Developers" target="_blank" rel="noopener noreferrer" class="">WordPress Codex - I18n for WordPress Developers</a></li>
<li class=""><a href="https://eightshift.com/docs/basics/tips-tricks/#internationalization-i18n-and-localization-l10n" target="_blank" rel="noopener noreferrer" class="">Eightshift Development kit documentation - Tips &amp; Tricks</a></li>
<li class=""><a href="https://infinum.com/handbook/wordpress/translations/localization" target="_blank" rel="noopener noreferrer" class="">Infinum WordPress Handbook - Localization</a></li>
</ul>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>i18n</category>
            <category>multilingual</category>
        </item>
        <item>
            <title><![CDATA[How to use the Wrapper as a standalone component]]></title>
            <link>https://eightshift.oceanamazon.com/blog/wrapper-as-a-standalone-component</link>
            <guid>https://eightshift.oceanamazon.com/blog/wrapper-as-a-standalone-component</guid>
            <pubDate>Tue, 05 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Explains the process of using the Wrapper component in WordPress templates.]]></description>
            <content:encoded><![CDATA[<p>As one of the most powerful features in the Eightshift DevKit, the Wrapper is a part of every Eightshift block in the Gutenberg editor, but what about WordPress templates?</p>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p><a href="https://eightshift.com/docs/basics/blocks-wrapper/" target="_blank" rel="noopener noreferrer" class="">Wrapper</a> is designed to be the ultimate top-level component that controls how your block behaves in the website layout. It is a sort of a 'section' in traditional builders. By default, you can control a whole lot of stuff, but there is an option to add custom attributes and tailor the Wrapper to the needs of your project.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-wordpress-templates">What are WordPress templates?<a href="https://eightshift.oceanamazon.com/blog/wrapper-as-a-standalone-component#what-are-wordpress-templates" class="hash-link" aria-label="Direct link to What are WordPress templates?" title="Direct link to What are WordPress templates?" translate="no">​</a></h2>
<p>Before the days of <a href="https://developer.wordpress.org/block-editor/getting-started/full-site-editing/" target="_blank" rel="noopener noreferrer" class="">Full Site Editing</a> in WordPress, we used <a href="https://developer.wordpress.org/themes/basics/template-hierarchy/" target="_blank" rel="noopener noreferrer" class="">template files</a> to add custom layouts to a blog page or post archives.</p>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>While Full-site editing (FSE) <em>is</em> supported in Eightshift Libs, a couple of modifications have to be done in your project to make it work.</p></div></div>
<p>Depending on your setup, you might still use those as they are still a core part of WordPress themes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage-in-templates">Usage in templates<a href="https://eightshift.oceanamazon.com/blog/wrapper-as-a-standalone-component#usage-in-templates" class="hash-link" aria-label="Direct link to Usage in templates" title="Direct link to Usage in templates" translate="no">​</a></h2>
<p>Thanks to the <code>Components</code> helper, we can easily <code>render()</code> any component in our template.</p>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>Interested in how to use components in a block? Take a look at <a href="https://eightshift.com/docs/basics/blocks-component-in-block#i-have-a-component-that-i-want-to-use-manually" target="_blank" rel="noopener noreferrer" class="">our docs</a>.</p></div></div>
<p>For this example, we'll use <code>index.php</code>, as you already have it in your theme. If not, use the code below:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token delimiter important">&lt;?php</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * Display regular index/home page</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @package InfinumLibs</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">use</span><span class="token plain"> </span><span class="token package">InfinumLibsVendor</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">EightshiftLibs</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Helpers</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Components</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">get_header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">have_posts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">have_posts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token function" style="color:rgb(80, 250, 123)">the_post</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token function" style="color:rgb(80, 250, 123)">the_title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token function" style="color:rgb(80, 250, 123)">the_content</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">get_footer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="No Wrapper" src="https://eightshift.oceanamazon.com/assets/images/no-wrapper-97a4e7e283102852266b91e02be1c342.png" width="1084" height="398" class="img_ev3q"></p>
<p>And there it is, a bog-standard blog page that you can style only "the old way"... But not in our case!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-the-wrapper-component">Using the Wrapper component<a href="https://eightshift.oceanamazon.com/blog/wrapper-as-a-standalone-component#using-the-wrapper-component" class="hash-link" aria-label="Direct link to Using the Wrapper component" title="Direct link to Using the Wrapper component" translate="no">​</a></h2>
<p>First, let's import our <code>Components</code> helper class. Make sure to use the namespace from your <code>composer.json</code>.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">use</span><span class="token plain"> </span><span class="token package">InfinumLibsVendor</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">EightshiftLibs</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Helpers</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Components</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>If we look deeper into the <code>render</code> method, we'll see that for the <code>$component</code> parameter, we can pass the <em>component's name or the full path (ending with .php)</em>. We made it simple, so use <code>wrapper</code>.</p>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>If you are upgrading from an older version (supported since [Libs v6.5.7] (<a href="https://github.com/infinum/eightshift-libs/releases/tag/6.5.7" target="_blank" rel="noopener noreferrer" class="">https://github.com/infinum/eightshift-libs/releases/tag/6.5.7</a>) and <a href="https://github.com/infinum/eightshift-frontend-libs/releases/tag/8.6.2" target="_blank" rel="noopener noreferrer" class="">Frontend Libs v8.6.2</a>) copy code from <a href="https://github.com/infinum/eightshift-frontend-libs/blob/develop/blocks/init/src/Blocks/wrapper/wrapper.php" target="_blank" rel="noopener noreferrer" class="">wrapper.php</a> into your project.</p></div></div>
<p>We have two required properties to add to the Wrappers <code>manifest.json</code>: <code>wrapperOnlyOutput</code> and <code>wrapperManualContent</code>.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"wrapperOnlyOutput"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"boolean"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">"wrapperManualContent"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">echo</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">render</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapper'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapperOnlyOutput'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token constant boolean" style="color:rgb(189, 147, 249)">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapperManualContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">''</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">''</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token constant boolean" style="color:rgb(189, 147, 249)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>Setting the <code>$useComponentDefaults</code> to <code>true</code> will save you the trouble of setting a lot of additional properties by using default values defined in your manifest.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="wrapper-output">Wrapper output<a href="https://eightshift.oceanamazon.com/blog/wrapper-as-a-standalone-component#wrapper-output" class="hash-link" aria-label="Direct link to Wrapper output" title="Direct link to Wrapper output" translate="no">​</a></h3>
<p>Now that we have a working Wrapper component in our template, it's time to display posts in the loop.</p>
<p>Let's use the <a href="https://infinum.github.io/eightshift-frontend-libs/storybook/?path=/story/components-card--editor" target="_blank" rel="noopener noreferrer" class="">Card</a> from the Frontend Libs as it's the perfect component to display post details and pass it to the <code>wrapperManualContent</code>.</p>
<p>To make the Card component look even better, we'll use some of the powerful properties the Wrapper component has to offer and add spacing between each item.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapperSpacingTopLarge'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapperSpacingBottomLarge'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><br></div></code></pre></div></div>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>For the list of all available properties, look at the Wrapper's <code>manifest.json</code>.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-result">Final result<a href="https://eightshift.oceanamazon.com/blog/wrapper-as-a-standalone-component#final-result" class="hash-link" aria-label="Direct link to Final result" title="Direct link to Final result" translate="no">​</a></h3>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token delimiter important">&lt;?php</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * Display regular index/home page</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @package InfinumLibs</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">use</span><span class="token plain"> </span><span class="token package">InfinumLibsVendor</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">EightshiftLibs</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Helpers</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Components</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">get_header</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">have_posts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">have_posts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token function" style="color:rgb(80, 250, 123)">the_post</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">echo</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">render</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapper.php'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapperOnlyOutput'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token constant boolean" style="color:rgb(189, 147, 249)">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapperManualContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">render</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'card'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'introContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">sprintf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'On %1$s by %2$s'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'eightshift'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_the_date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_the_author_meta</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'display_name'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'headingContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_the_title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'paragraphContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apply_filters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'the_content'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_the_excerpt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'buttonContent'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'View more'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'eightshift'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'buttonUrl'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_permalink</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapperSpacingTopLarge'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'wrapperSpacingBottomLarge'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">''</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token constant boolean" style="color:rgb(189, 147, 249)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">get_footer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Wrapper with content" src="https://eightshift.oceanamazon.com/assets/images/wrapper-content-1fb48b3084f48f13075a3af67bc6c323.png" width="1082" height="586" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://eightshift.oceanamazon.com/blog/wrapper-as-a-standalone-component#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Although the Wrapper is (usually) not intended to be used as a standalone component, there is a nice benefit to having a time-saving, out-of-the-box solution for displaying content in a grid already defined in your project.</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>wrapper</category>
            <category>components</category>
        </item>
        <item>
            <title><![CDATA[Working with custom queries]]></title>
            <link>https://eightshift.oceanamazon.com/blog/working-with-custom-queries</link>
            <guid>https://eightshift.oceanamazon.com/blog/working-with-custom-queries</guid>
            <pubDate>Tue, 01 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Explains the process of registering a new service class, adding a custom query and using it in a block.]]></description>
            <content:encoded><![CDATA[<p>Eightshift DevKit offers some blocks with query logic out of the box, but what is the best approach when you need to add a custom query to a block you’ve been working on?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage-in-built-in-blocks">Usage in built-in blocks<a href="https://eightshift.oceanamazon.com/blog/working-with-custom-queries#usage-in-built-in-blocks" class="hash-link" aria-label="Direct link to Usage in built-in blocks" title="Direct link to Usage in built-in blocks" translate="no">​</a></h2>
<p>One of the Eightshift blocks that already uses <code>WP_Query</code> is the <em><strong>Featured Content</strong></em> block. In that block, you can see the query logic is inside the block. However, there is a much better way to do it. The reason it was done like this was to simplify this block and to have an already functioning block available with one WP-CLI command.</p>
<p>A much better approach would be to separate the query logic from the block. Other than following the MVC architecture more closely, this will also make the query logic more reusable. To do this, we’re gonna create a service class.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-service-classes">What are Service classes?<a href="https://eightshift.oceanamazon.com/blog/working-with-custom-queries#what-are-service-classes" class="hash-link" aria-label="Direct link to What are Service classes?" title="Direct link to What are Service classes?" translate="no">​</a></h2>
<p><em>Put simply, a Service is any PHP object that performs some sort of "global" task. - Symfony docs</em></p>
<p>If you take a look at the <code>ServiceInterface</code> interface, you’ll notice it only contains the <code>register()</code> method. This method holds action and filter hooks for that class. Other than hooking into existing actions and filters, this method can be used to register our own filters which can be used in blocks or other classes.</p>
<p>Basically, whenever you need to hook into actions or filters, you should use a Service class for that.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-new-service-class">Creating a new service class<a href="https://eightshift.oceanamazon.com/blog/working-with-custom-queries#creating-a-new-service-class" class="hash-link" aria-label="Direct link to Creating a new service class" title="Direct link to Creating a new service class" translate="no">​</a></h2>
<p>Creating a new service class in your project is as simple as using the following WP-CLI command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create service-example --folder=CustomQuery --file_name=CustomQuery</span><br></div></code></pre></div></div>
<p>Once this new class is generated, you can add a new public method that will contain the query logic. We want our method to accept three optional arguments:</p>
<ul>
<li class="">ID of the category</li>
<li class="">number of posts per page</li>
<li class="">number of the current page</li>
</ul>
<p>Having the category ID optional will allow for one more use case, and that is fetching the latest posts regardless of category. By default, WordPress sorts the posts by publish date, from newest to oldest.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * Get posts by category ID.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @param int $categoryId Category ID.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @param int $postsPerPage Number of posts per page.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @param int $currentPage Current page number.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @return WP_Query Query object.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">getPostsByCategory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$categoryId</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$postsPerPage</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentPage</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token class-name return-type">WP_Query</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$postArgs</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'post_type'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'post'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'cat'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$categoryId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'posts_per_page'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$postsPerPage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'paged'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentPage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">WP_Query</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$postArgs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>To use this method, we can add it as a filter. The filter name should be added as a constant for easier maintenance. Inside the <code>register()</code> method, add the following:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">add_filter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword static-context" style="color:rgb(189, 147, 249);font-style:italic">self</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">GET_POSTS_BY_CATEGORY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$this</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'getPostsByCategory'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-the-new-filter">Using the new filter<a href="https://eightshift.oceanamazon.com/blog/working-with-custom-queries#using-the-new-filter" class="hash-link" aria-label="Direct link to Using the new filter" title="Direct link to Using the new filter" translate="no">​</a></h2>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>Even if you register a filter for a method that doesn’t accept any arguments, when calling <code>apply_filters</code>, you must pass at least 1 parameter. In those cases, simply add <code>null</code> as a parameter.</p></div></div>
<p>Here are some examples how you can use the filter:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// Get 3 latest posts, regardless of category.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$allLatestPosts</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apply_filters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name static-context">CustomQuery</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">GET_POSTS_BY_CATEGORY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Get 10 latest posts from the News category. News category ID is 2.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$latestNews</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apply_filters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name static-context">CustomQuery</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">GET_POSTS_BY_CATEGORY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Get another page of News category.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$pagedNews</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">apply_filters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name static-context">CustomQuery</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">GET_POSTS_BY_CATEGORY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentPage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>The above example shows multiple use cases. The first two examples could be used in a simple block that displays only the selected number of the latest posts. The last example may be used in a REST route for a load more functionality or in a block with classic pagination.</p>
<p>Now you can do a regular query loop in your block to display the posts:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$latestNews</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">have_posts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$latestNews</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">have_posts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$latestNews</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">the_post</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">// render the card here with the Components::render helper.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">wp_reset_postdata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<div class="es-alert es-alert--caution m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-candy-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-candy-30"><path d="M1 21 12 2l11 19H1Zm2.883-1.667h16.234L12 5.333l-8.117 14Zm8.187-1.283a.815.815 0 0 0 .83-.836.815.815 0 0 0-.836-.83.814.814 0 0 0-.83.836.814.814 0 0 0 .836.83Zm-.837-2.85H12.9V9.8h-1.667v5.4Z" fill="currentColor"></path></svg><span class="text-grey-500">Important</span></i><div class="font-sans text-16 text-black"><p>Don't forget to add <code>wp_reset_postdata()</code> after looping through the custom query!</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prepare-only-the-data-you-need">Prepare only the data you need<a href="https://eightshift.oceanamazon.com/blog/working-with-custom-queries#prepare-only-the-data-you-need" class="hash-link" aria-label="Direct link to Prepare only the data you need" title="Direct link to Prepare only the data you need" translate="no">​</a></h2>
<p>If you would like to improve this even further, you can run the <code>have_posts()</code> loop inside the class and save only the data you need to render to an array. This makes the logic even more separated from the view and all you have to do in a block is loop through the array and populate the component attributes with the values from the array.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$postData</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$queryData</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">have_posts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$queryData</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">have_posts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$queryData</span><span class="token operator">-&gt;</span><span class="token function" style="color:rgb(80, 250, 123)">the_post</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$postData</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'id'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_the_ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'title'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_the_title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'url'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_permalink</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'image'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_the_post_thumbnail_url</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'date'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_the_time</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'d.m.Y.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'excerpt'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_the_excerpt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">wp_reset_postdata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$postData</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices-for-queries">Best practices for queries<a href="https://eightshift.oceanamazon.com/blog/working-with-custom-queries#best-practices-for-queries" class="hash-link" aria-label="Direct link to Best practices for queries" title="Direct link to Best practices for queries" translate="no">​</a></h2>
<p>It’s important to have query optimisation in mind. Some queries may be a lot slower and you have to see if there is any way to follow the <a href="https://infinum.com/handbook/wordpress/coding-standards/php-coding-standards/database-queries" target="_blank" rel="noopener noreferrer" class="">best practices for database queries</a>.</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>service</category>
            <category>class</category>
            <category>query</category>
        </item>
        <item>
            <title><![CDATA[Using multiple same components]]></title>
            <link>https://eightshift.oceanamazon.com/blog/multiple-same-components</link>
            <guid>https://eightshift.oceanamazon.com/blog/multiple-same-components</guid>
            <pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Explains how to use multiple same components inside]]></description>
            <content:encoded><![CDATA[<p>From time to time, you may need to create a block or a more complex component that uses more than one instance of the same component. In this blog post, we'll explain how this works in a bit more detail.</p>
<p>An example of this use case is the Card component, which uses two heading components. You may get the general idea by just going through the code and trying to reverse-engineer it, but this example will give you a much better understanding of how it works and how to use it. First, let's cover some basics.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="manifest-and-attributes">Manifest and attributes<a href="https://eightshift.oceanamazon.com/blog/multiple-same-components#manifest-and-attributes" class="hash-link" aria-label="Direct link to Manifest and attributes" title="Direct link to Manifest and attributes" translate="no">​</a></h2>
<p>The way multiple same components work is by having a different key. Here is an example of the Card component:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"components"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"image"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"image"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"intro"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"heading"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"heading"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"heading"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"paragraph"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"paragraph"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"button"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"button"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><br></div></code></pre></div></div>
<p>As you can see, one heading component has the <code>intro</code> key, while the other one has the <code>heading</code> key. That way the <strong>intro</strong> heading component is being referred to as <code>intro</code> so there is no mixup with the attribute values between the two heading blocks. This can be seen when setting the default attributes:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"cardIntroSize"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tiny"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">"cardHeadingSize"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"big"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-props-helper">The "props" Helper<a href="https://eightshift.oceanamazon.com/blog/multiple-same-components#the-props-helper" class="hash-link" aria-label="Direct link to The &quot;props&quot; Helper" title="Direct link to The &quot;props&quot; Helper" translate="no">​</a></h2>
<p>This method does all the heavy lifting for us. It replaces the default attribute names with the ones we provide. There is both the PHP and JS version of it.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">render</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'heading'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">props</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'intro'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'selectorClass'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'intro'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'blockClass'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$componentClass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&lt;</span><span class="token maybe-class-name">HeadingEditor</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token spread operator">...</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">props</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'intro'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token literal-property property">selectorClass</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'intro'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token literal-property property">blockClass</span><span class="token operator">:</span><span class="token plain"> componentClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">/</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>If you <code>var_dump</code> the props helper, you’ll notice the <code>prefix</code> key, which is built from the names of the blocks and components used hierarchically. For example, when looking at a regular Heading component in the Card block, the prefix will be:</p>
<p><code>cardCardHeading</code> - first is the Card block name, then the Card component name and finally Heading component name.</p>
<p>The Heading component that is called Intro then has the prefix <code>cardCardIntro</code>. This prefix is then added to the attribute name, which then finally results in <code>cardCardHeadingSize</code> and <code>cardCardIntroSize</code> attributes, for example.</p>
<p>While at first glance it seems strange to have this naming scheme, it actually allows us to figure out the hierarchy just by looking at the attribute name.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-step-by-step-example">A step-by-step example<a href="https://eightshift.oceanamazon.com/blog/multiple-same-components#a-step-by-step-example" class="hash-link" aria-label="Direct link to A step-by-step example" title="Direct link to A step-by-step example" translate="no">​</a></h2>
<p>The block we'll be creating as an example will be a block which we can use for some sort of comparison or listing pros and cons. To create it, we will need the following:</p>
<ul>
<li class="">two <code>Heading</code> components</li>
<li class="">two <code>List</code> components</li>
</ul>
<p>The easiest way to create a new block is by using the boilerplate command</p>
<p><code>wp boilerplate blocks use-block --name=example</code></p>
<p>Once the new block is added to your project, rename it. Also, don’t forget to update all file names and imports in JS.</p>
<p>We should start with <code>manifest.json</code>, where we define the components we'll use and set the default attributes. For now, just define the components and their keys:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"components"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"heading"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"heading"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"lists"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"lists"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"secondaryHeading"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"heading"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"secondaryLists"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"lists"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>The first section has the default key names, while the "duplicates" have different key names.</p>
<p>After manifest, we can move to the JS part. As this is a fairly simple block without any advanced options or layouts, we need to add two <code>HeadingEditor</code> components and two <code>ListsEditor</code> components. To make styling easier, we can separate them in two <code>div</code> elements. When you’re finished, your code should look like this:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'react'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> __ </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@wordpress/i18n'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">HeadingEditor</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'../../../components/heading/components/heading-editor'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">ListsEditor</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'../../../components/lists/components/lists-editor'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> props</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> selector </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eightshift/frontend-libs/scripts'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(80, 250, 123)">ComparisonEditor</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> attributes</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> setAttributes </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> comparisonPrimaryClass </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">selector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'primary'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> comparisonSecondaryClass </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">selector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'secondary'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)">blockClass</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)">comparisonPrimaryClass</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">				</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">HeadingEditor</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">...</span><span class="token tag spread method function property-access" style="color:rgb(80, 250, 123)">props</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread string" style="color:rgb(255, 121, 198)">'heading'</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">						</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">blockClass</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> blockClass</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">						</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">setAttributes</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> setAttributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">				</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">ListsEditor</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">...</span><span class="token tag spread method function property-access" style="color:rgb(80, 250, 123)">props</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread string" style="color:rgb(255, 121, 198)">'lists'</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">						</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">blockClass</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> blockClass</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">						</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">setAttributes</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> setAttributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)">comparisonSecondaryClass</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">				</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">HeadingEditor</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">...</span><span class="token tag spread method function property-access" style="color:rgb(80, 250, 123)">props</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread string" style="color:rgb(255, 121, 198)">'secondaryHeading'</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">						</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">selectorClass</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread string" style="color:rgb(255, 121, 198)">'secondary-heading'</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">						</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">blockClass</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> blockClass</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">						</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">setAttributes</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> setAttributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">				</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">ListsEditor</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">...</span><span class="token tag spread method function property-access" style="color:rgb(80, 250, 123)">props</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread string" style="color:rgb(255, 121, 198)">'secondaryLists'</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">						</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">selectorClass</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread string" style="color:rgb(255, 121, 198)">'secondary-lists'</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">						</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">blockClass</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> blockClass</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">						</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">setAttributes</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> setAttributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">		</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>Note how we defined the different names with the <code>props</code> helper. Additionally, we set the selector class for easier targeting of components when styling.</p>
<p>Next, we can add the options. Again, the <code>props</code> helper does all the heavy lifting for us. This is how the code should look after adding all component options:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'react'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> __ </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@wordpress/i18n'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> props</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> getOptions </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eightshift/frontend-libs/scripts'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">HeadingOptions</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'../../../components/heading/components/heading-options'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">ListsOptions</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'../../../components/lists/components/lists-options'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">PanelBody</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@wordpress/components'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">manifest</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'../manifest.json'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(80, 250, 123)">ComparisonOptions</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token parameter"> attributes</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> setAttributes </span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">PanelBody</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">title</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript function" style="color:rgb(80, 250, 123)">__</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag script language-javascript string" style="color:rgb(255, 121, 198)">'Comparison'</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript string" style="color:rgb(255, 121, 198)">'eightshift'</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">HeadingOptions</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">...</span><span class="token tag spread method function property-access" style="color:rgb(80, 250, 123)">props</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread string" style="color:rgb(255, 121, 198)">'heading'</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					setAttributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">options</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread function" style="color:rgb(80, 250, 123)">getOptions</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread" style="color:rgb(255, 121, 198)">attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> manifest</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">				</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">reducedBottomSpacing</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">ListsOptions</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">...</span><span class="token tag spread method function property-access" style="color:rgb(80, 250, 123)">props</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread string" style="color:rgb(255, 121, 198)">'lists'</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					setAttributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">options</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread function" style="color:rgb(80, 250, 123)">getOptions</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread" style="color:rgb(255, 121, 198)">attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> manifest</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">				</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">reducedBottomSpacing</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">HeadingOptions</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">...</span><span class="token tag spread method function property-access" style="color:rgb(80, 250, 123)">props</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread string" style="color:rgb(255, 121, 198)">'secondaryHeading'</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					setAttributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">options</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread function" style="color:rgb(80, 250, 123)">getOptions</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread" style="color:rgb(255, 121, 198)">attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> manifest</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">				</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">label</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript function" style="color:rgb(80, 250, 123)">__</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag script language-javascript string" style="color:rgb(255, 121, 198)">'Secondary Heading'</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript string" style="color:rgb(255, 121, 198)">'eightshift'</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">reducedBottomSpacing</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">ListsOptions</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">...</span><span class="token tag spread method function property-access" style="color:rgb(80, 250, 123)">props</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread string" style="color:rgb(255, 121, 198)">'secondaryLists'</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					setAttributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">					</span><span class="token tag spread literal-property property" style="color:rgb(255, 121, 198)">options</span><span class="token tag spread operator" style="color:rgb(255, 121, 198)">:</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> </span><span class="token tag spread function" style="color:rgb(80, 250, 123)">getOptions</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag spread" style="color:rgb(255, 121, 198)">attributes</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag spread" style="color:rgb(255, 121, 198)"> manifest</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag spread" style="color:rgb(255, 121, 198)">				</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag spread punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">label</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript function" style="color:rgb(80, 250, 123)">__</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag script language-javascript string" style="color:rgb(255, 121, 198)">'Secondary Lists'</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript string" style="color:rgb(255, 121, 198)">'eightshift'</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">				</span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">reducedBottomSpacing</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">			</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">		</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">PanelBody</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>Adding the PHP part should be simple, but here is the code for reference:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token delimiter important">&lt;?php</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * Template for the Comparison Block view.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @package Eightshift</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">use</span><span class="token plain"> </span><span class="token package">EightshiftVendor</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">EightshiftLibs</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Helpers</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Components</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$globalManifest</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">getManifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">dirname</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token constant" style="color:rgb(189, 147, 249)">__DIR__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$manifest</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">getManifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token constant" style="color:rgb(189, 147, 249)">__DIR__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$blockClass</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'blockClass'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">??</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">''</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonPrimaryClass</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">selector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'primary'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonSecondaryClass</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">selector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'secondary'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$unique</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">getUnique</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">?</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&lt;</span><span class="token plain">div </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token operator">=</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">"&lt;?php echo esc_attr(</span><span class="token string double-quoted-string interpolation variable" style="color:rgb(189, 147, 249);font-style:italic">$blockClass</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">); ?&gt;"</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token operator">&lt;</span><span class="token operator">?</span><span class="token plain">php </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">echo</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">outputCssVariables</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$unique</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$globalManifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token operator">?</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token operator">&lt;</span><span class="token plain">div </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token operator">=</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">"&lt;?php echo esc_attr(</span><span class="token string double-quoted-string interpolation variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonPrimaryClass</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">); ?&gt;"</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token operator">&lt;</span><span class="token operator">?</span><span class="token plain">php</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">echo</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">render</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'heading'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">props</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'heading'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">render</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'lists'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">props</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'lists'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token operator">?</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token operator">&lt;</span><span class="token operator">/</span><span class="token plain">div</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token operator">&lt;</span><span class="token plain">div </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token operator">=</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">"&lt;?php echo esc_attr(</span><span class="token string double-quoted-string interpolation variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonSecondaryClass</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">); ?&gt;"</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token operator">&lt;</span><span class="token operator">?</span><span class="token plain">php</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">echo</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">render</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'heading'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">props</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'secondaryHeading'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">render</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'lists'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">props</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'secondaryLists'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token operator">?</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token operator">&lt;</span><span class="token operator">/</span><span class="token plain">div</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&lt;</span><span class="token operator">/</span><span class="token plain">div</span><span class="token operator">&gt;</span><br></div></code></pre></div></div>
<p>The block should work properly now, but the two lists look the same. To make a difference between the two, we can change the default list colors in the manifest. If we don’t have the colors we want already available in the project, first we need to add them to the global manifest.</p>
<p>For a detailed explanation on how to add new colors to your project, you can read a previous blog post about <a class="" href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#adding-new-colors-to-your-project">modifying blocks</a>.</p>
<p>Now we have to add these new colors to the Lists component <code>manifest.json</code>. In <code>options</code> key, find the <code>listsColor</code> and add your new colors.</p>
<p>When the new colors are added to the Lists component, we can set these new colors as defaults by adding the following attributes in <code>manifest.json</code> of our Comparison block:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"comparisonListsColor"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"green-haze"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">"comparisonSecondaryListsColor"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"milano-red"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>The first list will now have green bullet points, and the second one will have red bullet points.</p>
<p><img decoding="async" loading="lazy" alt="Comparison block" src="https://eightshift.oceanamazon.com/assets/images/comparison-block-0abb53656f82a74375e23dc8334eb266.webp" width="1406" height="346" class="img_ev3q"></p>
<p>Notice again how the attribute name is structured - current block name (<strong>comparison</strong>), component name (<strong>Lists</strong> or <strong>SecondaryLists</strong>), attribute (<strong>Color</strong>).</p>
<p>If you’re ever in doubt of what is the exact attribute name, you can always <code>var_dump</code> the <code>props</code> helper for that component and you will see the full attribute names as the keys.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Array</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">(</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    [prefix] =&gt; comparisonSecondaryLists</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    // ...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    [comparisonSecondaryListsOrdered] =&gt; ul</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    [comparisonSecondaryListsSize] =&gt; body:regular</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    [comparisonSecondaryListsColor] =&gt; milano-red</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    [comparisonSecondaryListsColorOnlyMarker] =&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    [comparisonSecondaryListsUse] =&gt; 1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    // ...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">)</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://eightshift.oceanamazon.com/blog/multiple-same-components#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h3>
<p>Although this was a simple example, we covered the most important things to have in mind when using multiple same components in a block. For additional practice, you can add some more attributes or go through some of our pre-made blocks which use multiple same components. Some components/blocks you can look into are <code>Card</code> and <code>Quote</code>.</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>components</category>
            <category>blocks</category>
        </item>
        <item>
            <title><![CDATA[Block Patterns]]></title>
            <link>https://eightshift.oceanamazon.com/blog/block-patterns</link>
            <guid>https://eightshift.oceanamazon.com/blog/block-patterns</guid>
            <pubDate>Wed, 01 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Intro to block patterns and examples how to use them]]></description>
            <content:encoded><![CDATA[<p>Although Block Patterns may be similar to Block Variations, there are some differences between the two. This blog post will cover what Block Patterns are and how to use them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-block-patterns-and-why-use-them">What are Block Patterns and why use them?<a href="https://eightshift.oceanamazon.com/blog/block-patterns#what-are-block-patterns-and-why-use-them" class="hash-link" aria-label="Direct link to What are Block Patterns and why use them?" title="Direct link to What are Block Patterns and why use them?" translate="no">​</a></h2>
<p>Block Patterns are predefined block layouts which allow you to add content faster and make it look more consistent. The basic idea is to have a ready-made template which consists of multiple blocks, that have options predefined, and all you have to do is add content to these blocks.</p>
<p>They can be used in multiple ways. You can create sections composed of few blocks which you can then easily insert anywhere on the site. You can also create complex page layouts which could be used for writing blog posts, for example.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="technical-differences">Technical differences<a href="https://eightshift.oceanamazon.com/blog/block-patterns#technical-differences" class="hash-link" aria-label="Direct link to Technical differences" title="Direct link to Technical differences" translate="no">​</a></h2>
<p>As explained in the <a href="https://eightshift.com/docs/basics/blocks-patterns" target="_blank" rel="noopener noreferrer" class="">Eightshift Development kit documentation</a>, the main difference between variations and patterns are:</p>
<ul>
<li class="">variations provide data using <code>manifest.json</code>, while patterns are registered using PHP</li>
<li class="">variations appear in the editor in the same tab as blocks, while patterns appear in their own tab</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="registering-block-patterns">Registering Block Patterns<a href="https://eightshift.oceanamazon.com/blog/block-patterns#registering-block-patterns" class="hash-link" aria-label="Direct link to Registering Block Patterns" title="Direct link to Registering Block Patterns" translate="no">​</a></h2>
<p>To make registering new block patterns easier, there is a WP-CLI command which will help you create a new block pattern. For this example, the block pattern we're making is called <strong>Intro</strong>. To get started, run this WP-CLI command:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate blocks create-block-pattern --title=intro</span><br></div></code></pre></div></div>
<p>After generating the block pattern class, there are a few more adjustments you should make to it. For starters, you should update these methods:</p>
<ul>
<li class=""><code>getName()</code> - change the return value to <code>eightshift-boilerplate/intro-pattern</code></li>
<li class=""><code>getDescription()</code> - add any description you like</li>
</ul>
<p>Once these values are updated, you can make the layout you'll use as a Block Pattern. The easiest way to do it is to build your layout in the editor, switch to <code>Code Editor</code>, copy the code and paste in inside your <code>getContent()</code> method. Your pattern should now be available to use. For this example, we can create a simple pattern which consists of a Heading block and a Paragraph block.</p>
<p><img decoding="async" loading="lazy" alt="Option to switch to Code Editor" src="https://eightshift.oceanamazon.com/assets/images/code-editor-0f0cd8e07f7d3262475ca4cc8b7b2176.webp" width="364" height="422" class="img_ev3q"></p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">protected</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">getContent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:rgb(189, 147, 249);font-style:italic">string</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'&lt;!-- wp:eightshift-boilerplate/heading {"headingHeadingContent":"Post title goes here","headingHeadingSize":"big"} /--&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">	&lt;!-- wp:eightshift-boilerplate/paragraph {"paragraphParagraphContent":"\u003cem\u003ePost intro goes here\u003c/em\u003e"} /--&gt;'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="managing-pattern-categories">Managing Pattern Categories<a href="https://eightshift.oceanamazon.com/blog/block-patterns#managing-pattern-categories" class="hash-link" aria-label="Direct link to Managing Pattern Categories" title="Direct link to Managing Pattern Categories" translate="no">​</a></h3>
<p>To make managing block patterns easier, we can group them into categories. To start, we need a service class. This class will be used to register our custom categories and remove core categories. The fastest way to add it to our project is by using the following WP-CLI command:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create service-example --folder=BlockPatterns --file_name=ManagePatternCategories</span><br></div></code></pre></div></div>
<p>Now that we have our service class, we'll add methods for removing core patterns and pattern categories. First, the method for removing core categories.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * Unregisters core block pattern categories.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @return void</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">removeCoreCategories</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">unregister_block_pattern_category</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'buttons'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">unregister_block_pattern_category</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'columns'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">unregister_block_pattern_category</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'gallery'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">unregister_block_pattern_category</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'header'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">unregister_block_pattern_category</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'text'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>The second method will remove all core patterns</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * Removes support for core block patterns.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * @return void</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">removeBlockPatternsCore</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">remove_theme_support</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'core-block-patterns'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>For these methods to work, we need to add them to the <code>register()</code> method of our service class. Add the following actions:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">add_action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'init'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$this</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'removeCoreCategories'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">40</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">add_action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'after_setup_theme'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$this</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'removeBlockPatternsCore'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">20</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>If you try searching for patterns in your editor, you'll notice they are no longer available. Now we can move on to adding our block pattern categories. The best approach is to define the pattern category names as constants inside your class. In this example, we will add two categories: <strong>Templates</strong> and <strong>Sections</strong>. We can add the following code inside our class:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name-definition class-name">ManagePatternCategories</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">implements</span><span class="token plain"> </span><span class="token class-name">ServiceInterface</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">TEMPLATES_CATEGORY</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'templates-category'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">SECTIONS_CATEGORY</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'sections-category'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">// Removed parts of code for better readability.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * Registers new pattern categories.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * @return void</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">addCategories</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">register_block_pattern_category</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword static-context" style="color:rgb(189, 147, 249);font-style:italic">self</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">TEMPLATES_CATEGORY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'label'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain">  </span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">esc_html__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'Templates'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'es-blog'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">register_block_pattern_category</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword static-context" style="color:rgb(189, 147, 249);font-style:italic">self</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">SECTIONS_CATEGORY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'label'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">esc_html__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'Sections'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'es-blog'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Finally, return to your Intro Pattern class and update the <code>getCategories()</code> method:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">protected</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">getCategories</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:rgb(189, 147, 249);font-style:italic">array</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token class-name static-context">ManagePatternCategories</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">SECTIONS_CATEGORY</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In editor, in the Pattern tab, you should now see your new pattern category and the Intro Pattern.</p>
<p><img decoding="async" loading="lazy" alt="New pattern category and block pattern" src="data:image/webp;base64,UklGRgwTAABXRUJQVlA4IAATAACwZwCdASpdAUMBPjEYikQiIaEQWq0QIAMEtLd///b634z9Cned1QmEa1fkY1ZvoP6APEg6QHmA/UP9sfZG/oHsA9AD9cOsa/nP+S9gD+Af1n0sP28+CP9mf2h9pb/06zn4Z/nn4nd8v9H/FD93PWf8M+H/mP46f1j/r+8o+R/Gvp39D/H3+5/tn8K/2/8ePM34A/xfqBfh38Q/pv44/lByRYAPyH+L/3b+3fsR/cv3T9ar+I/Lv3G+p3+F9wH+G/xf+zfkn/jP/f9M99d4B/nfcA/jn84/xX+P/bv/Kf//7TP1T/H/3v9x/8////d3+Qf2H/U/5z9zv8T///wD/j38r/v/9u/yf/C/wf/+/8f22+tj9oP//7lP6mf+8SJAK3LLKSrj2agx/VpfQJFfYNI8+iizRuRtUFzEfrdPFIvBMW+XRGQPdyCE2D4pM5eAqAGO3HsyklTxpq0+JmpyOezifQ98VJXY7zsVtuMiBOYcBqoAcFtsXJ8EC2yXnS3iGaOMvcQqvVDqvaSgW/2lKXrmN++IQbfy6RS3UCb7rdpP1roFCl1AYyqYl7fRkksuWFNg6P9P6q9AdTT+qvQHMLo0NevFP6q9AdTT+qvQAcTX6cfToAcfpZpxc+ny6fmVsV10xqQkxdvsmDRu18avJ9vEu5DGECRMPy6HlR7NANE+W+GNnD3E3G/iKf1V30Q1mbInS0+KzB7TN6sltl90/MnJ5gX4fkdyEAddmNwLGH5ahDGCDlUr5uIW0MICnxsxkEr0qlygVsCfmVsT6YLvPYn8RTsXON/F2FhYWFhYWFhYWGbjuwcMhJXpBICmkBTSAak5jj7BG+eREQBx77hbRknbdFgcxdcMWSOA2xZ9qgKVAxBggVti8LMrYw9rtm4hyd2AboLcwApoeR4qIyuk4M7T1VIQX57mTmoLqJtVUaypVZUqsqUpnXL8KVdY3VzszMYUJPs6p+ZWxh+XUCRMPy05C3CjHuVl1PZ/Z+wNT7PtfpW9VegOpp/VXoA7qLs+06zlAjEU/qr0B1NP6q3KhZ8dQJEw/FGNp87OvGEC1MqlnowgSJh+XUCRMPy6gSJh+XUCRMPy6gSJh+XUCRMPy6gSJh+XUCMgAP7AhU8UBjlq2tG0/3JJpnU6lwxWxIfm4S/urPbnNfFcjPAZju5ilN08I6+/8FGBPDDwDLEDDtcmuyhY/Ty9pDFbysHJillWpcZz8lLXb7//3+G4KdVb83EmP98vy7MfsdzCwSL/r4Cxu93Zt/3TF8Vysd7EM+/g6sTuiiAnwtdL2MO16Nm910Gzvy/mIKbJ4ISheAY76rsCo3BQ6Zr6C5/QGeaf4gRQp/wxaTvDnlqY7F7hWRTjiS68cVHL0eA7mL+G1TQcIzIdVn5fOtfe8WyqppWzzMhN3znCZpYRNU6IZf4hX+1n4WTevLqiCnGYqBxpusw/ApfNr+TsJzCAQHoxA0b0OlFUM1oYoXgwNen2ThlBZ0DmcBwrbiJ9r3tZ+rsP7S3KxYoZdHWmuh7C1/zOenmNtl3neuy1C/ZZTh8lvUpmEZPu33qG9Udyp6hrqtpLj6z0SP83se3qm1ptH3d6YdlNtg5S+ksIGqx1QMrUCxQTDvCZVeUOxZtrFkANkAklLVPRx7zMYUxVeC8tq5L6fKRzzjowF8ianGZVbe0plHAX/jW9xY5OrKD/Tol05qWdHZdsc2tKEf8yLkehDDXZjMRMpO+pLRQb2E99/19lP0GeL8Pz/NE3sxQNtcE/mYCwIKX/vcZIu6Vh6P31h3RwMrKQ8r5QQeItXXIPkS2CKeJxfNrxvoW5Ur92WztprauwYPJuXpgKiWi/6KM2N7/Jm4fIuargY36sv7re1fmkJU8DaBfnrwcn/nwim1PPkU2nmlEQ7kn65eC5xRpZTkcvBcz3/6ODpbo5gyXLYKtrLCkV46uNQ1QWPQ4E4isbNEwfwWI4dh7CqD2n0yI2N/7BGGKEXEef4uaSPhViR//mOf/Mvbkb1zKveieThUD2mU0LvmKpHU5CsZ1MtR3D1wArmXfqOvt6b6MWwASns5iTdxbysq85d7sDGU72zH9t1ypgWeot3SbMwmqEmGfxrDP0/gKOFuHZhlbDhTGFxd+MutxmkBJ9mr0cMT8gDYvF3pp/VfPxgEL1QRDjkxQBuQ9m/l9T9VhR3CSLG9hxH5vAi8HU6w1DZVUfH5gdnEVoClLgBl0WXKS1dJbwP9nTWAQ2HtwMyzf1bVwW9/RXjfzqlZnbImE2rK8WBSYJoDpUP9avytQJ110N3rMDwb9r33Ysbwlj5kuc/j7xbYu73zpWrIk95Eh99O+VXlO9JnjxkDE8TUvm2p5m4z0FLVquVj8sd1Ti64A1KbFxliK64e0qn0EvI7rG+PfTZFMxSpFC+XErkbtqxtGh3hKR3S05zZ//42SnUefBWBcr2NLZdpis8k5p3kuzXjIR2qvXcOPOqGtDulpH0nHbSHj8QFVIBGIqs0Dn8dLlxCy5S9hBFniqaFxGt9pLW8H4BErxJGCzZz4I/CFUU6EgnyHdXdg1KO6lyMAM2dDN0n6P8jdVtUbKAaW7MS2UP8bvuHdpc+JXqFi9veFeUk4SIHbBRvYGY70TXcu6Tm4tbAS8wA/hR/Ih//7IKF0wE4iHcOzQJIC9FOFL54Xn2iGxJ93NnMZQn0oZSJ9avH74hvYwIW6ybhUqJ4qbX2HtRZIgdhYrDjGGWj/Rs+fVn7x4qIb8prt1wIvGMtozoEhhmOuSBFkn/NiLa8UHKPIX4uOcuAPpSZFNjxX5ws1FAFp0uiA7Ihqi4AqkkOEbIGyBsgbIGyBsgbIGyBncACDicgwM4xQAaI+HXwpY7oZPhWgqYLt77wbvWgkwqZY5VH2CxGYBzyiZfQONYT9YstfFfvUKIdt1DCZr2+2hqNtWoidboAR951PG4p1zXcGT1ifbBMq0b2ZdrVQsVWdWxgsRaexCt5tCa5bUvas0/1J0QI8RVT1TIUmuqHh4lw3y0gHLXtmmvrjtPv6INPs93IZq+E8DGJnm6+dO5XL35tNjsTHVm8GWuavvh1FsM1Apr9Kpdaj1Vuys4QApzQ2yYu6Xvq3aOFwAKO5NmtABk3wx20RSSiuTe8n5ElbOH7/exV7w1sEtUkRhxS//7dqRcFMCRLynvr4adAqHgrYXC6GjdUFrFESZMil6KdpYNv296xgwvF9BvhaUu+A2/zWlte2pzF6ryef7kkt6fqBg1jRz0RZTvh4/WEe4PljM7kTLD3fT7YejUElUirIfS9GLZstx38YyvQbE+GxGzyS481C3GSyzmhK5FfcJrl6Hrg/p0v62iEabJT4ACBL3RhC3QIBevgB+MJQCsw9njyV+ofmeYxBv7tq/FDLlJKeRYMf0OQpe2FbFjTcNmDaoPQB+1CUBH709/yRZU/Gz9Jcj05qS2nYSpPMuzm9b4n/6YqFVilEXXcxwlMxFD7bM2b1UdWWnfCQetMBAaS26jTdl1ZdIwqd24xgDrcoPaPamE6XMMeZbq2oL+WYrmRkDr0R2PUX1dYfUnWQUHPngweQKlPhHfkCMLfRwzkNKaiQzna5CEHXQfv4EvIotfKFkECBYDvlwRqTvdwjUJKR3GYOVrbvzd+AH9830SP7LTCvcJwvL7Qfd6IqXwACDTJc00AeNaGheyoJBBi5eboRYrswEnSB1ypFWi0v5+Zxmie78z5mfA4GZhninOdAxGluxHh98QC9xxhot6lRQZ8DVd566XjKpxByGvh0maV5TovcrLDLEka2fkNPASjzXQ3CZmDjzgG83Ccq7WVUyLbsgs3B6lLOzD8isXXiBV0zSXmO5pWI4swg6sx2VufnQPgWZE4YxLpfertfbkpO+VJ+kWFIU9yA5t05+OhKU6m0QXyYnzCDNAZBteQXjLEKzwQ3xLXXPl9N75YpDOk84CsRC11IFe3P0cNU26HHoDTI3KbDI3TJLGhwni3d2mPgkd4K5JVzzRftPEt/yFd/desrIf5PWVtIN0QAoifCcjRNNH1aGZ42lELBAX8Ywg5wnCGw37anVOGCkxTfac68HXgc4e9i+f/A6xb/nY7iI3aUcpRGq40Op6Ki/mN/XLL1nEbT3Y8wCKFFZ/BXqaxv55h+19WHr0i66DO4BU1cBcqovg8lhzUQELoZttsN8ji1R0WkHGQ5VPWTaT/Fn36hHSb0hwyzgG84TBriAOY3zaVNXNrIt5eq3M5LVdqJcjkSfSGWoR3/8mi3/5qmh/M5r/+nLdf/VbBTfnJNHY6o2WQZzDbJzDbJzDbJzDbJzDSzJZ93QC0kEMdJXl8u6nvCEKEHJb9e/VPYxZu+gyJbuI5rsQJA7rAtNnOCtx+FJKhmtQA/BKwPcIB3+z/z9vKLdL8Aj1l/mz7e+px6df17O/G/qN4UWaGy48ADBB0PUXFNhxwpTZN/gvg52eolxBpVxhNsvRGEAuOFInMfrGPrxYqSKzw2k9nAhqbSBFs++M/SokjgTFXjyYe5NZiBXIPAmcVx2U0XZ0CtBzWgQUlPUfrrX9Iix9nmQYy/IrZQIDCRUGMTLvoe0mjcfPYYiU1mfaQgC29iyUi3uYWIN08wPY/iWOZu687Ma4Mj3tvCy/i1RHt+62WzK30/FYCkkF68yp1Muv2Bm1v1bBTFZs0GyDOBVhaYdwj1NdpwWcYU4W+so5WOPzSyS4g5d3t99L2659M54e9x1M+Q9ncCwx0iwZEtGZxkgnWBQVnyVXObsGi19IKJZ+2TG/cz4RCGBwgyX8HRNSie/2Hm2m701GFiXkiQ1u2i19p21ilK88+gxAH0JI7dye0IYdmxB4GGB5VnQMi1h8bXdaPV0+VbGPiQmj7KzJ+7jeuMxd91nD4eML71mO08f5pdzOu4oelK99fohaY3Xa/uarpCfzLx+sJ2zPHNXL5ZG+o56f7xCZbm11Wtsog30ux5UZ5sXpKhJGyAdMKhB9nqzbVk3gIWMZwA+fMT9pu8yz7RteDMQRr4rjDwio7MYGbOIfQL/lgQZfnP4UvMv+/y64tUVLn4fdaKSmsR0CZpRHc14De6woFgS9UQXzZ/Bogg2KASyjnJX+mTfvpr8YWZT6gbOBiJJsH7OXLT9X7IunaFGvKpGZ50fsZwHrPHdHA3l+SwilTD4XLjhL0bH/0u/NeThw3vqvHwMsuUoGDRJZ77uYOxQpZR6GntQ4X+fxVATrXZeH9vw1DhXKIHJkDPDeUYioAsN20t2J92v96ix5j28BMhCcBhrg7AK1gaZ/r8k2rkKB7vkbcSVjNJNb3fL688UKfSouEPB8nDSb72HXDfv1a2TwIoszc6Cf0yuCl9SEARRINNzrVcimXIaFyvP2j55PHDQQjYukk0UFURqlHPe0Ff6YAVQCpOqkieXXmtqZHkaKYunc74Vn793jOc/COaMROGtbpyuvuV0XTTD4V6PQ0wLJ00XeUwFKc7RP2V7HR2Q+gGGxeiw4/7vsqSTGi8ZGmraJYGP+0qNE2iSF/9KRdhAMAknh/xYucyq3O9eig/mwVwzMZU3Z+VIIU4abDljzHfeY6InU91H/+HGZ5NmhRs1Ux307tvzbZSWOQOsIaLhT7oULovjp0Fxi2RfHi79tcc0usGYsDHkkX/Wwtwkemnhl/vSLAqhIToz2Z1QpJV0hvJSNUQzmJp77YkRG8H8STPktB8qxz7/+tj9L36VVY3uim1Jobde/E7kVcv2or/PRPS2mIAmKyIBdMx7k43kyrXAg2Fw5KB86BJlGOvEKKlzQWSKF7pnLt+pQ69Yc+e9ueHqAsOSZrzwQVXykYjEF0rqB8EzZgDxwHmjstO0ZkjAMNNlFDFy4I1duiWudlNlg+UAY+Q/RWHpP/UdD+fH1RucBP//g19Z1Mj20Izeg+Q0QA2CAGpsAYtADCwZVS2S8JKpiv0keCUAPuDKaiN0vSJkmMqvUG/Z74nUOpUNqzeACYnFqvTBMytD9LY6RJy0C/ELnZEvhGAzsl+DlBRJEHn34kwSUNOdSoV4XuRvqgID97FLx4KMuFbWdbE1Hc/bw9UPFe1LyhXA33JJNe2gb0fBSMeTbH4SRMmvbE63Qtkvo0IIx4X7AJ3mm5egfnrXUpLP8FnwJIMKRoGO+v1qy63XWXr24e2dbTnlyUTz6hSvAJnovOUKWgyBy+2ZHRilaFCE0NkkfGAIBTgLhb5IusbpfaXYXpu1iD5vhT1IQmQVUcoiXyFFDCHAYkj0bvr1CtygF+316+SAxOq3Jx/QzlZD/iARs2JdBg0HjYjLuBPfGZrlO9G3GYsvpL1C7M0q42gG8Ikowyz62zPB8FWAgj85B/lCMU0H1c69G+XEUctrK/psmrqsG8u3vVM0wnpxTUn5PZVE881nzoqye4mpB6WndaOVtIyOMasiLkCyofedFkSWYZz5KQknasZu92q/YrjR74F37ZwYJCLatHDBvCOqfKPgL5YJRI+HGTpnaP3R4V/WMp005WAyd2yqwAAAAAAA" width="349" height="323" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="things-to-keep-in-mind">Things to keep in mind<a href="https://eightshift.oceanamazon.com/blog/block-patterns#things-to-keep-in-mind" class="hash-link" aria-label="Direct link to Things to keep in mind" title="Direct link to Things to keep in mind" translate="no">​</a></h2>
<p>Block patterns add layout and content which you can then modify at will per instance. These instances are not synchronised with the codebase so it becomes an issue if you've already used a pattern on multiple places on the site and then notice you've missed something in the pattern configuration phase. Fixing the pattern in the codebase will apply the changes on all newly added instances, but you will have to fix the misconfigured instances manually.</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>block</category>
            <category>patterns</category>
        </item>
        <item>
            <title><![CDATA[Using Custom Post Types and Taxonomies]]></title>
            <link>https://eightshift.oceanamazon.com/blog/using-cpts-and-taxonomies</link>
            <guid>https://eightshift.oceanamazon.com/blog/using-cpts-and-taxonomies</guid>
            <pubDate>Tue, 13 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[How to register and use custom post types and taxonomies with Eightshift Dev Kit]]></description>
            <content:encoded><![CDATA[<p>WordPress offers two default ways to group content by content type - using posts or pages. Posts and pages are registered as default post types in the WordPress app. But sometimes, that is not enough. That's where custom post types (CPT) and custom taxonomies come in. This blog post will cover the basics of registering CPTs and taxonomies using Eightshift Dev Kit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-should-you-use-cpts">Why should you use CPTs?<a href="https://eightshift.oceanamazon.com/blog/using-cpts-and-taxonomies#why-should-you-use-cpts" class="hash-link" aria-label="Direct link to Why should you use CPTs?" title="Direct link to Why should you use CPTs?" translate="no">​</a></h2>
<p>The great thing about WordPress is how extensible it is. With projects becoming more complex, the need for additional post types and taxonomies increases. Sure, you can cram everything into default posts or pages, but this can become very chaotic. Using custom post types allows you to manage your content much better. You can separate events and projects from news articles for instance.</p>
<p>Post <code>category</code> and <code>tag</code> are taxonomies - a grouping you can further separate by terms belonging to that taxonomy. WordPress, since version 2.3.0 offers a way to register your own, custom taxonomies.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="registering-custom-post-types">Registering Custom Post Types<a href="https://eightshift.oceanamazon.com/blog/using-cpts-and-taxonomies#registering-custom-post-types" class="hash-link" aria-label="Direct link to Registering Custom Post Types" title="Direct link to Registering Custom Post Types" translate="no">​</a></h2>
<p>For this exercise, we'll create a new post type called <code>Projects</code>. To make the process of registering new CPTs as easy as possible, we'll use a WP-CLI command to create our CPT with the following command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create post-type --label='Project' --plural_label='Projects' --slug='project' --rewrite_url='project' --rest_endpoint_slug='projects'</span><br></div></code></pre></div></div>
<div class="es-alert es-alert--tip m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-sand-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-sand-30"><path d="M11.975 23a2.42 2.42 0 0 1-1.302-.353 1.844 1.844 0 0 1-.788-.967h-.257c-.495 0-.924-.182-1.288-.545a1.761 1.761 0 0 1-.545-1.288v-3.924a8.44 8.44 0 0 1-2.773-2.96C4.341 11.753 4 10.422 4 8.975c0-2.218.775-4.102 2.324-5.651C7.873 1.774 9.757 1 11.975 1s4.102.775 5.651 2.324c1.55 1.549 2.324 3.433 2.324 5.651 0 1.46-.34 2.793-1.022 3.997a8.465 8.465 0 0 1-2.773 2.951v3.924c0 .495-.182.924-.545 1.288a1.761 1.761 0 0 1-1.288.545h-.257c-.147.41-.41.732-.788.967a2.416 2.416 0 0 1-1.302.353Zm-2.347-3.153h4.694V18.71H9.628v1.137Zm0-2.237h4.694v-1.082H9.628v1.082Zm-.238-2.915h1.888v-3.502L8.785 8.7l.953-.953 2.237 2.236 2.237-2.236.953.953-2.493 2.493v3.502h1.888c1.063-.501 1.922-1.267 2.576-2.296.654-1.03.98-2.171.98-3.424 0-1.723-.592-3.178-1.778-4.363-1.185-1.186-2.64-1.779-4.363-1.779-1.723 0-3.178.593-4.363 1.779-1.186 1.185-1.779 2.64-1.779 4.363 0 1.253.327 2.394.981 3.424.654 1.03 1.513 1.795 2.576 2.296Z" fill="currentColor"></path></svg><span class="text-grey-500">Tip</span></i><div class="font-sans text-16 text-black"><p>If your new CPT is not working, try flushing rewrite rules by re-saving the settings in <strong>Settings -&gt; Permalinks</strong> or by using <code>wp cache flush</code> CLI command</p></div></div>
<p>Your new post type is registered and ready to use! Easy, right?</p>
<p>Sometimes all these parameters can be a bit confusing, so here's a quick reference of best practices when setting these parameters:</p>
<table><thead><tr><th>Parameter</th><th>Singular/Plural</th><th>Writing style</th><th>Example</th></tr></thead><tbody><tr><td>label</td><td>Singular</td><td>Regular</td><td>Project</td></tr><tr><td>plural_label</td><td>Plural</td><td>Regular</td><td>Projects</td></tr><tr><td>slug</td><td>Singular</td><td>kebab-case</td><td>project</td></tr><tr><td>rewrite_url</td><td>Singular</td><td>kebab-case</td><td>project</td></tr><tr><td>rest_endpoint_slug</td><td>Plural</td><td>kebab-case</td><td>projects</td></tr></tbody></table>
<p>There is a reason for this naming convention. For example:</p>
<ul>
<li class=""><code>slug</code> is attached to a single custom post type in the database, which is why it is written in singular</li>
<li class=""><code>rest_endpoint_slug</code> is used to fetch a collection of posts from that custom post type, which is why it should be written in plural</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="registering-taxonomies">Registering Taxonomies<a href="https://eightshift.oceanamazon.com/blog/using-cpts-and-taxonomies#registering-taxonomies" class="hash-link" aria-label="Direct link to Registering Taxonomies" title="Direct link to Registering Taxonomies" translate="no">​</a></h2>
<p>Now that we have the new custom post type, we need a way to group the projects. We'll create a custom taxonomy called <code>Project Technology</code>. As with the CPT registration, the easiest way to register taxonomies is by using the following WP-CLI command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create taxonomy --label='Project Technology' --plural_label='Project Technologies' --slug='project-technology' --rest_endpoint_slug='project-technologies' --post_type_slug='project'</span><br></div></code></pre></div></div>
<p>Similar suggestions apply to the parameters when naming taxonomies as well. Be sure to write the correct post type slug for which you are registering this new taxonomy!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="structure">Structure<a href="https://eightshift.oceanamazon.com/blog/using-cpts-and-taxonomies#structure" class="hash-link" aria-label="Direct link to Structure" title="Direct link to Structure" translate="no">​</a></h2>
<p>When checking your codebase after adding these new custom post types and taxonomies, you'll notice the post types are located inside the <code>src/CustomPostType</code> folder, and the taxonomies are located inside the <code>src/CustomTaxonomy</code> folder. Following the <strong>Single Responsibility Principle</strong>, each post type or taxonomy is in a separate class.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="modifying-options">Modifying options<a href="https://eightshift.oceanamazon.com/blog/using-cpts-and-taxonomies#modifying-options" class="hash-link" aria-label="Direct link to Modifying options" title="Direct link to Modifying options" translate="no">​</a></h2>
<p>Our custom post type and taxonomy are ready to use, but we still want to make some changes. For starters, we want another icon and for the Projects to be located below the Posts in the WordPress admin menu. In <code>src/CustomPostType/ProjectPostType.php</code>, find the <code>MENU_POSITION</code> constant and change it to <code>5</code>. The lower the number, the higher it will be in the menu.</p>
<p>Next, we want to update the icon representing the new post type in the menu. These icons are named dashicons. Change the <code>MENU_ICON</code> constant to <code>dashicons-clipboard</code>. If you want another icon for your CPT, here is the list of <a href="https://developer.wordpress.org/resource/dashicons/" target="_blank" rel="noopener noreferrer" class="">available dashicons</a>. Finally, we want to remove the author and comments. In <code>getPostTypeArguments()</code> method, find the key <code>supports</code> in the return value and remove <code>author</code> and <code>comments</code> from the array.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="clashing-slugs">Clashing slugs<a href="https://eightshift.oceanamazon.com/blog/using-cpts-and-taxonomies#clashing-slugs" class="hash-link" aria-label="Direct link to Clashing slugs" title="Direct link to Clashing slugs" translate="no">​</a></h2>
<p>Something that can happen when working on your project is that you have the same slugs for your custom post type and your page, for example. Let's say you have a page with a slug <code>project</code>, and a custom post type with a slug <code>project</code>. When trying to access the page, you'll keep getting the Project CPT archive. To fix it, you have to change one of the slugs or write a custom redirection rule (which we don't recommend, as the redirections are tricky to handle in WordPress).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-reading">Further reading<a href="https://eightshift.oceanamazon.com/blog/using-cpts-and-taxonomies#further-reading" class="hash-link" aria-label="Direct link to Further reading" title="Direct link to Further reading" translate="no">​</a></h2>
<p>For the best overview of all the options you have when registering your custom post type or taxonomy, we recommend checking the official WordPress docs for the <a href="https://developer.wordpress.org/reference/functions/register_post_type/" target="_blank" rel="noopener noreferrer" class="">register_post_type()</a> and <a href="https://developer.wordpress.org/reference/functions/register_taxonomy/" target="_blank" rel="noopener noreferrer" class="">register_taxonomy()</a> functions.</p>
<p>If you would like to know more about taxonomies and terms, along with how they are stored in the database, you can read more about it in the <a href="https://developer.wordpress.org/themes/basics/categories-tags-custom-taxonomies/" target="_blank" rel="noopener noreferrer" class="">Categories, Tags, &amp; Custom Taxonomies</a> page of the WordPress docs.</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>cpt</category>
            <category>custom post type</category>
            <category>taxonomy</category>
            <category>taxonomies</category>
            <category>terms</category>
        </item>
        <item>
            <title><![CDATA[Block Variations]]></title>
            <link>https://eightshift.oceanamazon.com/blog/block-variations</link>
            <guid>https://eightshift.oceanamazon.com/blog/block-variations</guid>
            <pubDate>Wed, 07 Sep 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Intro to block variations and examples of how to use them]]></description>
            <content:encoded><![CDATA[<p>Let's picture the following scenario: You just created a block with many options and now you want multiple versions of that block available with pre-set options. That's where variations come in handy!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-variations">What are variations?<a href="https://eightshift.oceanamazon.com/blog/block-variations#what-are-variations" class="hash-link" aria-label="Direct link to What are variations?" title="Direct link to What are variations?" translate="no">​</a></h2>
<p>Block variations allow us to override default block attributes. We can select a variation from the block list with all preset options instead of manually setting them.</p>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>You cannot add new attributes in variations. Only attributes that exist in the parent block can be used.</p></div></div>
<p>For example, we have a <code>Card</code> block. If we want to use it for something like downloading PDF files, we may not need image or paragraph components. A simple text that describes type of the file, title of the file and a download button are all we need in this case.</p>
<p>Our new card should consist of the following components:</p>
<ul>
<li class="">intro</li>
<li class="">heading</li>
<li class="">button</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-register-a-block-variation">How to register a block variation?<a href="https://eightshift.oceanamazon.com/blog/block-variations#how-to-register-a-block-variation" class="hash-link" aria-label="Direct link to How to register a block variation?" title="Direct link to How to register a block variation?" translate="no">​</a></h2>
<p>The process of registering block variations is fairly simple. In order to register a block variation, go to <strong>src/Blocks/variations</strong>, add a new folder, and let's call it <code>card-resource</code>. Inside that folder, all you need to do is add a <code>manifest.json</code> file. It is also recommended to add a <code>docs</code> folder in which you can add a readme file and storybook file.</p>
<p>Inside your <code>manifest.json</code> file, add the attributes to define the new default attributes for this variation. Here is an example:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"$schema"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://raw.githubusercontent.com/infinum/eightshift-frontend-libs/develop/schemas/variation.json"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"parentName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"card"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"card-resource"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Card Resource"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"description"</span><span class="token plain"> </span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Card variation without image and paragraph"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"icon"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"src"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"es-card"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"attributes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"cardCardImageUse"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"cardCardParagraphUse"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"cardCardHeadingSize"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"regular"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"cardCardButtonColor"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"blue"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"scope"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string" style="color:rgb(255, 121, 198)">"inserter"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>After adding this code, your new block variation should now be visible in the block list. It's that easy!</p>
<p><img decoding="async" loading="lazy" alt="Variation of the Card block" src="data:image/webp;base64,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" width="252" height="125" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="providing-inner-block-data">Providing inner block data<a href="https://eightshift.oceanamazon.com/blog/block-variations#providing-inner-block-data" class="hash-link" aria-label="Direct link to Providing inner block data" title="Direct link to Providing inner block data" translate="no">​</a></h2>
<p>Other than overriding default attributes with variations, you can do much more with Eightshift Development kit. If you have a block that uses inner blocks, you can even provide inner block data.</p>
<p>The following example is very basic, but it will give you an idea of how to provide inner block data. It can easily be reproduced with our <code>Carousel</code> block if you want to try it yourself.</p>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>If you don't have Carousel block in your project yet, you can add it with the following WP-CLI command: <code>wp boilerplate blocks use-block --name="carousel"</code></p></div></div>
<p>Once you have the <code>Carousel</code> block up and running, create a variation called <code>Carousel Loop</code>. For this variation, we want the following:</p>
<ul>
<li class="">loop</li>
<li class="">pagination</li>
<li class="">two images per slide</li>
</ul>
<p>We will also add some placeholder images so you can immediately test the Carousel block variation. Here is the code you can add to the <code>manifest.json</code> file for that variation.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"$schema"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://raw.githubusercontent.com/infinum/eightshift-frontend-libs/develop/schemas/variation.json"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"parentName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"carousel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"carousel-loop"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Carousel Loop"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"description"</span><span class="token plain"> </span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Carousel block variation with loop and pagination enabled, along with multiple image blocks with placeholders. Displays two images per slide."</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"icon"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"src"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"es-card"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"attributes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"carouselIsLoop"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"carouselShowPagination"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"carouselShowItems"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"innerBlocks"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"eightshift-boilerplate/image"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"attributes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"imageImageFull"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"imageImageUrl"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://loremflickr.com/400/400"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"eightshift-boilerplate/image"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"attributes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"imageImageFull"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"imageImageUrl"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://loremflickr.com/400/400"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"eightshift-boilerplate/image"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"attributes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"imageImageFull"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"imageImageUrl"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://loremflickr.com/400/400"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"eightshift-boilerplate/image"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"attributes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"imageImageFull"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"imageImageUrl"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://loremflickr.com/400/400"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"scope"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string" style="color:rgb(255, 121, 198)">"inserter"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>After adding this code, you should see the <code>Carousel Loop</code> variation in your block list. After adding it in the editor, the <code>Carousel</code> attributes will be already set to the ones you provided, as well as two images that are added as inner blocks.</p>
<p><img decoding="async" loading="lazy" alt="Block list with variations" src="data:image/webp;base64,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" width="321" height="257" class="img_ev3q"></p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>block</category>
            <category>variations</category>
        </item>
        <item>
            <title><![CDATA[How to use ACF in your project]]></title>
            <link>https://eightshift.oceanamazon.com/blog/acf-in-a-project</link>
            <guid>https://eightshift.oceanamazon.com/blog/acf-in-a-project</guid>
            <pubDate>Tue, 17 May 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Example of using ACF plugin in your project]]></description>
            <content:encoded><![CDATA[<p>If you've worked with WordPress for a long time, you've heard of the <strong><em>Advanced Custom Fields</em></strong> plugin (<strong><em>ACF</em></strong> for short). While the use of blocks has simplified content editing, thus making meta fields less of a necessity, there are still cases in which meta fields are very useful.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ways-of-registering-acf-fields">Ways of registering ACF fields<a href="https://eightshift.oceanamazon.com/blog/acf-in-a-project#ways-of-registering-acf-fields" class="hash-link" aria-label="Direct link to Ways of registering ACF fields" title="Direct link to Ways of registering ACF fields" translate="no">​</a></h2>
<p>There are multiple approaches to ACF field registration. The easiest way to register fields is using the WP admin interface, but this approach has a few drawbacks. If you have many fields, this can impact performance because you are registering fields dynamically (information about registered fields is stored in the database). Another drawback is if you have multiple environments (e.g. local, staging, production), you'll have to export the fields and import them to other environments.</p>
<p>Other ways of registering ACF fields are either via PHP (code) or by reading from a JSON file. We prefer to use PHP because you can use OPcache to speed up field registration even more. If you are using Git, this approach is even better because you can commit the PHP code used for registering fields for easier portability across different environments. For that reason, Eightshift Development kit already has some goodies which will make field registration a breeze.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="exporting-php-code">Exporting PHP code<a href="https://eightshift.oceanamazon.com/blog/acf-in-a-project#exporting-php-code" class="hash-link" aria-label="Direct link to Exporting PHP code" title="Direct link to Exporting PHP code" translate="no">​</a></h2>
<p>The approach we use for registering ACF fields is by adding those fields first through the WP Admin ACF interface. As an example, We'll add a field group called <strong><em>Intro</em></strong>, which will contain one text field of the same name. That field group will be displayed only on posts. You can add a few more fields, but for the sake of simplicity, we'll only use one field.</p>
<p>When you define all the fields you need, save them and go to <code>Custom Fields -&gt; Tools</code>. Here you will see an option to <strong><em>Export Field Groups</em></strong>. Simply select the field groups which you want to export and select <strong><em>Generate PHP</em></strong>.</p>
<p><img decoding="async" loading="lazy" alt="ACF PHP code export" src="https://eightshift.oceanamazon.com/assets/images/acf-generate-php-b848d0dc2aa8a12145e0ae6d3797d9a9.webp" width="874" height="335" class="img_ev3q"></p>
<p>This will generate a PHP code snippet that you can use in your theme. Now you may be wondering, where exactly should that code go?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="custommeta-class">CustomMeta class<a href="https://eightshift.oceanamazon.com/blog/acf-in-a-project#custommeta-class" class="hash-link" aria-label="Direct link to CustomMeta class" title="Direct link to CustomMeta class" translate="no">​</a></h2>
<p>Those ACF goodies in Eightshift Development kit we talked about earlier? Let us introduce you to one of them. We have a WP CLI command which we can use to generate a CustomMeta class where we can add our field groups. The command is <code>wp boilerplate create acf-meta</code>. This command has one required parameter, and that is <code>name</code>. To create a class that we will use for registering our custom fields, we'll use the following command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create acf-meta --name=intro</span><br></div></code></pre></div></div>
<p>This command will generate a <strong><em>CustomMeta</em></strong> folder inside <strong><em>src</em></strong> folder and add a new file called <strong><em>IntroAcfMeta.php</em></strong>. Inside that file, you should see the following method:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">fields</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">function_exists</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'acf_add_local_field_group'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">acf_add_local_field_group</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Go back to your PHP code export for ACF fields and select everything inside the <code>acf_add_local_field_group()</code> function and paste it into your function. To make it in line with our coding standards, we have to do the following:</p>
<ul>
<li class="">replace <code>array()</code> with <code>[]</code></li>
<li class="">make every label translatable and escaped - use <code>esc_html__()</code></li>
<li class="">instead of hardcoding the field name, replace it with a class constant</li>
</ul>
<p>After all these changes, your code should look like this:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name-definition class-name">IntroAcfMeta</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">extends</span><span class="token plain"> </span><span class="token class-name">AbstractAcfMeta</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * Intro field name.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">INTRO_FIELD_NAME</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'intro'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">/**</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * Render acf fields.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 *</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 * @return void</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">	 */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(80, 250, 123)">fields</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">function_exists</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'acf_add_local_field_group'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">acf_add_local_field_group</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'key'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'group_6269300acefda'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'title'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain">  </span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">esc_html__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'Intro'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'eightshift-theme'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'fields'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">						</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'key'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'field_6269300f8029b'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">						</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'label'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token function" style="color:rgb(80, 250, 123)">esc_html__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'Intro'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'eightshift-theme'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">						</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'name'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token keyword static-context" style="color:rgb(189, 147, 249);font-style:italic">self</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">INTRO_FIELD_NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">						</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'type'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'text'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">						</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>The final step is to go back to the Custom Fields in WP admin and either delete or deactivate your field group from there, to prevent registering the fields twice. After adding field definitions in PHP and removing them in WP admin, your field should be visible when editing posts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-get_field">Using get_field()<a href="https://eightshift.oceanamazon.com/blog/acf-in-a-project#using-get_field" class="hash-link" aria-label="Direct link to Using get_field()" title="Direct link to Using get_field()" translate="no">​</a></h2>
<p>To fetch the saved meta value, we use ACF's <code>get_field()</code> function, but here are a few tips that could improve your code quality. First, you should check if that function exists. That way, if ACF is deactivated on your site for whatever reason, your site won't break. The second tip is to use a class constant instead of hardcoding the field name. With these practices in mind, your code should look like this:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">use</span><span class="token plain"> </span><span class="token package">YourNamespace</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">CustomMeta</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">IntroAcfMeta</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">function_exists</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'get_field'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$introText</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_field</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name static-context">IntroAcfMeta</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">INTRO_FIELD_NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$postId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="es-alert es-alert--tip m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-sand-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-sand-30"><path d="M11.975 23a2.42 2.42 0 0 1-1.302-.353 1.844 1.844 0 0 1-.788-.967h-.257c-.495 0-.924-.182-1.288-.545a1.761 1.761 0 0 1-.545-1.288v-3.924a8.44 8.44 0 0 1-2.773-2.96C4.341 11.753 4 10.422 4 8.975c0-2.218.775-4.102 2.324-5.651C7.873 1.774 9.757 1 11.975 1s4.102.775 5.651 2.324c1.55 1.549 2.324 3.433 2.324 5.651 0 1.46-.34 2.793-1.022 3.997a8.465 8.465 0 0 1-2.773 2.951v3.924c0 .495-.182.924-.545 1.288a1.761 1.761 0 0 1-1.288.545h-.257c-.147.41-.41.732-.788.967a2.416 2.416 0 0 1-1.302.353Zm-2.347-3.153h4.694V18.71H9.628v1.137Zm0-2.237h4.694v-1.082H9.628v1.082Zm-.238-2.915h1.888v-3.502L8.785 8.7l.953-.953 2.237 2.236 2.237-2.236.953.953-2.493 2.493v3.502h1.888c1.063-.501 1.922-1.267 2.576-2.296.654-1.03.98-2.171.98-3.424 0-1.723-.592-3.178-1.778-4.363-1.185-1.186-2.64-1.779-4.363-1.779-1.723 0-3.178.593-4.363 1.779-1.186 1.185-1.779 2.64-1.779 4.363 0 1.253.327 2.394.981 3.424.654 1.03 1.513 1.795 2.576 2.296Z" fill="currentColor"></path></svg><span class="text-grey-500">Tip</span></i><div class="font-sans text-16 text-black"><p>It's better to use class constants because if you decide to change the field name, you will have to change it only in one place.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="theme-options">Theme Options<a href="https://eightshift.oceanamazon.com/blog/acf-in-a-project#theme-options" class="hash-link" aria-label="Direct link to Theme Options" title="Direct link to Theme Options" translate="no">​</a></h2>
<p>ACF's Options page has a wide array of uses and it's very likely that you'll need some sort of Theme Options in your project. To make the implementation of Theme Options a bit easier, we have a CLI command which generates the <code>ThemeOptions</code> class in your project. Just use the following command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate create theme-options</span><br></div></code></pre></div></div>
<p>This command generates a class with two methods. The first one, <code>createThemeOptionsPage()</code> creates a Theme Options page and adds it to the WP Admin sidebar. The second one, <code>registerThemeOptions()</code>, is what registers the fields you will have in Theme Options. Here is an example how Theme Options look after being created using <code>wp boilerplate</code>:</p>
<p><img decoding="async" loading="lazy" alt="ACF Theme Options" src="https://eightshift.oceanamazon.com/assets/images/acf-theme-options-860205bc633280803c2236331b83b8be.webp" width="982" height="396" class="img_ev3q"></p>
<p>To add fields to your Theme Options, follow the steps from the <strong><em>Exporting PHP code</em></strong> section of this post and add the fields inside the <code>'fields' =&gt; []</code> array.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tip---create-a-helper-class">Tip - create a helper class<a href="https://eightshift.oceanamazon.com/blog/acf-in-a-project#tip---create-a-helper-class" class="hash-link" aria-label="Direct link to Tip - create a helper class" title="Direct link to Tip - create a helper class" translate="no">​</a></h2>
<p>In this blog post, we covered the whole process of registering and using ACF fields in your project. But, if you are using a lot of ACF fields, wrapping each <code>get_field()</code> function with a <code>function_exists()</code> conditional may become tedious at some point. For that reason, it may be a good idea to create a helper class that you can use for ACF functions.</p>
<p>I won't cover the whole process in detail, but I'll give you some general pointers.</p>
<ul>
<li class="">when registering plugin-related classes, use the <code>Plugins</code> namespace. In this case, you should have namespace <code>YourNamespace\Plugins\Acf</code></li>
<li class="">inside that namespace, you can create a class called <code>AcfHelper</code></li>
<li class="">add a method <code>getField</code> which accepts the same arguments as the <code>get_field()</code> function</li>
<li class="">add a method <code>getThemeOption</code> which only accepts one argument, the field name, and the second argument is hardcoded</li>
<li class="">use early returns in your methods</li>
</ul>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token function" style="color:rgb(80, 250, 123)">function_exists</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'get_field'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">''</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>acf</category>
            <category>advanced custom fields</category>
            <category>theme options</category>
        </item>
        <item>
            <title><![CDATA[Using assets in a project]]></title>
            <link>https://eightshift.oceanamazon.com/blog/using-assets</link>
            <guid>https://eightshift.oceanamazon.com/blog/using-assets</guid>
            <pubDate>Thu, 28 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Step-by-step guide on how to add assets like images or icons to your theme.]]></description>
            <content:encoded><![CDATA[<p>Previously, we went through the process of adding fonts to your project. While the process of adding additional assets like images or icons has some similarities to adding fonts, it also has its unique steps. In this post, we'll cover multiple ways of adding assets and using them on your site.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-images">Adding images<a href="https://eightshift.oceanamazon.com/blog/using-assets#adding-images" class="hash-link" aria-label="Direct link to Adding images" title="Direct link to Adding images" translate="no">​</a></h2>
<p>Similar to fonts, there is also a dedicated folder for adding images that will be used in a theme. The location of this folder is <strong><em>assets/images</em></strong>. The procedure to add images is even simpler than fonts, which you can read about in <a class="" href="https://eightshift.oceanamazon.com/blog/adding-fonts">Adding fonts</a> blog post. Just follow these steps to add a new image:</p>
<ul>
<li class="">add the image in inside <strong><em>assets/images</em></strong> folder</li>
<li class="">include it in <strong><em>assets/images/index.js</em></strong></li>
<li class="">run <code>npm start</code> to rebuild assets</li>
</ul>
<p>The new image will now be available in the <strong><em>public</em></strong> folder. The use case for this is adding a favicon or a logo to your project. To use this image in one of your templates or blocks, you have to add the following in your <strong><em>php</em></strong> file:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">use</span><span class="token plain"> </span><span class="token package">YourNamespace</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Manifest</span><span class="token package punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token package">Manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">apply_filters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name static-context">Manifest</span><span class="token operator">::</span><span class="token constant" style="color:rgb(189, 147, 249)">MANIFEST_ITEM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'logo.svg'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>The filter we are using is called <code>manifest-item</code> and we use it to get the URL of the asset from the <strong><em>public</em></strong> folder. You can read more about this in <a class="" href="https://eightshift.oceanamazon.com/docs/basics/manifest">our documentation</a>.</p>
<p>You can see how this is being used for rendering both favicon and header logo in your theme's <strong><em>header.php</em></strong> file.</p>
<div class="es-alert es-alert--tip m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-sand-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-sand-30"><path d="M11.975 23a2.42 2.42 0 0 1-1.302-.353 1.844 1.844 0 0 1-.788-.967h-.257c-.495 0-.924-.182-1.288-.545a1.761 1.761 0 0 1-.545-1.288v-3.924a8.44 8.44 0 0 1-2.773-2.96C4.341 11.753 4 10.422 4 8.975c0-2.218.775-4.102 2.324-5.651C7.873 1.774 9.757 1 11.975 1s4.102.775 5.651 2.324c1.55 1.549 2.324 3.433 2.324 5.651 0 1.46-.34 2.793-1.022 3.997a8.465 8.465 0 0 1-2.773 2.951v3.924c0 .495-.182.924-.545 1.288a1.761 1.761 0 0 1-1.288.545h-.257c-.147.41-.41.732-.788.967a2.416 2.416 0 0 1-1.302.353Zm-2.347-3.153h4.694V18.71H9.628v1.137Zm0-2.237h4.694v-1.082H9.628v1.082Zm-.238-2.915h1.888v-3.502L8.785 8.7l.953-.953 2.237 2.236 2.237-2.236.953.953-2.493 2.493v3.502h1.888c1.063-.501 1.922-1.267 2.576-2.296.654-1.03.98-2.171.98-3.424 0-1.723-.592-3.178-1.778-4.363-1.185-1.186-2.64-1.779-4.363-1.779-1.723 0-3.178.593-4.363 1.779-1.186 1.185-1.779 2.64-1.779 4.363 0 1.253.327 2.394.981 3.424.654 1.03 1.513 1.795 2.576 2.296Z" fill="currentColor"></path></svg><span class="text-grey-500">Tip</span></i><div class="font-sans text-16 text-black"><p>Don't hardcode the filter name in the <code>apply_filters</code> function. Always call it via class constants.</p></div></div>
<p>For better organization, you can add additional folders (e.g. <strong><em>icons</em></strong>, <strong><em>placeholders</em></strong>) inside the <strong><em>assets/images</em></strong> folder. Here's an example of how to include them:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// Icons</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./icons/upload.svg'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Placeholders</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./placeholders/post.png'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./placeholders/page.png'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-svg-files-from-manifest">Using SVG files from manifest<a href="https://eightshift.oceanamazon.com/blog/using-assets#using-svg-files-from-manifest" class="hash-link" aria-label="Direct link to Using SVG files from manifest" title="Direct link to Using SVG files from manifest" translate="no">​</a></h2>
<p>If you recall from a previous blog post about <a class="" href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme">Modifying Blocks</a>, you might have already seen an alternative approach to including SVG files in your block or component.</p>
<div class="es-alert es-alert--info m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-sky-30"><div class="font-sans text-16 text-black"><p>If you don't have it in your project, be sure to read our blog post about adding blocks and components by using <a class="" href="https://eightshift.oceanamazon.com/blog/adding-blocks-wpcli">WP CLI</a>.</p></div></div>
<p>Open <strong><em>src/Blocks/components/quote/manifest.json</em></strong> and you'll see that the icon used by the component is defined inside <code>resources</code> as a key-value pair. Key represents the name that we will use to fetch the icon, while the value is SVG code.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"resources"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"icon"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'&gt;...&lt;/svg&gt;"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In order to make the minification of SVG files as easy as possible, our teammate Goran made an awesome tool called <a href="https://svg-2-wp.goranalkovic.com/" target="_blank" rel="noopener noreferrer" class="">SVG2WP</a>. Some of the options include making attributes JSX compatible, or replacing the color value with <code>currentColor</code>, which can then be used to change the SVG color through CSS.</p>
<p>You've already seen the use of <code>currentColor</code> in the above-mentioned blog post, where we've modified the color of the SVG.</p>
<p>The output of the icon on frontend is very simple. In the Quote component, it was done the following way:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token delimiter important">&lt;?php</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$manifest</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">getManifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token constant" style="color:rgb(189, 147, 249)">__DIR__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token operator">?</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&lt;</span><span class="token plain">i </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token operator">=</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">"&lt;?php echo \esc_attr("</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$componentClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">__icon</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">"); ?&gt;"</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token operator">&lt;</span><span class="token operator">?</span><span class="token plain">php </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">echo</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'resources'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'icon'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// phpcs:ignore Eightshift.Security.ComponentsEscape.OutputNotEscaped ?&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&lt;</span><span class="token operator">/</span><span class="token plain">i</span><span class="token operator">&gt;</span><br></div></code></pre></div></div>
<p>An excellent example, where you can see in even more detail how SVGs are being used, is our <code>icon</code> component. It isn't included in Eightshift theme by default, so you have to add it to your project with WP CLI. To include it in your project, use the following command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate blocks use-component --name=icon</span><br></div></code></pre></div></div>
<p>If you include the Icon component inside a block, you will have the option to choose between multiple icons defined in the manifest. Another way to render SVGs from the Icon component is by using the <code>Components::render</code> helper method:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">echo</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">render</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'icon'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'blockClass'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$componentClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'iconName'</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:rgb(255, 121, 198)">'download'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>Here are some examples of icons available out-of-the-box in our Icon component:</p>
<p><img decoding="async" loading="lazy" alt="Icon component" src="data:image/webp;base64,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" width="470" height="46" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-icons-for-editor-and-block-options">Using icons for editor and block options<a href="https://eightshift.oceanamazon.com/blog/using-assets#using-icons-for-editor-and-block-options" class="hash-link" aria-label="Direct link to Using icons for editor and block options" title="Direct link to Using icons for editor and block options" translate="no">​</a></h2>
<p>When developing your blocks and adding new options, you may need to add icons to improve the user experience. We have many icons already available for use. You can see the full list in our <a class="" href="https://eightshift.oceanamazon.com/components/es-ui-components/ui-icons">component library</a> under <code>UI icons</code> and <code>Block icons</code> section. We already added the icon when adding a new Color Theme option for the Quote block. Here is the simplified version:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">ColorPaletteCustom</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">IconLabel</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> icons </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eightshift/frontend-libs/scripts'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag class-name" style="color:rgb(255, 121, 198)">ColorPaletteCustom</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">		</span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">label</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag script language-javascript tag class-name" style="color:rgb(255, 121, 198)">IconLabel</span><span class="token tag script language-javascript tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript tag attr-name" style="color:rgb(241, 250, 140)">icon</span><span class="token tag script language-javascript tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript tag script language-javascript" style="color:rgb(255, 121, 198)">icons</span><span class="token tag script language-javascript tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token tag script language-javascript tag script language-javascript property-access" style="color:rgb(255, 121, 198)">color</span><span class="token tag script language-javascript tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag script language-javascript tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript tag attr-name" style="color:rgb(241, 250, 140)">label</span><span class="token tag script language-javascript tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript tag script language-javascript function" style="color:rgb(80, 250, 123)">__</span><span class="token tag script language-javascript tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token tag script language-javascript tag script language-javascript string" style="color:rgb(255, 121, 198)">'Color Theme'</span><span class="token tag script language-javascript tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token tag script language-javascript tag script language-javascript" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript tag script language-javascript string" style="color:rgb(255, 121, 198)">'es-theme'</span><span class="token tag script language-javascript tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token tag script language-javascript tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag script language-javascript tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag script language-javascript tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">		</span><span class="token tag comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token tag" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token tag" style="color:rgb(255, 121, 198)">	</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>This was the end result when we were adding a new option in our Quote block:</p>
<p><img decoding="async" loading="lazy" alt="Color Theme Options" src="data:image/webp;base64,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" width="275" height="143" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://eightshift.oceanamazon.com/blog/using-assets#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>As you could see in this blog post, there are multiple ways of adding assets to a project. It all depends on how these will be used and what the scope of their use will be.</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>assets</category>
            <category>images</category>
            <category>icons</category>
        </item>
        <item>
            <title><![CDATA[Adding fonts]]></title>
            <link>https://eightshift.oceanamazon.com/blog/adding-fonts</link>
            <guid>https://eightshift.oceanamazon.com/blog/adding-fonts</guid>
            <pubDate>Tue, 12 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[An intro to adding fonts to your project.]]></description>
            <content:encoded><![CDATA[<p>Every project is unique. Logo, colors, fonts, etc. are what define the visual identity of your website. In this post, we'll cover adding fonts to a project.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="importing-fonts-into-your-project">Importing fonts into your project<a href="https://eightshift.oceanamazon.com/blog/adding-fonts#importing-fonts-into-your-project" class="hash-link" aria-label="Direct link to Importing fonts into your project" title="Direct link to Importing fonts into your project" translate="no">​</a></h2>
<p><a class="" href="https://eightshift.oceanamazon.com/docs/basics/fonts">Our documentation</a> covers the necessary steps to add a font to your project, but here we'll cover the process in a bit more detail. To start, we need a font (or two). For this example, I'll use <strong><em>Source Sans Pro</em></strong> and <strong><em>Noto Serif</em></strong> which I've downloaded from <a href="https://fonts.google.com/" target="_blank" rel="noopener noreferrer" class="">Google Fonts</a>. They are in the <code>.ttf</code> format (you may find some which are <code>.otf</code>, which will work in the same way), so you need to convert them to <code>.woff</code> and <code>.woff2</code>. Whatever approach you use is okay - we recommend the following tools:</p>
<ul>
<li class=""><a href="https://convertio.co/ttf-woff/" target="_blank" rel="noopener noreferrer" class="">Convertio</a></li>
<li class=""><a href="https://cloudconvert.com/ttf-to-woff" target="_blank" rel="noopener noreferrer" class="">Cloud Convert</a></li>
<li class=""><a href="https://everythingfonts.com/ttf-to-woff" target="_blank" rel="noopener noreferrer" class="">Everything Fonts</a></li>
<li class=""><a href="https://transfonter.org/" target="_blank" rel="noopener noreferrer" class="">Transfonter</a></li>
</ul>
<div class="es-alert es-alert--caution m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-candy-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-candy-30"><path d="M1 21 12 2l11 19H1Zm2.883-1.667h16.234L12 5.333l-8.117 14Zm8.187-1.283a.815.815 0 0 0 .83-.836.815.815 0 0 0-.836-.83.814.814 0 0 0-.83.836.814.814 0 0 0 .836.83Zm-.837-2.85H12.9V9.8h-1.667v5.4Z" fill="currentColor"></path></svg><span class="text-grey-500">Warning</span></i><div class="font-sans text-16 text-black"><p>Make sure you have the proper license for the fonts you are converting.</p></div></div>
<p>Fonts should go inside your theme's <strong><em>/assets/fonts</em></strong> folder. Copy the fonts you want to use there. You will also notice that this folder contains an <strong><em>index.js</em></strong> file, used to import fonts into your project. Here's an example of how I imported my fonts:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// SourceSansPro WOFF</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-Bold.woff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-BoldItalic.woff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-Italic.woff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-Regular.woff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-Light.woff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-LightItalic.woff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// SourceSansPro WOFF2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-Bold.woff2'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-BoldItalic.woff2'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-Italic.woff2'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-Regular.woff2'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-Light.woff2'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./SourceSansPro-LightItalic.woff2'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// NotoSerif WOFF</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./NotoSerif-Bold.woff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./NotoSerif-BoldItalic.woff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./NotoSerif-Italic.woff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./NotoSerif-Regular.woff'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// NotoSerif WOFF2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./NotoSerif-Bold.woff2'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./NotoSerif-BoldItalic.woff2'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./NotoSerif-Italic.woff2'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./NotoSerif-Regular.woff2'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<div class="es-alert es-alert--tip m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-sand-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-sand-30"><path d="M11.975 23a2.42 2.42 0 0 1-1.302-.353 1.844 1.844 0 0 1-.788-.967h-.257c-.495 0-.924-.182-1.288-.545a1.761 1.761 0 0 1-.545-1.288v-3.924a8.44 8.44 0 0 1-2.773-2.96C4.341 11.753 4 10.422 4 8.975c0-2.218.775-4.102 2.324-5.651C7.873 1.774 9.757 1 11.975 1s4.102.775 5.651 2.324c1.55 1.549 2.324 3.433 2.324 5.651 0 1.46-.34 2.793-1.022 3.997a8.465 8.465 0 0 1-2.773 2.951v3.924c0 .495-.182.924-.545 1.288a1.761 1.761 0 0 1-1.288.545h-.257c-.147.41-.41.732-.788.967a2.416 2.416 0 0 1-1.302.353Zm-2.347-3.153h4.694V18.71H9.628v1.137Zm0-2.237h4.694v-1.082H9.628v1.082Zm-.238-2.915h1.888v-3.502L8.785 8.7l.953-.953 2.237 2.236 2.237-2.236.953.953-2.493 2.493v3.502h1.888c1.063-.501 1.922-1.267 2.576-2.296.654-1.03.98-2.171.98-3.424 0-1.723-.592-3.178-1.778-4.363-1.185-1.186-2.64-1.779-4.363-1.779-1.723 0-3.178.593-4.363 1.779-1.186 1.185-1.779 2.64-1.779 4.363 0 1.253.327 2.394.981 3.424.654 1.03 1.513 1.795 2.576 2.296Z" fill="currentColor"></path></svg><span class="text-grey-500">Tip</span></i><div class="font-sans text-16 text-black"><p>If you don't need to support IE11, don't include <code>.woff</code> files. This will save you some bandwidth.</p></div></div>
<p>To add these fonts as your base font and secondary font, go to the global manifest located in <strong><em>/src/Blocks</em></strong> and add the following inside <code>globalVariables</code>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"globalVariables"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"baseFont"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SourceSansPro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"secondaryFont"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"NotoSerif"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Next, you can create a new file called <strong>_<em>typography.scss</em></strong> inside your <strong><em>/assets/styles/parts/utils/</em></strong> folder and add the following:</p>
<div class="language-scss codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-scss codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@include</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">font-face</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">baseFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'SourceSansPro-Light'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">300</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@include</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">font-face</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">baseFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'SourceSansPro-LightItalic'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">300</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> italic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@include</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">font-face</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">baseFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'SourceSansPro-Regular'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">400</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@include</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">font-face</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">baseFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'SourceSansPro-Italic'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">400</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> italic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@include</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">font-face</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">baseFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'SourceSansPro-Bold'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">700</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@include</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">font-face</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">baseFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'SourceSansPro-BoldItalic'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">700</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> italic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@include</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">font-face</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">secondaryFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'NotoSerif-Bold'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">700</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@include</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">font-face</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">secondaryFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'NotoSerif-BoldItalic'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">700</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> italic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@include</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">font-face</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">secondaryFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'NotoSerif-Italic'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">400</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> italic</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@include</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">font-face</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">secondaryFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'NotoSerif-Regular'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">400</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>If you would like to know more about the <code>font-face</code> mixin, you can take a look at our <a class="" href="https://eightshift.oceanamazon.com/docs/basics/library">Sass documentation</a>.</p>
<p>Because this is a new file, we have to include it. You can do that inside <strong><em>/assets/styles/parts/_shared.scss</em></strong> file:</p>
<div class="language-scss codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-scss codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// Project specific.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'utils/shared-variables'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">@import</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'utils/typography'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>Run <code>npm start</code> to rebuild your <strong><em>public</em></strong> folder and assets. If you did everything correctly, your build should pass and you will see your fonts inside the <strong><em>public</em></strong> folder.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-only-one-font-in-a-block">Using only one font in a block<a href="https://eightshift.oceanamazon.com/blog/adding-fonts#using-only-one-font-in-a-block" class="hash-link" aria-label="Direct link to Using only one font in a block" title="Direct link to Using only one font in a block" translate="no">​</a></h2>
<p>There are multiple ways of using fonts in a block. The simplest use case is if you have only one font you want to use for that specific block. In this case, we want the Heading block to only use <em>Noto Serif</em>.</p>
<p>To make our secondary font available for use, we need to first define it as a CSS variable. We can do that in <strong><em>/assets/styles/parts/utils/_shared-variables.scss</em></strong>. The base font is already defined there, so all we need to do is add our secondary font definition below it.</p>
<p>To make things a bit more consistent, we may also want to rename <code>--global-font-family</code> CSS variable to <code>--base-font-family</code>. Just don't forget to search/replace this new variable name across your project! Please note that the fallbacks for the fonts can be anything, this is just an example. Once we're done, it should look like this:</p>
<div class="language-scss codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-scss codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">--base-font-family</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">--global-base-font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> -apple-system</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> BlinkMacSystemFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Segoe UI'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Roboto</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Helvetica</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		Arial</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sans-serif</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Apple Color Emoji'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Segoe UI Emoji'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Segoe UI Symbol'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">--secondary-font-family</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">--global-secondary-font</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> -apple-system</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> BlinkMacSystemFont</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Segoe UI'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Roboto</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Helvetica</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		Arial</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> sans-serif</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Apple Color Emoji'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Segoe UI Emoji'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Segoe UI Symbol'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>After defining the <code>--secondary-font-family</code> CSS variable, we can go to <strong><em>/src/Blocks/components/heading/heading-style.scss</em></strong> and add the following rule to the <code>.heading</code> class:</p>
<div class="language-scss codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-scss codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">font-family</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">--secondary-font-family</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>And that's it! The Heading block will now use the <em>Noto Serif</em> font.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-a-font-picker">Adding a font picker<a href="https://eightshift.oceanamazon.com/blog/adding-fonts#adding-a-font-picker" class="hash-link" aria-label="Direct link to Adding a font picker" title="Direct link to Adding a font picker" translate="no">​</a></h2>
<p>In some cases, you may want to give users the option to choose between fonts that they want to use in their block. For this example, we'll use the <code>paragraph</code> block where we want users to have both <em>Source Sans Pro</em> and <em>Noto Serif</em> available.</p>
<p>First step is to add a new attribute, options and CSS variable values in <strong><em>/src/Blocks/components/paragraph/manifest.json</em></strong>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"attributes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"paragraphFontFamily"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"base"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"options"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"paragraphFontFamily"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"label"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SourceSansPro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"base"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"label"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"NotoSerif"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"secondary"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>After defining the new attribute and options for the font family, we now have to add a variable to <strong><em>manifest.json</em></strong>. We can add it to the <code>variables</code> object. This approach is slightly different from the one explained in the <a class="" href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme">Modifying blocks</a> blog post. Here we can use <code>%value%</code> wildcard to dynamically add the selected value to our CSS variable.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"paragraphFontFamily"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"variable"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token property">"paragraph-font-family"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"var(--%value%-font-family)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></div></code></pre></div></div>
<p>The next step is to go to <strong><em>/src/Blocks/components/paragraph/components/paragraph-options.js</em></strong> and add a control for the new font family option. The first thing we can add is a new attribute that will allow us to toggle showing the Paragraph font family option on other blocks which are using the Paragraph component. There might be a case where we want only one font family, so this option may come in handy in some other blocks.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		setAttributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		showParagraphFontFamily </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>After that, we need to fetch either the saved attribute value or get the default one from the manifest. We can do that with the <code>checkAttr</code> helper, adding it just below <code>paragraphColor</code> and <code>paragraphSize</code>.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> paragraphFontFamily </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">checkAttr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'paragraphFontFamily'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>Now we have to add an actual control to the options panel which will allow us to choose between fonts.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">showParagraphFontFamily </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token operator">&lt;</span><span class="token maybe-class-name">CustomSelect</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				label</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token operator">&lt;</span><span class="token maybe-class-name">IconLabel</span><span class="token plain"> icon</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">icons</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">fontFamily</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> label</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token function" style="color:rgb(80, 250, 123)">__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Font Family'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'eightshift-theme'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">/</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				value</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">paragraphFontFamily</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				options</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token function" style="color:rgb(80, 250, 123)">getOption</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'paragraphFontFamily'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				onChange</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">setAttributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token function" style="color:rgb(80, 250, 123)">getAttrKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'paragraphFontFamily'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">:</span><span class="token plain"> value </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				isClearable</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				isSearchable</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				simpleValue</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token operator">/</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>The control for selecting a font should now be available under Paragraph options. Saving the choice now works, but the font stays the same both in the editor and on the frontend.</p>
<p><img decoding="async" loading="lazy" alt="Font Picker" src="data:image/webp;base64,UklGRmwOAABXRUJQVlA4IGAOAADwSwCdASoQAbgAPjEUiUQiIQkkJvQQAYJaW7hbvDUXX7gcIU4bwHoMbTl+oHYA/Gb1YOsA9ADpCP2P/bf4AP1h1aTyJ/Uuy/+o/ix/OPS/vCd1PXP+jf93/F6Y/8R+mX0r+wfr9+Snwr0unqBfiH8Y/nf47f2b9ofVJ7ovGP0W/HT4AvRH4t/VP67+0P9l/cX1m/3D8cvcn6Kf2D8d/oA/g/8b/pH5C/1//+fQHei+Hf2D8ZvoC/jv8w/s/9x/Zj/Cf//7Sf1n/Jf2r92/7p7O/x/+qf4z+9/uT/f///+AX8S/lX9u/rP+d/2v92//f/c+1X1ofr17GH6q/+EuoRhE4FJBKQEnbLkp0TKZJPMIoJJnCPGH3/UboZiIMW43ZxcCfP1Bt6cLS24JKLF+wD9ddBPgR0G6saJH/OpfX3jqRkkzhHOnyIkUm3FGvFxzg7ywo0fjplBquKWJA45qz1QtNzmErEs2uChOIzXJscADgsih/dB1m2D4Ck/tbqcK8jGosKiOhZKZX9BKY7Sxp9oZdR5F4lSEWdbrpcSZm51WUa8XHFfdC1I6FQA/tsUvRtS6raiIA9JlUE8y27BQosyn5w2fx5mJdh6pESFHDbi5Oa4ZwQESx2QMzqMxdbkOivrypcheMQEzF/SIVjryRBK6efaRbtUi8XZVjAiJyBZrKm8qUzsss9DsoiEfSYDvzneKgKtynZDSW0E0Tt6V20E0SUtbCkv+mFafNnYyyl2PYjNotao19Q6RtWPVnWgscYgLpYwi8+DeYtJLLifGqcbIVZ3KK0+bO5RGEVsVwOiw78WPz1WIC4QAAP7/t2Xr06KOb2jF0qt7j8hibx1Zh13G89njze2xUqC3H9fZbDFK5OQwc3tJDYUw5xuT7aamlQ/P/47Vsuh16ppzHG1DNGmuYV//qmZDi/3MWNwRn+Ipc/CO/mthW/bsWA1GD+CQ92smddGGxlC3EmYUDo6GnCH2FeHXFx+LNxC7dqFLAZG01linsIxdLtRcRhmCN5fhfKp2cgbtkhXD8JndxqYE3hxakItNzA9s0SVj/g4a2jW1iJ4rUdimPLpCR+v6xuBN8XKatXzx3A//PcF4YY92XIzCs2eqGsabBO/FS/HNTjP6UPQ6WMXaxHlRderBz8AH5VWPVcfOMAvw7fGrRhv0/5mrqS3XqJTCkl1+KGfqOyd/80DEeZeZMHs3x3EMdtP/21CNX+DbRxXZDaVt3R46DSHYpnXixDDcmdUMIK3eRnE4i0YQTFdiy+4Spwjf4Ms4OPPDN0fuefy+j6XqDf1FKsr/KjX7rKp0z/x+rWHaCr/9QfB94bX8/tQKUk204XanVHBmPb5tNUlz7PYdF9svcIDYsvb7bXz+/QQrdXfupiWb4DtwnVBPSIVOYW4R/mwZQf/o8Ov1wZrdOWQ+PhIRDW//v0PD9P/nM0cXxlAco7s4bCvGCiY5/wWoJvBWCA9Cn3ouy/Yds+cQIA0IvkEH/HMcC3AB+w7a2Bdf5hSvuJ8FWvfzylqMcJMfUlW+acNMeTn02fJpp/D1JqAJG4ZAc4pmdx/jweWZH2YQtK6/Nbv6nuXFl70QFnKS4qCsTwtgJg5cYrbLVhGa03M9OS1XHwTjVkGUWETSKHrxUqrP1G/2tebg9HIJF4xP1uUY8YRXjIR57w4s3JRgC/wiERMsjx2WK1gPl4GRm8dMus9aw9/cd15LGRBAzhPsgIfC/qMmMXvL5i1Q5qqkirj7J3rWO7TeYlCoP//2T9KgTQR9MTdg1mx/AMRpC4nE1P5vtgiLgBwp0k/XCdaAMFzTZbCaRLxXl9jGSWMxBf//xn+N889U7fm3RG6IthF+PlK7QqKzJmY5n49zo4APv/9PDM8M0LzgSCRG8b9sfirwcIvjoSeEAAAByCElF9wm69ru8BT75uoyrf3gWWBEgEvc6bgGfAss/bMipJnbbjyU03wDo4Qdnfius5oW4npLhrs921e0XHd+uA0pEMEtq6kYA7S75WA9HR4FuSHCcmPz5KwAhMS3JE2TDduum9MkrIwY0o6s8B0j6c9HFqs2QEOn1XlW6RRdkpblNMM9QwnwV5lnHMmhUh6hxpv5xrsH25cQa+n4aCy1z2sWaXTy6f2ErMOC1xd8sRzUzkFiYIjTEcpDy3NjpCFjHwJnXQzePvzNA57tfr5Yd6Td/RIx6wG3rHtXxJO862hyQJ2m86sVPOw51ZjWImUR7ehOvtJ7zrtdBkfG8bCxP+9NZdQHR1cM6ZZxIzgW1WiC4vBnMrqW93ZjY/x7StT0d8mXP0cLymblT5V4Te3R0Rmcuh+ULNoDuP7IVLNs1hw9zNf84MbupvmSLeqRNmviQm29qDpAA3N/InafyzPZvHD4SvQXtnImziqzBmh4RgLO+6Q0CUxL/PXLsse36laJNNVhlCebrzPPABRI+jMxpKthKjJ9fokkAzCGtLafVL8kMkTTsDNhF0VB/DE8rRBWE5JVHV6TZKSKQOUpts0CvbfdV1x6gNE7MkaqMw6zfYB1HJVQyh3tlUYI9hneBV2gQ549e0pvk1rFmyAMDd51IYqFp3jZrFzi21+UDxtGCE50gKO9///vpdJ9D4Cs+NWr79bZ//bKb8HUlDJSPejZBQDduxOvrp+5O7txzfW5ZVo2SgQonxjtwU+z5EoWbKlZMK3ehTQSer4I4B8lOpH8VBfsT/Jqts29Byf7y4D2uRzyOZudZW5ELHnbEeJsEjeFJNv554Joxk1ROxQPdB4YOh2FLf+HKzpaAqhZzv17OiP4JpwQcy/dhneZd3yxeV7P88AGdXOdqtKYdB3Ji53i3sPsl9DpUXeINxcggIdGcDNrzek57G0fQCT+Euf7TMF5byHZAl99OAtljH72e0j7yhhx4+DMYuP1vUmb0nRrvc4o7BcA1Af5n4W0BDMQDf5NAysOCdp76IqxjuV/OGx1EvXs4Xhqe//UvxpDScdvUV7lPll9wxxVeHLZ/DL93mbr0cdnb02qsitEEdm4WzvBR7mghcSjpo3gV6b7g4CmqsdUK5di4KeOIqp+6/XtjqaK7Y6njEjUjrZFXnAkKHyPU1D5YyEkbSboFw29GADLctWpchHB/0uZLMePyAAaKGiygh+LeNQsiKShCHALYcsIR0N9iPXcAOuG6Hy/41WwKK+1bN+jY+PCabCmZDXafsu1Gp/MudaIt3T26lIV7Gkw0Fr/A+nyFJb0xk4u7XNPNpfe1tVEHCRcUlnxgycp5+V+tTrqegeu7q1iu0DHqihdEhG8oS5BU/7Z3m1Xd92ckiTD5ogIF51mB8UfUmjdSN/sfw/s8BiH+5U8EXH5NropRjye9vkoK8d8OynhJsW1aYUSwsM+tV+shiJa13P16sbYVH7VB6l39gzRQNJqp+lWYtjbBJOWrOLdYdMrS9SaA+Ar5lKwPdz9IlpcQURNLi9g5LazVZhn2uz90EhZXu/KIAXUBaXoA7fOdrUJZm6UO28MO9GY3QnefTo8umPXN5EzSbgcvZxKgIA1HycMucwKXI47uwBvYSjL03tbaLypxkqg2T4klp91yZ4UVVXyrIciW8ymFTz6cwE1VzOxlRt3Z5L9XBpGVWVSUnpwiijfRoLihHXsMIrI8EcBF0fPmAdKHker3CoJKdAXRBeA8tHCQZnl7i0HTILPpCT0yCH5fm8qgvxBpaJDu/ShC2hGHyk4HEMZwEe8tseQbfY1WLjNt7F34fWNBHselENB2DK8BUT8kAxofRNJPrWhu/vTsFrcsUxLIhXFe9efTnJrr0s8+4Z4AUHX63kCqHrui8PMtdFqyJJlZmW5GXF82mguNpw2IKXq0N6aDfwXsVoKCOLcwWhAyOBz3ILkP+R2s0Dg1J32dJ9BY9oTAuFWnxV+VeMZSzgh2qvHBZh+NVVf+ULmnRQzfN8oIyOkM579zgMMxCDOAfyoAHHTdEx1QnDA0iJLS1l/R4pegqEn8g7+Q72z8898fjkQA97OGGip/syHR/XiH9+BZiU9Cd3mM0HpVw/VcaTDurrD1w4p4s+ZbynAKo1j+zjXVY67QVWz2GMMlw13ifkZgKM58o/t1Vjx4DMvrjnjdrJzpWQdQyLjhrZYaGUpIg+k+fv5hdUbe8OnUkDJ0dsCjq9ezriiC3nBlZMqpkQXfWbbqrIt078Zg945PCmE6556tTtzk8yO0FgbO85i+FHu+Few786DU6U1RYg6z/r/g0KKJvzy4i2v/U0/wdL09TtXE3haiW56QNOxTD3QDMdi5cP0Gl0j3hAiZKI9fNWJykoL5n7+a1VKjngyiQBMoX5iNebqKDOipbj6REl2MPoBY6tye1xxjD4ujx1qCut1aM2ZE3A026QdMIGrQhq/5mAjOMe25MJ9AHyyvIodlsgX7yFzmrxZ9dipEhKzV8VPxjI9kJl2jsVJhWWAqGB+mTylw/Yg9jcSbN7hwsszfmBhgRKC+LFLorJiiWs1KY3m9XXzXjatdIhew/TLyTeNf9AdR5NN8k69qf5PozDKysBFn8v/7tR38y0CvtKAHvbF0uufyLag2FkMxVdUyVjrl1poy6nQVQpPeDWjjTjp02zVLfqItmknPdeG4J1P1SZOCn9JpIVYujeeVi5CZe/52ozh8WDjr9y9bBo8xGAYlJgqnuzMZUhJOgI3Xz8H2kN2n1u6XJwCcAP68EAaq4gB5yhRMySaPwxVDDGhBwUwGQc0mDeKG2jsZgHwM20nKWe7hn1A78u1rAt9PXnL59WmYswZp3k5odGpUAC3y2TnllpqERWh1HiSgXWpJzzBPB0OLNk9KoKUSX5d+ukEK2UoGs4ogVby5AkPSSog2/f5WOwhgKgg8gYxTxMwVAXxi7LSQdaATLZLvrMygU90DYePWhRTvh0r2AbSwHw5WNNnKVnymFRzCcqPAAAAAA==" width="272" height="184" class="img_ev3q"></p>
<p>The final step we need to make this work is to add a CSS rule that consumes our variable to <strong><em>/src/Blocks/components/paragraph/paragraph-style.scss</em></strong>:</p>
<div class="language-scss codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-scss codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token selector" style="color:rgb(255, 121, 198)">.paragraph </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">font-family</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">--paragraph-font-family</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">--base-font-family</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>After adding this single line of CSS code, your new option for selecting fonts will now be fully functional.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="closing-thoughts">Closing thoughts<a href="https://eightshift.oceanamazon.com/blog/adding-fonts#closing-thoughts" class="hash-link" aria-label="Direct link to Closing thoughts" title="Direct link to Closing thoughts" translate="no">​</a></h2>
<p>Adding fonts to a project is something you will usually only do when setting up a new project and then forget about it. As you could see in this blog post, this isn't a complicated process, but it has a specific set of steps that have to be taken in order for custom fonts to work in your project.</p>
<p>Of course, there are other ways to include fonts in your project, but the described process is what we recommend and use. This is the (Eightshift) Way.</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>fonts</category>
        </item>
        <item>
            <title><![CDATA[Modifying blocks - Color Theme]]></title>
            <link>https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme</link>
            <guid>https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme</guid>
            <pubDate>Tue, 22 Mar 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Step-by-step guide on how to modify and expand the functionality of existing blocks.]]></description>
            <content:encoded><![CDATA[<p>In our previous post, we covered how to use Storybook and WP-CLI to add additional blocks to your project. This post will walk you through modifying an existing block step-by-step.</p>
<p>Since Eightshift Development kit is a starter theme, made for developers to jumpstart and speed up their development, you're welcome to modify files in it directly. There is no need to create a child theme to protect changes from updates.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="modifying-a-block-or-a-component">Modifying a block or a component?<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#modifying-a-block-or-a-component" class="hash-link" aria-label="Direct link to Modifying a block or a component?" title="Direct link to Modifying a block or a component?" translate="no">​</a></h2>
<p>Because we used the Quote block in our previous post, we will continue using it as an example as it's a fairly simple one. One of the first questions you may ask yourself could be: "Should I modify a component or a block?". And the answer is - it depends.</p>
<p>If you compare <strong><em>components/quote/quote.php</em></strong> (component) and <strong><em>custom/quote/quote.php</em></strong> (block), you'll notice that most of the HTML code is inside the component, while the block pretty much only renders the Quote component inside a wrapper. This example will walk you through the whole process of adding a new attribute and its options to a block.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-will-we-do">What will we do?<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#what-will-we-do" class="hash-link" aria-label="Direct link to What will we do?" title="Direct link to What will we do?" translate="no">​</a></h2>
<p>We want to style the block and add a new feature. An option to choose a color theme for the Quote block. These are the specs:</p>
<ul>
<li class="">each Quote block has a background with rounded corners</li>
<li class="">option for three color themes: blue, green, yellow</li>
<li class="">the background has a lighter shade of the selected color</li>
<li class="">quote icon has a stronger shade of the selected color</li>
</ul>
<p>To better help you visualize, this is how the Quote block should look like after making these changes, showcasing all three color theme variations:
<img decoding="async" loading="lazy" alt="Color Theme Examples" src="https://eightshift.oceanamazon.com/assets/images/color-theme-examples-49d717014747712e8921b795e4804944.webp" width="1067" height="234" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-background">Adding background<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#adding-background" class="hash-link" aria-label="Direct link to Adding background" title="Direct link to Adding background" translate="no">​</a></h2>
<p>Initial background styling is fairly straightforward. Navigate to <strong><em>src/Blocks/components/quote/quote-style.scss</em></strong> and paste the following code inside <code>.quote</code> class:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">padding</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">calc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">--base-font-size</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> * 1.6rem</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">border-radius</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">calc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">--base-font-size</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> * 2rem</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">background-color</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">global-settings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">colors</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> light</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>You may notice we're using <code>calc</code> instead of directly writing values in rems. This way makes it much easier to calculate pixel size since <code>calc(var(--base-font-size) * 1.6rem)</code> equals <code>16px</code>.</p>
<p>For now, we will add a simple light grey background to see how it looks. We'll replace this value later with a CSS variable.</p>
<div class="es-alert es-alert--tip m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-sand-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-sand-30"><path d="M11.975 23a2.42 2.42 0 0 1-1.302-.353 1.844 1.844 0 0 1-.788-.967h-.257c-.495 0-.924-.182-1.288-.545a1.761 1.761 0 0 1-.545-1.288v-3.924a8.44 8.44 0 0 1-2.773-2.96C4.341 11.753 4 10.422 4 8.975c0-2.218.775-4.102 2.324-5.651C7.873 1.774 9.757 1 11.975 1s4.102.775 5.651 2.324c1.55 1.549 2.324 3.433 2.324 5.651 0 1.46-.34 2.793-1.022 3.997a8.465 8.465 0 0 1-2.773 2.951v3.924c0 .495-.182.924-.545 1.288a1.761 1.761 0 0 1-1.288.545h-.257c-.147.41-.41.732-.788.967a2.416 2.416 0 0 1-1.302.353Zm-2.347-3.153h4.694V18.71H9.628v1.137Zm0-2.237h4.694v-1.082H9.628v1.082Zm-.238-2.915h1.888v-3.502L8.785 8.7l.953-.953 2.237 2.236 2.237-2.236.953.953-2.493 2.493v3.502h1.888c1.063-.501 1.922-1.267 2.576-2.296.654-1.03.98-2.171.98-3.424 0-1.723-.592-3.178-1.778-4.363-1.185-1.186-2.64-1.779-4.363-1.779-1.723 0-3.178.593-4.363 1.779-1.186 1.185-1.779 2.64-1.779 4.363 0 1.253.327 2.394.981 3.424.654 1.03 1.513 1.795 2.576 2.296Z" fill="currentColor"></path></svg><span class="text-grey-500">Tip</span></i><div class="font-sans text-16 text-black"><p>Don't hardcode hex color values directly inside your component. Instead, use colors defined in your global manifest.</p></div></div>
<p>You'll notice that the changes are visible both in the editor and on the frontend. Since the Gutenberg editor adds some additional markup, sometimes you'll need to add additional styling only for the editor. In case we need to override something in the editor for our Quote component, we would simply create <strong><em>quote-editor.scss</em></strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-new-colors-to-your-project">Adding new colors to your project<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#adding-new-colors-to-your-project" class="hash-link" aria-label="Direct link to Adding new colors to your project" title="Direct link to Adding new colors to your project" translate="no">​</a></h2>
<p>Because the theme currently doesn't have all the required colors, we need to add additional colors which will be used for the color theme feature. We will use the colors already defined in the manifest for icon color, but we need to add lighter variations of those colors to use them for the background. Navigate to your global manifest, which is located inside <strong><em>src/Blocks/manifest.json</em></strong> and add the following values inside <code>colors</code>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Light Blue"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"slug"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"light-blue"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"color"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"#B3E5FC"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Light Green"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"slug"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"light-green"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"color"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"#DCEDC8"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Light Yellow"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"slug"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"light-yellow"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"color"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"#FFF9C4"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-a-new-attribute-and-options-to-manifest">Adding a new attribute and options to manifest<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#adding-a-new-attribute-and-options-to-manifest" class="hash-link" aria-label="Direct link to Adding a new attribute and options to manifest" title="Direct link to Adding a new attribute and options to manifest" translate="no">​</a></h2>
<p>For editors to be able to choose which color theme to use for the Quote block, we need to define an attribute for it in the manifest. Navigate to <strong><em>src/Blocks/components/quote/manifest.json</em></strong> and add the following value inside <code>attributes</code>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"quoteColorTheme"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"blue"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="es-alert es-alert--caution m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-candy-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-candy-30"><path d="M1 21 12 2l11 19H1Zm2.883-1.667h16.234L12 5.333l-8.117 14Zm8.187-1.283a.815.815 0 0 0 .83-.836.815.815 0 0 0-.836-.83.814.814 0 0 0-.83.836.814.814 0 0 0 .836.83Zm-.837-2.85H12.9V9.8h-1.667v5.4Z" fill="currentColor"></path></svg><span class="text-grey-500">Caution</span></i><div class="font-sans text-16 text-black"><p>Double-check the path of the manifest used in this example. We're adding it inside the Quote component manifest, not the Quote block manifest.</p></div></div>
<p>After that, since we want to have a fixed number of options, we need to define available options. We can do that inside <code>options</code> which is on the same level as <code>attributes</code>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"options"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"quoteColorTheme"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string" style="color:rgb(255, 121, 198)">"blue"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string" style="color:rgb(255, 121, 198)">"green"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token string" style="color:rgb(255, 121, 198)">"yellow"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="css-variables">CSS variables<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#css-variables" class="hash-link" aria-label="Direct link to CSS variables" title="Direct link to CSS variables" translate="no">​</a></h2>
<p>Our next step is to add CSS variables to the Quote component's manifest. Inside <strong><em>manifest.json</em></strong>, on the same level as <code>attributes</code>, add the following code:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">"variables"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">"quoteColorTheme"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"blue"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"variable"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token property">"quote-background-color"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"var(--global-colors-light-blue)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token property">"quote-icon-color"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"var(--global-colors-blue)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"green"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"variable"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token property">"quote-background-color"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"var(--global-colors-light-green)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token property">"quote-icon-color"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"var(--global-colors-green)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">"yellow"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token property">"variable"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token property">"quote-background-color"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"var(--global-colors-light-yellow)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token property">"quote-icon-color"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"var(--global-colors-yellow)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Now, navigate back to Quote component's <strong><em>quote-style.scss</em></strong> and replace the <code>background-color</code> which we used for testing with the following:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">background-color</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">--quote-background-color</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>As you can see, the variable name is the same one we used when defining background color variations in the manifest. For icon color, we do the same. After adding a new color to <code>&amp;__icon</code> selector, our code should now look like this:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token selector" style="color:rgb(255, 121, 198)">&amp;__icon</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">display</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> block</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">margin-bottom</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 1rem</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">color</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">var</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">--quote-icon-color</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="outputting-css-variables-in-editor">Outputting CSS variables in editor<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#outputting-css-variables-in-editor" class="hash-link" aria-label="Direct link to Outputting CSS variables in editor" title="Direct link to Outputting CSS variables in editor" translate="no">​</a></h2>
<p>To make our color theme visible in editor, we have to add few lines of code to <strong><em>src/Blocks/components/quote/components/quote-editor.js</em></strong> file. First, we need to import a few functions. We need <code>useMemo</code> from <strong><em>react</em></strong>, <code>outputCssVariables</code> and <code>getUnique</code> from <strong><em>@eightshift/frontend-libs/scripts</em></strong> and finally, we need data from the global manifest.</p>
<p>After importing these and defining a unique constant, your code should look like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> useMemo </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'react'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">classnames</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'classnames'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> checkAttr</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> props</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> selector</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> outputCssVariables</span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token imports"> getUnique </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eightshift/frontend-libs/scripts'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">HeadingEditor</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'../../heading/components/heading-editor'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">ParagraphEditor</span><span class="token imports"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'../../paragraph/components/paragraph-editor'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">manifest</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./../manifest.json'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports">globalManifest</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'./../../../manifest.json'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(80, 250, 123)">QuoteEditor</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> unique </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useMemo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">getUnique</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><br></div></code></pre></div></div>
<p>Next, we need to add a unique <code>data-id</code> and output the <code>&lt;style&gt;</code> tag containing CSS variables.</p>
<p>Modify your return statement so it looks like this:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">		</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">figure</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)">quoteClass</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">data-id</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token tag script language-javascript" style="color:rgb(255, 121, 198)">unique</span><span class="token tag script language-javascript punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token function" style="color:rgb(80, 250, 123)">outputCssVariables</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> unique</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> globalManifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain-text">			//...</span><br></div></code></pre></div></div>
<p>If you try adding a Quote block in the editor, you should notice that it now has a light blue background with a quote icon in a darker shade of blue. This is the default value for the <code>quoteColorTheme</code> attribute we added in the component's manifest.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="outputting-css-variables-in-the-php-template">Outputting CSS variables in the PHP template<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#outputting-css-variables-in-the-php-template" class="hash-link" aria-label="Direct link to Outputting CSS variables in the PHP template" title="Direct link to Outputting CSS variables in the PHP template" translate="no">​</a></h2>
<p>The PHP template for the Quote component is located in <strong><em>src/Blocks/components/quote/quote.php</em></strong>. This process is similar to the one described above, it's just written in PHP. All helper methods we need for this are contained inside the <code>Components</code> class, which is already included in this file.</p>
<p>Similar to the JS template, we need a unique value, assign it to <code>data-id</code>, and output CSS variables. After adding these, the code should look like this:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token delimiter important">&lt;?php</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$quoteClass</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">classnames</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">selector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$componentClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$componentClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">selector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$blockClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$selectorClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">selector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$additionalClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$additionalClass</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$unique</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">getUnique</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">?</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&lt;</span><span class="token plain">figure </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token operator">=</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">"&lt;?php echo \esc_attr(</span><span class="token string double-quoted-string interpolation variable" style="color:rgb(189, 147, 249);font-style:italic">$quoteClass</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">); ?&gt;"</span><span class="token plain"> data</span><span class="token operator">-</span><span class="token plain">id</span><span class="token operator">=</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">"&lt;?php echo \esc_attr(</span><span class="token string double-quoted-string interpolation variable" style="color:rgb(189, 147, 249);font-style:italic">$unique</span><span class="token string double-quoted-string" style="color:rgb(255, 121, 198)">); ?&gt;"</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token operator">&lt;</span><span class="token operator">?</span><span class="token plain">php </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">echo</span><span class="token plain"> </span><span class="token class-name static-context">Components</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">outputCssVariables</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$unique</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$globalManifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token operator">?</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><br></div></code></pre></div></div>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-violet-30"><path d="M3.852 20.148h10.74v-5.555h5.556V3.852H3.852v16.296Zm0 1.852c-.51 0-.945-.181-1.308-.544A1.783 1.783 0 0 1 2 20.148V3.852c0-.51.181-.945.544-1.308A1.783 1.783 0 0 1 3.852 2h16.296c.51 0 .945.181 1.308.544.363.363.544.799.544 1.308v11.481L15.333 22H3.852Zm2.963-8.148V12h5v1.852h-5Zm0-4.445V7.556h10.37v1.851H6.815Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>Both PHP and JS have the same helpers to make writing code for editor and front view as similar as possible.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-options">Adding options<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#adding-options" class="hash-link" aria-label="Direct link to Adding options" title="Direct link to Adding options" translate="no">​</a></h2>
<p>After adding these snippets, you should already see that your block is using the blue color theme, which we defined as the default value for <code>quoteColorTheme</code> in the manifest. We want to have an easy way to change the color theme in the editor. Now we'll add a new option which will do just that.</p>
<p>We will add these options in <strong><em>src/Blocks/components/quote/components/quote-options.js</em></strong>. Again, we will start with the imports we will need. First one is <code>__</code> from <strong><em>@wordpress/i18n</em></strong> package. Additional imports we need are from <strong><em>@eightshift/frontend-libs/scripts</em></strong>, so we will just add those to the list.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token imports"> __ </span><span class="token imports punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@wordpress/i18n'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token maybe-class-name">ColorPaletteCustom</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token maybe-class-name">IconLabel</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	icons</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	getOption</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'@eightshift/frontend-libs/scripts'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>Next, we can add a new attribute in options called <code>showQuoteColorTheme</code> and set it to <code>true</code> by default. If we want to use this component in other blocks, we can use this attribute for showing or hiding Color Theme Options on a specific block that uses the Quote component.</p>
<p>Additionally, we need to get values for <code>quoteUse</code> and <code>quoteColorTheme</code> attributes. We can use the <code>checkAttr</code> helper which first checks if a block has saved attribute value. If not, it defaults to a value defined in the manifest.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(80, 250, 123)">QuoteOptions</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		setAttributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		showQuoteColorTheme </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> quoteUse </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">checkAttr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'quoteUse'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> quoteColorTheme </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">checkAttr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'quoteColorTheme'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div>
<p>Finally, we add the Color Palette, which we will use for switching color themes.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">quoteUse </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">showQuoteColorTheme </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token operator">&lt;</span><span class="token maybe-class-name">ColorPaletteCustom</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">						label</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token operator">&lt;</span><span class="token maybe-class-name">IconLabel</span><span class="token plain"> icon</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">icons</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">color</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> label</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token function" style="color:rgb(80, 250, 123)">__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Color Theme'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'es-theme'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token operator">/</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">						colors</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token function" style="color:rgb(80, 250, 123)">getOption</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'quoteColorTheme'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">						value</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">quoteColorTheme</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">						onChange</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">setAttributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token function" style="color:rgb(80, 250, 123)">getAttrKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'quoteColorTheme'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> manifest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">:</span><span class="token plain"> value </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">					</span><span class="token operator">/</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">				</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">			</span><span class="token comment" style="color:rgb(98, 114, 164)">//...</span><br></div></code></pre></div></div>
<p>The Color Theme option should now be visible and fully functional inside the Quote block.</p>
<p><img decoding="async" loading="lazy" alt="Color Theme Options" src="data:image/webp;base64,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" width="275" height="143" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-transitions-in-the-editor">Adding transitions in the editor<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#adding-transitions-in-the-editor" class="hash-link" aria-label="Direct link to Adding transitions in the editor" title="Direct link to Adding transitions in the editor" translate="no">​</a></h2>
<p>The options work, but you may notice there is no transition in the editor. It is not necessary but will improve the user experience. Since we do not need transition effects on the frontend, we can add these CSS rules only to the editor. To do that, we start by creating <strong><em>quote-editor.scss</em></strong> file inside <strong><em>src/Blocks/components/quote</em></strong> folder.</p>
<p>We add the following CSS:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token selector" style="color:rgb(255, 121, 198)">.quote</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token property">transition</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> background-color 0.3s ease-in-out</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token selector" style="color:rgb(255, 121, 198)">&amp;__icon</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">		</span><span class="token property">transition</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> color 0.3s ease-in-out</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Because we've added a new file, we have to run <code>npm start</code> again. Now the transition between colors will be much smoother.</p>
<p><img decoding="async" loading="lazy" alt="Color Theme Change" src="https://eightshift.oceanamazon.com/assets/images/color-theme-change-cd1ede6d92339a8178f33466d37a7e16.gif" width="772" height="338" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="closing-thoughts">Closing thoughts<a href="https://eightshift.oceanamazon.com/blog/modifying-blocks-color-theme#closing-thoughts" class="hash-link" aria-label="Direct link to Closing thoughts" title="Direct link to Closing thoughts" translate="no">​</a></h2>
<p>In this post, we've covered the whole process of adding a new attribute. It involves a lot of steps and things to keep in mind, but once you get used to it, you'll be able to add quite powerful features to your blocks.</p>
<p>One more important thing to keep in mind is the expandability of your attributes. When adding new attributes, don't think just about what you need now, keep in mind that you may need to expand it later.</p>
<p>The way we built Color Theme functionality makes adding additional color themes a breeze and can be done in a matter of minutes. For "homework", try adding two more color themes of your choice. Good luck!</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>components</category>
            <category>blocks</category>
        </item>
        <item>
            <title><![CDATA[Adding components and blocks with WP-CLI]]></title>
            <link>https://eightshift.oceanamazon.com/blog/adding-blocks-wpcli</link>
            <guid>https://eightshift.oceanamazon.com/blog/adding-blocks-wpcli</guid>
            <pubDate>Mon, 14 Mar 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[This blog post covers how to use our WP CLI commands for adding components and blocks into your project.]]></description>
            <content:encoded><![CDATA[<p>Although there are a few basic blocks available after creating a project, there are a lot more blocks available in the dev kit. However, you have to add them to your project using WP-CLI (the simplest method). To see the complete list of available components and blocks, visit our <a class="" href="https://eightshift.oceanamazon.com/components/welcome">ES UI components documentation</a>.</p>
<p>These can be used out-of-the-box, but also as a good starting point if you need similar blocks in your projects. It will also speed up your development time since you don't have to build everything from scratch.</p>
<div class="es-alert es-alert--info m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-sky-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-sky-30"><path clip-rule="evenodd" fill-rule="evenodd" d="M12 1C5.925 1 1 5.925 1 12s4.925 11 11 11 11-4.925 11-11S18.075 1 12 1ZM3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0Zm10 5v-7h-2v7h2Z" fill="currentColor"></path><circle cx="12" cy="7.25" r="1.25" fill="currentColor"></circle></svg><span class="text-grey-500">Last update</span></i><div class="font-sans text-16 text-black"><p>August 23, 2022</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="storybook">Storybook<a href="https://eightshift.oceanamazon.com/blog/adding-blocks-wpcli#storybook" class="hash-link" aria-label="Direct link to Storybook" title="Direct link to Storybook" translate="no">​</a></h2>
<p>Storybook allows you to preview how the components and blocks look and which options they have available. Since Storybook is interactive, you can try out most of the options. Think of it as a catalog with all custom blocks we've built and made ready for public use.</p>
<p>Each entry in Storybook should have documentation that explains the block in more detail, along with implementation instructions. Before using any block, be sure to check <code>Dependencies</code> section. Although <code>Implementation</code> section lists all the necessary WP-CLI commands required to use a specific block or a component, it is recommended to check if you have the required dependencies ready in your theme.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wp-cli-commands">WP-CLI commands<a href="https://eightshift.oceanamazon.com/blog/adding-blocks-wpcli#wp-cli-commands" class="hash-link" aria-label="Direct link to WP-CLI commands" title="Direct link to WP-CLI commands" translate="no">​</a></h2>
<p>If you've read our <a class="" href="https://eightshift.oceanamazon.com/blog/initial-setup">Initial Setup</a> post, you're already familiar with our custom WP-CLI commands. For implementing additional components, we have <code>wp boilerplate blocks use-component --name=</code> command. For blocks, we have <code>wp boilerplate blocks use-block --name=</code> command.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-new-component-and-block-in-our-project">Adding new component and block in our project<a href="https://eightshift.oceanamazon.com/blog/adding-blocks-wpcli#adding-new-component-and-block-in-our-project" class="hash-link" aria-label="Direct link to Adding new component and block in our project" title="Direct link to Adding new component and block in our project" translate="no">​</a></h2>
<p>Let's say we need a Quote block in our project. After going through the documentation of the Quote block, we see that we have one dependency, and that is the Quote component. So, to make Quote block available in our project, we need two WP-CLI commands:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate blocks use-block --name=quote</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate blocks use-component --name=quote</span><br></div></code></pre></div></div>
<p>When entering the <code>wp boilerplate blocks use-block --name='quote'</code> command, you'll notice the note about a block dependency on the Quote component. So you should run the second command as well.</p>
<p><img decoding="async" loading="lazy" alt="Setup - instructions" src="https://eightshift.oceanamazon.com/assets/images/wpcli-1-121561b87c2462841e12b91f09172d69.webp" width="1014" height="447" class="img_ev3q"></p>
<p>After entering these commands, run <code>npm start</code> again to make sure everything works properly.</p>
<p>The Quote block is now ready to use and available in your blocks list. You may use it as-is, or you may want to expand its functionalities with some additional attributes. More about that will be covered in the next blog post.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-example-block">Using Example block<a href="https://eightshift.oceanamazon.com/blog/adding-blocks-wpcli#using-example-block" class="hash-link" aria-label="Direct link to Using Example block" title="Direct link to Using Example block" translate="no">​</a></h2>
<p>If you want to build a block almost from scratch, you can use our Example block. This is a very simple block that generates all necessary files with some example options. To add an Example block to your project, use the following WP-CLI command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wp boilerplate blocks use-block --name=example</span><br></div></code></pre></div></div>
<p>Since our blocks use a predefined structure to make everything register automatically, adding Example block with WP-CLI will generate all required files. After it's added, feel free to rename the folder, as well as files with the name of your block and start modifying all the files. Simply replace "example" with the name of your block.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="further-reading">Further reading<a href="https://eightshift.oceanamazon.com/blog/adding-blocks-wpcli#further-reading" class="hash-link" aria-label="Direct link to Further reading" title="Direct link to Further reading" translate="no">​</a></h2>
<p>Our documentation has all this covered in a lot more detail, so if you would like to better understand the structure of our blocks and components, here are some chapters covering these topics:</p>
<ul>
<li class=""><a class="" href="https://eightshift.oceanamazon.com/docs/basics/architecture-concepts">Architecture concepts</a></li>
<li class=""><a class="" href="https://eightshift.oceanamazon.com/docs/basics/block-structure">Block Structure</a></li>
<li class=""><a class="" href="https://eightshift.oceanamazon.com/docs/basics/blocks-component-structure">Component Structure</a></li>
</ul>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>wpcli</category>
            <category>components</category>
            <category>blocks</category>
        </item>
        <item>
            <title><![CDATA[Components and blocks]]></title>
            <link>https://eightshift.oceanamazon.com/blog/components-and-blocks</link>
            <guid>https://eightshift.oceanamazon.com/blog/components-and-blocks</guid>
            <pubDate>Fri, 21 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Explanation of the difference between components and blocks on a practical example]]></description>
            <content:encoded><![CDATA[<p>In this blog post, we'll give you a practical explanation about the difference between components and blocks. For a truly in-depth explanation about components and blocks, you can refer to <a class="" href="https://eightshift.oceanamazon.com/docs/basics/blocks">our documentation</a>. A more specific explanation about using components in a block can be found in the <a class="" href="https://eightshift.oceanamazon.com/docs/basics/blocks-component-in-block/">Component in a Block</a> section.</p>
<p>One of the things that is really confusing to newcomers is the difference between components and blocks. Let's break it all down.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="component">Component<a href="https://eightshift.oceanamazon.com/blog/components-and-blocks#component" class="hash-link" aria-label="Direct link to Component" title="Direct link to Component" translate="no">​</a></h2>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><div class="font-sans text-16 text-black"><p>A component is like a blank slate, a template without context.</p></div></div>
<p>It doesn't know or even care for what it will be used. Can you combine multiple simple components into one complex component? Absolutely! That's exactly what we'll do in the following example.</p>
<p>Let's say we have a component that consists of an image and a heading. Image and heading are two simple components that come with the theme out-of-the-box.</p>
<p>Here are a few examples of how this new component can be used:</p>
<ul>
<li class="">displaying a post</li>
<li class="">displaying a user or an author</li>
<li class="">displaying a photo with the photographer's name</li>
<li class="">and many more...</li>
</ul>
<p>As you can already see, there are many ways you can use this component. What helps expand the usability of this component even more are <code>attributes</code>. Let's say we have the following attributes:</p>
<ul>
<li class=""><code>imagePosition</code> - left, right, top, bottom</li>
<li class=""><code>imageShape</code> - rectangular, circular</li>
<li class=""><code>imageWidth</code> - 25%, 50%, 75%</li>
<li class=""><code>headingColor</code> - black, blue, red</li>
<li class=""><code>headingSize</code> - small, medium, large</li>
</ul>
<p>These attributes give you the option to modify the look of the component, so this specific component can be used for the following:</p>
<ul>
<li class=""><strong>related posts</strong> - rectangular image on the left side, 25% image width, heading takes up the remaining 75%, medium heading colored in blue</li>
<li class=""><strong>user avatar</strong> - circular image on the left side, 25% image width, small heading colored in black</li>
<li class=""><strong>photo of the day</strong> - rectangular image on the right side which takes 75% width and photographer's name is written in medium blue text</li>
<li class=""><strong>featured posts</strong> - rectangular image on top, large heading in red color</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Component with different attributes" src="https://eightshift.oceanamazon.com/assets/images/components-257a09f77e42c302781faf91fc8de6a6.webp" width="1086" height="813" class="img_ev3q"></p>
<p>You can even add conditional logic to your options, e.g. to have the option for <code>imageWidth</code> visible only when <code>imagePosition</code> is set to left or right. And when <code>imagePosition</code> is set to top or bottom, it defaults to 100% width.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="block">Block<a href="https://eightshift.oceanamazon.com/blog/components-and-blocks#block" class="hash-link" aria-label="Direct link to Block" title="Direct link to Block" translate="no">​</a></h2>
<p>So, what about blocks? Blocks can consist of one or more components and, most importantly, allow you to use them in the editor. Technically, blocks can consist of zero components, but we encourage you to build blocks from components because that increases the reusability.</p>
<div class="es-alert es-alert--note m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-violet-30"><div class="font-sans text-16 text-black"><p>Blocks give context to the components.</p></div></div>
<p>Now that we have our component - let's call it <code>card-simple</code> - we can use it in a <code>Featured Posts</code> block. In <strong>component's</strong> <code>manifest.json</code>, we've already defined how we want it to look by setting some defaults. When using this component in our block, we can override some attributes in <strong>block's</strong> <code>manifest.json</code>. Since it will be used for displaying featured posts, we can define that <code>imagePosition</code> should be set to <strong>top</strong>.</p>
<p>After defining how we want our component to look while displaying featured posts, we need another attribute which will allow us to choose which posts to display in our block.</p>
<p>To do that, we'll add a new attribute called <code>featuredPosts</code> which will define which posts will be displayed in our block. For each selected post, another <code>card-simple</code> component is added, and featured image and post title are dynamically added to its image and heading components. More about the query logic and adding new options in a block will be covered in a future post.</p>
<p>You may be wondering, can you have a block that allows you to use all options of the <code>card-simple</code> component? Of course! You can create a block that allows you to set all available options in the editor and manually add content to the image and heading. There are also block variations, which allow you to set up predefined attributes for a block. More about setting up block variations may be covered in one of the future posts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://eightshift.oceanamazon.com/blog/components-and-blocks#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Hopefully, these examples helped you get a better understanding of the difference between components and blocks. It may take a bit more time or practical use to understand the difference and reasoning behind it. Our next post will walk you through downloading one of our components and blocks with WP CLI and modifying it.</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>components</category>
            <category>blocks</category>
        </item>
        <item>
            <title><![CDATA[Initial setup and first steps]]></title>
            <link>https://eightshift.oceanamazon.com/blog/initial-setup</link>
            <guid>https://eightshift.oceanamazon.com/blog/initial-setup</guid>
            <pubDate>Thu, 20 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[This blog post describes how to set up Eightshift Boilerplate theme, and covers some of the most common issues that may occur]]></description>
            <content:encoded><![CDATA[<p>As is often the case when trying out something new, you might encounter some hiccups. You're trying out our Eightshift Boilerplate, but can't get it to work? Worry not, we'll go through the setup and the most common issues that may occur.</p>
<div class="es-alert es-alert--info m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-sky-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-sky-30"><path clip-rule="evenodd" fill-rule="evenodd" d="M12 1C5.925 1 1 5.925 1 12s4.925 11 11 11 11-4.925 11-11S18.075 1 12 1ZM3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0Zm10 5v-7h-2v7h2Z" fill="currentColor"></path><circle cx="12" cy="7.25" r="1.25" fill="currentColor"></circle></svg><span class="text-grey-500">Last update</span></i><div class="font-sans text-16 text-black"><p>December 05, 2024</p></div></div>
<div class="es-alert es-alert--caution m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-candy-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-candy-30"><path d="M1 21 12 2l11 19H1Zm2.883-1.667h16.234L12 5.333l-8.117 14Zm8.187-1.283a.815.815 0 0 0 .83-.836.815.815 0 0 0-.836-.83.814.814 0 0 0-.83.836.814.814 0 0 0 .836.83Zm-.837-2.85H12.9V9.8h-1.667v5.4Z" fill="currentColor"></path></svg><span class="text-grey-500">Note</span></i><div class="font-sans text-16 text-black"><p>This post is no longer valid. We have discontinued the support for automatic project setup and initial block/components and all other scaffolding.</p></div></div>
<p>If you haven't already, be sure to read our official <a class="" href="https://eightshift.oceanamazon.com/docs/welcome">Eightshift Docs</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup">Setup<a href="https://eightshift.oceanamazon.com/blog/initial-setup#setup" class="hash-link" aria-label="Direct link to Setup" title="Direct link to Setup" translate="no">​</a></h2>
<p>To create Eightshift theme, navigate to <code>wp-content/themes</code> in your project and type the following in the terminal:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx eightshift-create</span><br></div></code></pre></div></div>
<p>Just follow the instructions and wait for the theme to download.</p>
<p><img decoding="async" loading="lazy" alt="Setup - initial prompt" src="https://eightshift.oceanamazon.com/assets/images/setup-1-ec493b6656446eff46afec93938c9c13.webp" width="770" height="674" class="img_ev3q"></p>
<p>OK, you went through the process, filled out all required information, but the theme still isn't working. There are a few more instructions in the terminal on what to do next, but you may have skipped them. While the principle <strong>"6 hours of debugging can save you 5 minutes of reading documentation"</strong> is fun, sometimes it's just not worth it. Here's what you should do:</p>
<ul>
<li class="">run <code>wp theme activate your-theme-name</code> to activate your new theme</li>
<li class="">navigate to <code>wp-content/themes/your-theme-name</code></li>
<li class="">try running <code>wp boilerplate --help</code> to check if our WP CLI boilerplate commands work</li>
<li class="">for easiest initial setup, run <code>wp boilerplate init theme</code></li>
<li class=""><code>npm start</code> should trigger automatically with the previous command. If it doesn't, you can run it manually to finish the theme build process</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Setup - instructions" src="https://eightshift.oceanamazon.com/assets/images/setup-2-b4b504dcdd78f667a70c63579d5dec6f.webp" width="1046" height="352" class="img_ev3q"></p>
<p>Congratulations, you've set up your Eightshift theme!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-to-know-eightshift-dev-tools">Getting to know Eightshift dev tools<a href="https://eightshift.oceanamazon.com/blog/initial-setup#getting-to-know-eightshift-dev-tools" class="hash-link" aria-label="Direct link to Getting to know Eightshift dev tools" title="Direct link to Getting to know Eightshift dev tools" translate="no">​</a></h2>
<p>After successfully setting up the theme and going through files, you'll notice this file structure is quite different from traditional WordPress themes and you may think to yourself: "Oh wow, what did I get myself into?"</p>
<p>While it may look scary and confusing at first, once you get used to the structure, you'll see the benefits. More about that will be covered in future posts, where we'll walk you through some basics of developing with Eightshift Boilerplate.</p>
<p>You may want to try a few of our WP CLI commands to add another component, block, or service class. Running <code>wp boilerplate --help</code> will give you a list of commands and their short description. If you need even more details about a specific command, you can type, e.g. <code>wp boilerplate create post-type --help</code></p>
<p>The final tip in this post is related to troubleshooting. Maybe you tried to add a new class or a new feature to one of the existing blocks. And now the site has crashed. In tech support, the number 1 question is <strong>"Have you tried turning it off and on again?"</strong>. In our case, the number 1 question is:</p>
<div class="es-alert es-alert--tip m-0 my-10 pl-10 pr-0 py-4 border-l-4 border-l-infinum border-l-sand-30"><i class="flex gap-1.5 items-center font-sans text-12 uppercase not-italic leading-none font-medium mb-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" class="w-6 h-6 text-sand-30"><path d="M11.975 23a2.42 2.42 0 0 1-1.302-.353 1.844 1.844 0 0 1-.788-.967h-.257c-.495 0-.924-.182-1.288-.545a1.761 1.761 0 0 1-.545-1.288v-3.924a8.44 8.44 0 0 1-2.773-2.96C4.341 11.753 4 10.422 4 8.975c0-2.218.775-4.102 2.324-5.651C7.873 1.774 9.757 1 11.975 1s4.102.775 5.651 2.324c1.55 1.549 2.324 3.433 2.324 5.651 0 1.46-.34 2.793-1.022 3.997a8.465 8.465 0 0 1-2.773 2.951v3.924c0 .495-.182.924-.545 1.288a1.761 1.761 0 0 1-1.288.545h-.257c-.147.41-.41.732-.788.967a2.416 2.416 0 0 1-1.302.353Zm-2.347-3.153h4.694V18.71H9.628v1.137Zm0-2.237h4.694v-1.082H9.628v1.082Zm-.238-2.915h1.888v-3.502L8.785 8.7l.953-.953 2.237 2.236 2.237-2.236.953.953-2.493 2.493v3.502h1.888c1.063-.501 1.922-1.267 2.576-2.296.654-1.03.98-2.171.98-3.424 0-1.723-.592-3.178-1.778-4.363-1.185-1.186-2.64-1.779-4.363-1.779-1.723 0-3.178.593-4.363 1.779-1.186 1.185-1.779 2.64-1.779 4.363 0 1.253.327 2.394.981 3.424.654 1.03 1.513 1.795 2.576 2.296Z" fill="currentColor"></path></svg><span class="text-grey-500">Tip</span></i><div class="font-sans text-16 text-black"><p>Have you tried <code>composer dump-autoload</code> and re-running <code>npm start</code>?</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next-in-store">What's next in store?<a href="https://eightshift.oceanamazon.com/blog/initial-setup#whats-next-in-store" class="hash-link" aria-label="Direct link to What's next in store?" title="Direct link to What's next in store?" translate="no">​</a></h2>
<p>That's all for this post. In future posts we'll go through some more how-to examples like:</p>
<ul>
<li class="">the difference between components and blocks</li>
<li class="">downloading components and blocks from our Storybook with WP-CLI</li>
<li class="">adding new features to components and blocks</li>
<li class="">adding custom fonts to your project</li>
<li class="">adding custom queries which we'll use in one of our blocks</li>
<li class="">and many more...</li>
</ul>
<p>So stay tuned.</p>]]></content:encoded>
            <category>eightshift</category>
            <category>boilerplate</category>
            <category>setup</category>
        </item>
    </channel>
</rss>