<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dynamic blocks Archives - Developry Plugins</title>
	<atom:link href="https://developryplugins.com/tag/dynamic-blocks/feed/" rel="self" type="application/rss+xml" />
	<link>https://developryplugins.com/tag/dynamic-blocks/</link>
	<description></description>
	<lastBuildDate>Mon, 24 Nov 2025 11:17:59 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://developryplugins.com/wp-content/uploads/2026/06/cropped-favicon-alt-32x32.webp</url>
	<title>dynamic blocks Archives - Developry Plugins</title>
	<link>https://developryplugins.com/tag/dynamic-blocks/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to Build Dynamic Blocks with WordPress Block Editor</title>
		<link>https://developryplugins.com/how-to-build-dynamic-blocks-with-wordpress-block-editor/</link>
		
		<dc:creator><![CDATA[Krasen Slavov]]></dc:creator>
		<pubDate>Wed, 05 Aug 2026 09:00:00 +0000</pubDate>
				<category><![CDATA[Block Editor & Gutenberg Tutorials]]></category>
		<category><![CDATA[dynamic blocks]]></category>
		<category><![CDATA[gutenberg development]]></category>
		<category><![CDATA[php rendering]]></category>
		<category><![CDATA[server-side rendering]]></category>
		<category><![CDATA[wordpress blocks]]></category>
		<guid isPermaLink="false">https://developryplugins.com/?p=131</guid>

					<description><![CDATA[<p>Dynamic blocks represent a powerful evolution in WordPress block development, enabling server-side rendering that displays real-time data, database queries, and user-specific content. This guide teaches you to build dynamic blocks...</p>
<p>The post <a href="https://developryplugins.com/how-to-build-dynamic-blocks-with-wordpress-block-editor/">How to Build Dynamic Blocks with WordPress Block Editor</a> appeared first on <a href="https://developryplugins.com">Developry Plugins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><!-- @format --></p>
<p>Dynamic blocks represent a powerful evolution in WordPress block development, enabling server-side rendering that displays real-time data, database queries, and user-specific content. This guide teaches you to build dynamic blocks that combine the flexibility of Gutenberg with the power of PHP.</p>
<h2 id="static-vs-dynamic-blocks">Static vs Dynamic Blocks</h2>
<p>Understanding the difference between static and dynamic blocks is fundamental.</p>
<p><strong>Static blocks</strong> save their content directly to the database as HTML. When you create a paragraph block, WordPress stores the exact HTML in post_content. This is efficient for content that doesn’t change.</p>
<p><strong>Dynamic blocks</strong> save only their attributes to the database. Each time the page loads, WordPress executes a PHP render callback that generates the HTML. This enables real-time data like “latest posts,” user-specific content, and database queries.</p>
<p>Use static blocks for fixed content. Use dynamic blocks when content must update automatically based on data changes, user context, or external sources.</p>
<h2 id="when-to-use-dynamic-blocks">When to Use Dynamic Blocks</h2>
<p>Dynamic blocks excel in specific scenarios:</p>
<ul>
<li><strong>Latest content displays</strong> &#8211; Showing recent posts, comments, or custom post types</li>
<li><strong>User-specific content</strong> &#8211; Displaying personalized data based on logged-in users</li>
<li><strong>External data</strong> &#8211; Fetching and displaying API data, weather, stock prices</li>
<li><strong>Database queries</strong> &#8211; Running complex WP_Query operations</li>
<li><strong>Real-time calculations</strong> &#8211; Computing values based on current data</li>
</ul>
<p>Avoid dynamic blocks for purely presentational content that never changes. The server-side rendering adds processing overhead unnecessary for static content.</p>
<h2 id="creating-your-first-dynamic-block">Creating Your First Dynamic Block</h2>
<p>Start with block.json to define your block:</p>
<div class="sourceCode" id="cb1">
<pre class="sourceCode json"><code class="sourceCode json"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true"></a><span class="fu">{</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true"></a>    <span class="dt">&quot;apiVersion&quot;</span><span class="fu">:</span> <span class="dv">3</span><span class="fu">,</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true"></a>    <span class="dt">&quot;name&quot;</span><span class="fu">:</span> <span class="st">&quot;dprt/recent-posts&quot;</span><span class="fu">,</span></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true"></a>    <span class="dt">&quot;title&quot;</span><span class="fu">:</span> <span class="st">&quot;Recent Posts&quot;</span><span class="fu">,</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true"></a>    <span class="dt">&quot;category&quot;</span><span class="fu">:</span> <span class="st">&quot;widgets&quot;</span><span class="fu">,</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true"></a>    <span class="dt">&quot;icon&quot;</span><span class="fu">:</span> <span class="st">&quot;list-view&quot;</span><span class="fu">,</span></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true"></a>    <span class="dt">&quot;description&quot;</span><span class="fu">:</span> <span class="st">&quot;Display recent posts dynamically&quot;</span><span class="fu">,</span></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true"></a>    <span class="dt">&quot;attributes&quot;</span><span class="fu">:</span> <span class="fu">{</span></span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true"></a>        <span class="dt">&quot;numberOfPosts&quot;</span><span class="fu">:</span> <span class="fu">{</span></span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true"></a>            <span class="dt">&quot;type&quot;</span><span class="fu">:</span> <span class="st">&quot;number&quot;</span><span class="fu">,</span></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true"></a>            <span class="dt">&quot;default&quot;</span><span class="fu">:</span> <span class="dv">5</span></span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true"></a>        <span class="fu">},</span></span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true"></a>        <span class="dt">&quot;postType&quot;</span><span class="fu">:</span> <span class="fu">{</span></span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true"></a>            <span class="dt">&quot;type&quot;</span><span class="fu">:</span> <span class="st">&quot;string&quot;</span><span class="fu">,</span></span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true"></a>            <span class="dt">&quot;default&quot;</span><span class="fu">:</span> <span class="st">&quot;post&quot;</span></span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true"></a>        <span class="fu">}</span></span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true"></a>    <span class="fu">},</span></span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true"></a>    <span class="dt">&quot;editorScript&quot;</span><span class="fu">:</span> <span class="st">&quot;file:./index.js&quot;</span><span class="fu">,</span></span>
<span id="cb1-19"><a href="#cb1-19" aria-hidden="true"></a>    <span class="dt">&quot;editorStyle&quot;</span><span class="fu">:</span> <span class="st">&quot;file:./editor.css&quot;</span><span class="fu">,</span></span>
<span id="cb1-20"><a href="#cb1-20" aria-hidden="true"></a>    <span class="dt">&quot;style&quot;</span><span class="fu">:</span> <span class="st">&quot;file:./style.css&quot;</span></span>
<span id="cb1-21"><a href="#cb1-21" aria-hidden="true"></a><span class="fu">}</span></span></code></pre>
</div>
<p>Register the block with a render callback:</p>
<div class="sourceCode" id="cb2">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true"></a><span class="kw">function</span> dprt_register_recent_posts_block<span class="ot">()</span> {</span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true"></a>    register_block_type<span class="ot">(</span> <span class="kw">__DIR__</span> . <span class="st">&#39;/build/blocks/recent-posts&#39;</span><span class="ot">,</span> <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true"></a>        <span class="st">&#39;render_callback&#39;</span> =&gt; <span class="st">&#39;dprt_render_recent_posts_block&#39;</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true"></a>    <span class="ot">)</span> <span class="ot">);</span></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true"></a>}</span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true"></a>add_action<span class="ot">(</span> <span class="st">&#39;init&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_register_recent_posts_block&#39;</span> <span class="ot">);</span></span></code></pre>
</div>
<h2 id="implementing-the-render-callback">Implementing the Render Callback</h2>
<p>The render callback function generates your block’s HTML:</p>
<div class="sourceCode" id="cb3">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true"></a><span class="kw">function</span> dprt_render_recent_posts_block<span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">,</span> <span class="kw">$content</span><span class="ot">,</span> <span class="kw">$block</span> <span class="ot">)</span> {</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true"></a>    <span class="kw">$number_of_posts</span> = <span class="kw">isset</span><span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">[</span><span class="st">&#39;numberOfPosts&#39;</span><span class="ot">]</span> <span class="ot">)</span> <span class="ot">?</span> absint<span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">[</span><span class="st">&#39;numberOfPosts&#39;</span><span class="ot">]</span> <span class="ot">)</span> <span class="ot">:</span> <span class="dv">5</span><span class="ot">;</span></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true"></a>    <span class="kw">$post_type</span> = <span class="kw">isset</span><span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">[</span><span class="st">&#39;postType&#39;</span><span class="ot">]</span> <span class="ot">)</span> <span class="ot">?</span> sanitize_text_field<span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">[</span><span class="st">&#39;postType&#39;</span><span class="ot">]</span> <span class="ot">)</span> <span class="ot">:</span> <span class="st">&#39;post&#39;</span><span class="ot">;</span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true"></a></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true"></a>    <span class="kw">$args</span> = <span class="kw">array</span><span class="ot">(</span></span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true"></a>        <span class="st">&#39;post_type&#39;</span> =&gt; <span class="kw">$post_type</span><span class="ot">,</span></span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true"></a>        <span class="st">&#39;posts_per_page&#39;</span> =&gt; <span class="kw">$number_of_posts</span><span class="ot">,</span></span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true"></a>        <span class="st">&#39;post_status&#39;</span> =&gt; <span class="st">&#39;publish&#39;</span><span class="ot">,</span></span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true"></a>        <span class="st">&#39;orderby&#39;</span> =&gt; <span class="st">&#39;date&#39;</span><span class="ot">,</span></span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true"></a>        <span class="st">&#39;order&#39;</span> =&gt; <span class="st">&#39;DESC&#39;</span></span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true"></a>    <span class="ot">);</span></span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true"></a></span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true"></a>    <span class="kw">$query</span> = <span class="kw">new</span> WP_Query<span class="ot">(</span> <span class="kw">$args</span> <span class="ot">);</span></span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true"></a></span>
<span id="cb3-15"><a href="#cb3-15" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span> ! <span class="kw">$query</span>-&gt;have_posts<span class="ot">()</span> <span class="ot">)</span> {</span>
<span id="cb3-16"><a href="#cb3-16" aria-hidden="true"></a>        <span class="kw">return</span> <span class="st">&#39;&lt;p&gt;&#39;</span> . esc_html__<span class="ot">(</span> <span class="st">&#39;No posts found.&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt&#39;</span> <span class="ot">)</span> . <span class="st">&#39;&lt;/p&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb3-17"><a href="#cb3-17" aria-hidden="true"></a>    }</span>
<span id="cb3-18"><a href="#cb3-18" aria-hidden="true"></a></span>
<span id="cb3-19"><a href="#cb3-19" aria-hidden="true"></a>    <span class="kw">$output</span> = <span class="st">&#39;&lt;div class=&quot;wp-block-dprt-recent-posts&quot;&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb3-20"><a href="#cb3-20" aria-hidden="true"></a>    <span class="kw">$output</span> .= <span class="st">&#39;&lt;ul&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb3-21"><a href="#cb3-21" aria-hidden="true"></a></span>
<span id="cb3-22"><a href="#cb3-22" aria-hidden="true"></a>    <span class="kw">while</span> <span class="ot">(</span> <span class="kw">$query</span>-&gt;have_posts<span class="ot">()</span> <span class="ot">)</span> {</span>
<span id="cb3-23"><a href="#cb3-23" aria-hidden="true"></a>        <span class="kw">$query</span>-&gt;the_post<span class="ot">();</span></span>
<span id="cb3-24"><a href="#cb3-24" aria-hidden="true"></a>        <span class="kw">$output</span> .= <span class="st">&#39;&lt;li&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb3-25"><a href="#cb3-25" aria-hidden="true"></a>        <span class="kw">$output</span> .= <span class="st">&#39;&lt;a href=&quot;&#39;</span> . esc_url<span class="ot">(</span> get_permalink<span class="ot">()</span> <span class="ot">)</span> . <span class="st">&#39;&quot;&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb3-26"><a href="#cb3-26" aria-hidden="true"></a>        <span class="kw">$output</span> .= esc_html<span class="ot">(</span> get_the_title<span class="ot">()</span> <span class="ot">);</span></span>
<span id="cb3-27"><a href="#cb3-27" aria-hidden="true"></a>        <span class="kw">$output</span> .= <span class="st">&#39;&lt;/a&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb3-28"><a href="#cb3-28" aria-hidden="true"></a>        <span class="kw">$output</span> .= <span class="st">&#39;&lt;span class=&quot;post-date&quot;&gt; - &#39;</span> . esc_html<span class="ot">(</span> get_the_date<span class="ot">()</span> <span class="ot">)</span> . <span class="st">&#39;&lt;/span&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb3-29"><a href="#cb3-29" aria-hidden="true"></a>        <span class="kw">$output</span> .= <span class="st">&#39;&lt;/li&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb3-30"><a href="#cb3-30" aria-hidden="true"></a>    }</span>
<span id="cb3-31"><a href="#cb3-31" aria-hidden="true"></a></span>
<span id="cb3-32"><a href="#cb3-32" aria-hidden="true"></a>    <span class="kw">$output</span> .= <span class="st">&#39;&lt;/ul&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb3-33"><a href="#cb3-33" aria-hidden="true"></a>    <span class="kw">$output</span> .= <span class="st">&#39;&lt;/div&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb3-34"><a href="#cb3-34" aria-hidden="true"></a></span>
<span id="cb3-35"><a href="#cb3-35" aria-hidden="true"></a>    wp_reset_postdata<span class="ot">();</span></span>
<span id="cb3-36"><a href="#cb3-36" aria-hidden="true"></a></span>
<span id="cb3-37"><a href="#cb3-37" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$output</span><span class="ot">;</span></span>
<span id="cb3-38"><a href="#cb3-38" aria-hidden="true"></a>}</span></code></pre>
</div>
<p>Always sanitize attributes and escape output to prevent security vulnerabilities.</p>
<h2 id="editor-controls-and-preview">Editor Controls and Preview</h2>
<p>Create InspectorControls for block settings:</p>
<div class="sourceCode" id="cb4">
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true"></a><span class="im">import</span> { useBlockProps<span class="op">,</span> InspectorControls } <span class="im">from</span> <span class="st">&quot;@wordpress/block-editor&quot;</span><span class="op">;</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true"></a><span class="im">import</span> { PanelBody<span class="op">,</span> RangeControl<span class="op">,</span> SelectControl } <span class="im">from</span> <span class="st">&quot;@wordpress/components&quot;</span><span class="op">;</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true"></a><span class="im">import</span> ServerSideRender <span class="im">from</span> <span class="st">&quot;@wordpress/server-side-render&quot;</span><span class="op">;</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true"></a></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true"></a><span class="im">export</span> <span class="im">default</span> <span class="kw">function</span> <span class="fu">Edit</span>({ attributes<span class="op">,</span> setAttributes }) {</span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true"></a>    <span class="kw">const</span> { numberOfPosts<span class="op">,</span> postType } <span class="op">=</span> attributes<span class="op">;</span></span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true"></a></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true"></a>    <span class="cf">return</span> (</span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true"></a>        <span class="op">&lt;&gt;</span></span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true"></a>            <span class="op">&lt;</span>InspectorControls<span class="op">&gt;</span></span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true"></a>                <span class="op">&lt;</span>PanelBody title<span class="op">=</span><span class="st">&quot;Settings&quot;</span><span class="op">&gt;</span></span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true"></a>                    <span class="op">&lt;</span>RangeControl</span>
<span id="cb4-13"><a href="#cb4-13" aria-hidden="true"></a>                        label<span class="op">=</span><span class="st">&quot;Number of posts&quot;</span></span>
<span id="cb4-14"><a href="#cb4-14" aria-hidden="true"></a>                        value<span class="op">=</span>{numberOfPosts}</span>
<span id="cb4-15"><a href="#cb4-15" aria-hidden="true"></a>                        onChange<span class="op">=</span>{(value) <span class="kw">=&gt;</span> <span class="fu">setAttributes</span>({ <span class="dt">numberOfPosts</span><span class="op">:</span> value })}</span>
<span id="cb4-16"><a href="#cb4-16" aria-hidden="true"></a>                        min<span class="op">=</span>{<span class="dv">1</span>}</span>
<span id="cb4-17"><a href="#cb4-17" aria-hidden="true"></a>                        max<span class="op">=</span>{<span class="dv">20</span>}</span>
<span id="cb4-18"><a href="#cb4-18" aria-hidden="true"></a>                    <span class="op">/&gt;</span></span>
<span id="cb4-19"><a href="#cb4-19" aria-hidden="true"></a>                    <span class="op">&lt;</span>SelectControl</span>
<span id="cb4-20"><a href="#cb4-20" aria-hidden="true"></a>                        label<span class="op">=</span><span class="st">&quot;Post Type&quot;</span></span>
<span id="cb4-21"><a href="#cb4-21" aria-hidden="true"></a>                        value<span class="op">=</span>{postType}</span>
<span id="cb4-22"><a href="#cb4-22" aria-hidden="true"></a>                        options<span class="op">=</span>{[</span>
<span id="cb4-23"><a href="#cb4-23" aria-hidden="true"></a>                            { <span class="dt">label</span><span class="op">:</span> <span class="st">&quot;Posts&quot;</span><span class="op">,</span> <span class="dt">value</span><span class="op">:</span> <span class="st">&quot;post&quot;</span> }<span class="op">,</span></span>
<span id="cb4-24"><a href="#cb4-24" aria-hidden="true"></a>                            { <span class="dt">label</span><span class="op">:</span> <span class="st">&quot;Pages&quot;</span><span class="op">,</span> <span class="dt">value</span><span class="op">:</span> <span class="st">&quot;page&quot;</span> }</span>
<span id="cb4-25"><a href="#cb4-25" aria-hidden="true"></a>                        ]}</span>
<span id="cb4-26"><a href="#cb4-26" aria-hidden="true"></a>                        onChange<span class="op">=</span>{(value) <span class="kw">=&gt;</span> <span class="fu">setAttributes</span>({ <span class="dt">postType</span><span class="op">:</span> value })}</span>
<span id="cb4-27"><a href="#cb4-27" aria-hidden="true"></a>                    <span class="op">/&gt;</span></span>
<span id="cb4-28"><a href="#cb4-28" aria-hidden="true"></a>                <span class="op">&lt;/</span>PanelBody<span class="op">&gt;</span></span>
<span id="cb4-29"><a href="#cb4-29" aria-hidden="true"></a>            <span class="op">&lt;/</span>InspectorControls<span class="op">&gt;</span></span>
<span id="cb4-30"><a href="#cb4-30" aria-hidden="true"></a>            <span class="op">&lt;</span>div {<span class="op">...</span><span class="fu">useBlockProps</span>()}<span class="op">&gt;</span></span>
<span id="cb4-31"><a href="#cb4-31" aria-hidden="true"></a>                <span class="op">&lt;</span>ServerSideRender block<span class="op">=</span><span class="st">&quot;dprt/recent-posts&quot;</span> attributes<span class="op">=</span>{attributes} <span class="op">/&gt;</span></span>
<span id="cb4-32"><a href="#cb4-32" aria-hidden="true"></a>            <span class="op">&lt;/</span>div<span class="op">&gt;</span></span>
<span id="cb4-33"><a href="#cb4-33" aria-hidden="true"></a>        <span class="op">&lt;/&gt;</span></span>
<span id="cb4-34"><a href="#cb4-34" aria-hidden="true"></a>    )<span class="op">;</span></span>
<span id="cb4-35"><a href="#cb4-35" aria-hidden="true"></a>}</span></code></pre>
</div>
<p>ServerSideRender displays a live preview in the editor by calling your render callback via AJAX.</p>
<h2 id="performance-optimization-with-caching">Performance Optimization with Caching</h2>
<p>Dynamic blocks can impact performance. Implement caching for expensive operations:</p>
<div class="sourceCode" id="cb5">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true"></a><span class="kw">function</span> dprt_render_recent_posts_block<span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">,</span> <span class="kw">$content</span><span class="ot">,</span> <span class="kw">$block</span> <span class="ot">)</span> {</span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true"></a>    <span class="kw">$number_of_posts</span> = <span class="kw">isset</span><span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">[</span><span class="st">&#39;numberOfPosts&#39;</span><span class="ot">]</span> <span class="ot">)</span> <span class="ot">?</span> absint<span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">[</span><span class="st">&#39;numberOfPosts&#39;</span><span class="ot">]</span> <span class="ot">)</span> <span class="ot">:</span> <span class="dv">5</span><span class="ot">;</span></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true"></a></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true"></a>    <span class="co">// Create unique cache key based on attributes</span></span>
<span id="cb5-5"><a href="#cb5-5" aria-hidden="true"></a>    <span class="kw">$cache_key</span> = <span class="st">&#39;dprt_recent_posts_&#39;</span> . <span class="fu">md5</span><span class="ot">(</span> <span class="fu">serialize</span><span class="ot">(</span> <span class="kw">$attributes</span> <span class="ot">)</span> <span class="ot">);</span></span>
<span id="cb5-6"><a href="#cb5-6" aria-hidden="true"></a></span>
<span id="cb5-7"><a href="#cb5-7" aria-hidden="true"></a>    <span class="co">// Try to get cached result</span></span>
<span id="cb5-8"><a href="#cb5-8" aria-hidden="true"></a>    <span class="kw">$cached</span> = get_transient<span class="ot">(</span> <span class="kw">$cache_key</span> <span class="ot">);</span></span>
<span id="cb5-9"><a href="#cb5-9" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span> <span class="kw">false</span> !== <span class="kw">$cached</span> <span class="ot">)</span> {</span>
<span id="cb5-10"><a href="#cb5-10" aria-hidden="true"></a>        <span class="kw">return</span> <span class="kw">$cached</span><span class="ot">;</span></span>
<span id="cb5-11"><a href="#cb5-11" aria-hidden="true"></a>    }</span>
<span id="cb5-12"><a href="#cb5-12" aria-hidden="true"></a></span>
<span id="cb5-13"><a href="#cb5-13" aria-hidden="true"></a>    <span class="co">// Generate output (expensive operation)</span></span>
<span id="cb5-14"><a href="#cb5-14" aria-hidden="true"></a>    <span class="kw">$output</span> = dprt_generate_recent_posts_html<span class="ot">(</span> <span class="kw">$number_of_posts</span> <span class="ot">);</span></span>
<span id="cb5-15"><a href="#cb5-15" aria-hidden="true"></a></span>
<span id="cb5-16"><a href="#cb5-16" aria-hidden="true"></a>    <span class="co">// Cache for 1 hour</span></span>
<span id="cb5-17"><a href="#cb5-17" aria-hidden="true"></a>    set_transient<span class="ot">(</span> <span class="kw">$cache_key</span><span class="ot">,</span> <span class="kw">$output</span><span class="ot">,</span> <span class="kw">HOUR_IN_SECONDS</span> <span class="ot">);</span></span>
<span id="cb5-18"><a href="#cb5-18" aria-hidden="true"></a></span>
<span id="cb5-19"><a href="#cb5-19" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$output</span><span class="ot">;</span></span>
<span id="cb5-20"><a href="#cb5-20" aria-hidden="true"></a>}</span></code></pre>
</div>
<p>Clear the cache when content updates:</p>
<div class="sourceCode" id="cb6">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true"></a><span class="kw">function</span> dprt_clear_recent_posts_cache<span class="ot">(</span> <span class="kw">$post_id</span> <span class="ot">)</span> {</span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true"></a>    <span class="co">// Clear all recent posts caches</span></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true"></a>    <span class="kw">global</span> <span class="kw">$wpdb</span><span class="ot">;</span></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true"></a>    <span class="kw">$wpdb</span>-&gt;query<span class="ot">(</span> <span class="st">&quot;DELETE FROM </span><span class="kw">{$wpdb-&gt;options}</span><span class="st"> WHERE option_name LIKE &#39;_transient_dprt_recent_posts_%&#39;&quot;</span> <span class="ot">);</span></span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true"></a>}</span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true"></a>add_action<span class="ot">(</span> <span class="st">&#39;save_post&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt_clear_recent_posts_cache&#39;</span> <span class="ot">);</span></span></code></pre>
</div>
<h2 id="user-specific-content">User-Specific Content</h2>
<p>Display personalized content based on the logged-in user:</p>
<div class="sourceCode" id="cb7">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true"></a><span class="kw">function</span> dprt_render_user_dashboard_block<span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">,</span> <span class="kw">$content</span><span class="ot">,</span> <span class="kw">$block</span> <span class="ot">)</span> {</span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span> ! is_user_logged_in<span class="ot">()</span> <span class="ot">)</span> {</span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true"></a>        <span class="kw">return</span> <span class="st">&#39;&lt;p&gt;&#39;</span> . esc_html__<span class="ot">(</span> <span class="st">&#39;Please log in to view your dashboard.&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt&#39;</span> <span class="ot">)</span> . <span class="st">&#39;&lt;/p&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true"></a>    }</span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true"></a></span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true"></a>    <span class="kw">$current_user</span> = wp_get_current_user<span class="ot">();</span></span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true"></a>    <span class="kw">$user_posts</span> = count_user_posts<span class="ot">(</span> <span class="kw">$current_user</span>-&gt;<span class="kw">ID</span> <span class="ot">);</span></span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true"></a></span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true"></a>    <span class="kw">$output</span> = <span class="st">&#39;&lt;div class=&quot;user-dashboard&quot;&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true"></a>    <span class="kw">$output</span> .= <span class="st">&#39;&lt;h3&gt;&#39;</span> . <span class="fu">sprintf</span><span class="ot">(</span> esc_html__<span class="ot">(</span> <span class="st">&#39;Welcome, %s&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt&#39;</span> <span class="ot">),</span> esc_html<span class="ot">(</span> <span class="kw">$current_user</span>-&gt;display_name <span class="ot">)</span> <span class="ot">)</span> . <span class="st">&#39;&lt;/h3&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true"></a>    <span class="kw">$output</span> .= <span class="st">&#39;&lt;p&gt;&#39;</span> . <span class="fu">sprintf</span><span class="ot">(</span> esc_html__<span class="ot">(</span> <span class="st">&#39;You have published %d posts.&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt&#39;</span> <span class="ot">),</span> <span class="kw">$user_posts</span> <span class="ot">)</span> . <span class="st">&#39;&lt;/p&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb7-12"><a href="#cb7-12" aria-hidden="true"></a>    <span class="kw">$output</span> .= <span class="st">&#39;&lt;/div&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb7-13"><a href="#cb7-13" aria-hidden="true"></a></span>
<span id="cb7-14"><a href="#cb7-14" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$output</span><span class="ot">;</span></span>
<span id="cb7-15"><a href="#cb7-15" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="external-api-integration">External API Integration</h2>
<p>Fetch and display external data:</p>
<div class="sourceCode" id="cb8">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true"></a><span class="kw">function</span> dprt_render_weather_block<span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">,</span> <span class="kw">$content</span><span class="ot">,</span> <span class="kw">$block</span> <span class="ot">)</span> {</span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true"></a>    <span class="kw">$city</span> = <span class="kw">isset</span><span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">[</span><span class="st">&#39;city&#39;</span><span class="ot">]</span> <span class="ot">)</span> <span class="ot">?</span> sanitize_text_field<span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">[</span><span class="st">&#39;city&#39;</span><span class="ot">]</span> <span class="ot">)</span> <span class="ot">:</span> <span class="st">&#39;London&#39;</span><span class="ot">;</span></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true"></a>    <span class="kw">$cache_key</span> = <span class="st">&#39;dprt_weather_&#39;</span> . sanitize_title<span class="ot">(</span> <span class="kw">$city</span> <span class="ot">);</span></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true"></a></span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true"></a>    <span class="kw">$weather_data</span> = get_transient<span class="ot">(</span> <span class="kw">$cache_key</span> <span class="ot">);</span></span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true"></a></span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span> <span class="kw">false</span> === <span class="kw">$weather_data</span> <span class="ot">)</span> {</span>
<span id="cb8-8"><a href="#cb8-8" aria-hidden="true"></a>        <span class="kw">$api_url</span> = <span class="st">&#39;https://api.weatherapi.com/v1/current.json?key=YOUR_KEY&amp;q=&#39;</span> . <span class="fu">urlencode</span><span class="ot">(</span> <span class="kw">$city</span> <span class="ot">);</span></span>
<span id="cb8-9"><a href="#cb8-9" aria-hidden="true"></a>        <span class="kw">$response</span> = wp_remote_get<span class="ot">(</span> <span class="kw">$api_url</span> <span class="ot">);</span></span>
<span id="cb8-10"><a href="#cb8-10" aria-hidden="true"></a></span>
<span id="cb8-11"><a href="#cb8-11" aria-hidden="true"></a>        <span class="kw">if</span> <span class="ot">(</span> is_wp_error<span class="ot">(</span> <span class="kw">$response</span> <span class="ot">)</span> <span class="ot">)</span> {</span>
<span id="cb8-12"><a href="#cb8-12" aria-hidden="true"></a>            <span class="kw">return</span> <span class="st">&#39;&lt;p&gt;&#39;</span> . esc_html__<span class="ot">(</span> <span class="st">&#39;Unable to fetch weather data.&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt&#39;</span> <span class="ot">)</span> . <span class="st">&#39;&lt;/p&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb8-13"><a href="#cb8-13" aria-hidden="true"></a>        }</span>
<span id="cb8-14"><a href="#cb8-14" aria-hidden="true"></a></span>
<span id="cb8-15"><a href="#cb8-15" aria-hidden="true"></a>        <span class="kw">$weather_data</span> = <span class="fu">json_decode</span><span class="ot">(</span> wp_remote_retrieve_body<span class="ot">(</span> <span class="kw">$response</span> <span class="ot">),</span> <span class="kw">true</span> <span class="ot">);</span></span>
<span id="cb8-16"><a href="#cb8-16" aria-hidden="true"></a>        set_transient<span class="ot">(</span> <span class="kw">$cache_key</span><span class="ot">,</span> <span class="kw">$weather_data</span><span class="ot">,</span> <span class="dv">30</span> * <span class="kw">MINUTE_IN_SECONDS</span> <span class="ot">);</span></span>
<span id="cb8-17"><a href="#cb8-17" aria-hidden="true"></a>    }</span>
<span id="cb8-18"><a href="#cb8-18" aria-hidden="true"></a></span>
<span id="cb8-19"><a href="#cb8-19" aria-hidden="true"></a>    <span class="kw">$temp</span> = <span class="kw">isset</span><span class="ot">(</span> <span class="kw">$weather_data</span><span class="ot">[</span><span class="st">&#39;current&#39;</span><span class="ot">][</span><span class="st">&#39;temp_c&#39;</span><span class="ot">]</span> <span class="ot">)</span> <span class="ot">?</span> <span class="kw">$weather_data</span><span class="ot">[</span><span class="st">&#39;current&#39;</span><span class="ot">][</span><span class="st">&#39;temp_c&#39;</span><span class="ot">]</span> <span class="ot">:</span> <span class="st">&#39;N/A&#39;</span><span class="ot">;</span></span>
<span id="cb8-20"><a href="#cb8-20" aria-hidden="true"></a></span>
<span id="cb8-21"><a href="#cb8-21" aria-hidden="true"></a>    <span class="kw">return</span> <span class="st">&#39;&lt;div class=&quot;weather-block&quot;&gt;&#39;</span> .</span>
<span id="cb8-22"><a href="#cb8-22" aria-hidden="true"></a>           <span class="st">&#39;&lt;p&gt;&#39;</span> . esc_html<span class="ot">(</span> <span class="kw">$city</span> <span class="ot">)</span> . <span class="st">&#39;: &#39;</span> . esc_html<span class="ot">(</span> <span class="kw">$temp</span> <span class="ot">)</span> . <span class="st">&#39;°C&lt;/p&gt;&#39;</span> .</span>
<span id="cb8-23"><a href="#cb8-23" aria-hidden="true"></a>           <span class="st">&#39;&lt;/div&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb8-24"><a href="#cb8-24" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="error-handling">Error Handling</h2>
<p>Implement robust error handling:</p>
<div class="sourceCode" id="cb9">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true"></a><span class="kw">function</span> dprt_render_dynamic_block<span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">,</span> <span class="kw">$content</span><span class="ot">,</span> <span class="kw">$block</span> <span class="ot">)</span> {</span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true"></a>    <span class="kw">try</span> {</span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true"></a>        <span class="co">// Validate attributes</span></span>
<span id="cb9-4"><a href="#cb9-4" aria-hidden="true"></a>        <span class="kw">if</span> <span class="ot">(</span> ! <span class="kw">isset</span><span class="ot">(</span> <span class="kw">$attributes</span><span class="ot">[</span><span class="st">&#39;requiredField&#39;</span><span class="ot">]</span> <span class="ot">)</span> <span class="ot">)</span> {</span>
<span id="cb9-5"><a href="#cb9-5" aria-hidden="true"></a>            <span class="kw">throw</span> <span class="kw">new</span> <span class="kw">Exception</span><span class="ot">(</span> <span class="st">&#39;Required field missing&#39;</span> <span class="ot">);</span></span>
<span id="cb9-6"><a href="#cb9-6" aria-hidden="true"></a>        }</span>
<span id="cb9-7"><a href="#cb9-7" aria-hidden="true"></a></span>
<span id="cb9-8"><a href="#cb9-8" aria-hidden="true"></a>        <span class="co">// Attempt operation</span></span>
<span id="cb9-9"><a href="#cb9-9" aria-hidden="true"></a>        <span class="kw">$result</span> = dprt_perform_operation<span class="ot">(</span> <span class="kw">$attributes</span> <span class="ot">);</span></span>
<span id="cb9-10"><a href="#cb9-10" aria-hidden="true"></a></span>
<span id="cb9-11"><a href="#cb9-11" aria-hidden="true"></a>        <span class="kw">if</span> <span class="ot">(</span> <span class="kw">false</span> === <span class="kw">$result</span> <span class="ot">)</span> {</span>
<span id="cb9-12"><a href="#cb9-12" aria-hidden="true"></a>            <span class="kw">throw</span> <span class="kw">new</span> <span class="kw">Exception</span><span class="ot">(</span> <span class="st">&#39;Operation failed&#39;</span> <span class="ot">);</span></span>
<span id="cb9-13"><a href="#cb9-13" aria-hidden="true"></a>        }</span>
<span id="cb9-14"><a href="#cb9-14" aria-hidden="true"></a></span>
<span id="cb9-15"><a href="#cb9-15" aria-hidden="true"></a>        <span class="kw">return</span> <span class="kw">$result</span><span class="ot">;</span></span>
<span id="cb9-16"><a href="#cb9-16" aria-hidden="true"></a>    } <span class="kw">catch</span> <span class="ot">(</span> <span class="kw">Exception</span> <span class="kw">$e</span> <span class="ot">)</span> {</span>
<span id="cb9-17"><a href="#cb9-17" aria-hidden="true"></a>        <span class="co">// Log error</span></span>
<span id="cb9-18"><a href="#cb9-18" aria-hidden="true"></a>        <span class="fu">error_log</span><span class="ot">(</span> <span class="st">&#39;Dynamic block error: &#39;</span> . <span class="kw">$e</span>-&gt;getMessage<span class="ot">()</span> <span class="ot">);</span></span>
<span id="cb9-19"><a href="#cb9-19" aria-hidden="true"></a></span>
<span id="cb9-20"><a href="#cb9-20" aria-hidden="true"></a>        <span class="co">// Return user-friendly message</span></span>
<span id="cb9-21"><a href="#cb9-21" aria-hidden="true"></a>        <span class="kw">return</span> <span class="st">&#39;&lt;p class=&quot;block-error&quot;&gt;&#39;</span> . esc_html__<span class="ot">(</span> <span class="st">&#39;Content temporarily unavailable.&#39;</span><span class="ot">,</span> <span class="st">&#39;dprt&#39;</span> <span class="ot">)</span> . <span class="st">&#39;&lt;/p&gt;&#39;</span><span class="ot">;</span></span>
<span id="cb9-22"><a href="#cb9-22" aria-hidden="true"></a>    }</span>
<span id="cb9-23"><a href="#cb9-23" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="conclusion">Conclusion</h2>
<p>Dynamic blocks combine Gutenberg’s user-friendly interface with PHP’s server-side power. Use them for real-time data, personalization, and database queries. Implement caching for performance, validate all inputs, escape all outputs, and handle errors gracefully. Start with simple dynamic blocks and gradually build more complex functionality as you master the concepts.</p>
<h2 id="external-links">External Links</h2>
<ol type="1">
<li><a href="https://developer.wordpress.org/block-editor/how-to-guides/block-tutorial/creating-dynamic-blocks/">Dynamic Blocks Documentation</a></li>
<li><a href="https://developer.wordpress.org/reference/functions/register_block_type/">register_block_type() Reference</a></li>
<li><a href="https://developer.wordpress.org/block-editor/reference-guides/components/server-side-render/">ServerSideRender Component</a></li>
<li><a href="https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/">Block Metadata (block.json)</a></li>
<li><a href="https://developer.wordpress.org/reference/classes/wp_query/">WordPress Query Functions</a></li>
</ol>
<h2 id="call-to-action">Call to Action</h2>
<p>Streamline your workflow! <a href="https://blocknavigatorplugin.com/#pricing">Block Editor Navigator Pro</a> provides instant block navigation, search, and organization. Find any block in seconds—try it free!</p>
<p>The post <a href="https://developryplugins.com/how-to-build-dynamic-blocks-with-wordpress-block-editor/">How to Build Dynamic Blocks with WordPress Block Editor</a> appeared first on <a href="https://developryplugins.com">Developry Plugins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
