<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Riad Hasan</title>
    <description>The latest articles on DEV Community by Riad Hasan (@riadhasan11).</description>
    <link>https://dev.to/riadhasan11</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3760099%2F437eeee4-56f5-4019-bb15-4893059dd87b.jpg</url>
      <title>DEV Community: Riad Hasan</title>
      <link>https://dev.to/riadhasan11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/riadhasan11"/>
    <language>en</language>
    <item>
      <title>Optimize Laravel Performance: Database, Caching, and Queues</title>
      <dc:creator>Riad Hasan</dc:creator>
      <pubDate>Sat, 09 May 2026 21:49:55 +0000</pubDate>
      <link>https://dev.to/riadhasan11/optimize-laravel-performance-database-caching-and-queues-4509</link>
      <guid>https://dev.to/riadhasan11/optimize-laravel-performance-database-caching-and-queues-4509</guid>
      <description>&lt;p&gt;Slow Laravel applications lose users and revenue. This guide covers practical performance optimization techniques that work in production — from database queries to caching strategies to queue management.&lt;/p&gt;

&lt;p&gt;I'm &lt;strong&gt;Riad Hasan&lt;/strong&gt;, a full stack developer who has optimized Laravel applications handling millions of requests. Here are the techniques that actually make a difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Performance Problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; identifies these common bottlenecks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;N+1 queries&lt;/td&gt;
&lt;td&gt;100x slower page loads&lt;/td&gt;
&lt;td&gt;Eager loading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No caching&lt;/td&gt;
&lt;td&gt;Repeated expensive operations&lt;/td&gt;
&lt;td&gt;Redis caching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Synchronous heavy tasks&lt;/td&gt;
&lt;td&gt;Request timeouts&lt;/td&gt;
&lt;td&gt;Queue workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unoptimized indexes&lt;/td&gt;
&lt;td&gt;Slow database queries&lt;/td&gt;
&lt;td&gt;Proper indexing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large payloads&lt;/td&gt;
&lt;td&gt;Memory exhaustion&lt;/td&gt;
&lt;td&gt;Pagination&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Part 1: Database Query Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Detect N+1 Problems
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; uses Laravel Debugbar to identify N+1 queries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bad: N+1 query problem&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Queries database for each post&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Good: Eager loading&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'author'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// No additional queries&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Eager Loading Multiple Relationships
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Load multiple relationships efficiently&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'author'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'tags'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'comments.user'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Constraint Eager Loading
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; constrains eager loads to reduce data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Only load published comments&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'comments'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'approved'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Select Only Required Columns
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bad: Loads all columns including heavy content&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Good: Select only what you need&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'slug'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'published_at'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Chunk Large Datasets
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; processes large datasets in chunks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Process 100 records at a time&lt;/span&gt;
&lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Process each post&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Or use lazy collections for memory efficiency&lt;/span&gt;
&lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;lazy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Process one at a time&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 2: Database Indexing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Identify Missing Indexes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Check slow queries&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slow_log&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;query_time&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Or use Laravel's query log&lt;/span&gt;
&lt;span class="n"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;enableQueryLog&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Run&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getQueryLog&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Indexes via Migrations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; adds indexes strategically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Migration for adding indexes&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Single column index&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'published_at'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Composite index for common queries&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'published_at'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="c1"&gt;// Unique index&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'slug'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Full-text index for search&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fullText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'content'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Index Strategy
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query Type&lt;/th&gt;
&lt;th&gt;Index Strategy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WHERE column = value&lt;/td&gt;
&lt;td&gt;Single column index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WHERE a = x AND b = y&lt;/td&gt;
&lt;td&gt;Composite index (a, b)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ORDER BY column&lt;/td&gt;
&lt;td&gt;Index on column&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JOIN ON column&lt;/td&gt;
&lt;td&gt;Index on foreign key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LIKE '%term%'&lt;/td&gt;
&lt;td&gt;Full-text index&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Part 3: Caching Strategies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Caching
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; implements caching at multiple levels:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Cache query results&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts.featured'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'author'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'featured'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'views'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'desc'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Cache with tags for easy clearing&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'featured'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'posts.featured'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'featured'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Clear cached posts when updated&lt;/span&gt;
&lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cache User-Specific Data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Cache per user&lt;/span&gt;
&lt;span class="nv"&gt;$notifications&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"user.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.notifications"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Notification&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unread&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cache Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; configures Redis for caching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# .env
CACHE_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config/cache.php&lt;/span&gt;
&lt;span class="s1"&gt;'redis'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'driver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'redis'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'connection'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'cache'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'lock_connection'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  HTTP Caching
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Route middleware for HTTP caching&lt;/span&gt;
&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/api/posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Cache-Control'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'public, max-age=3600'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setEtag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cache.headers:public;max_age=3600;etag'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 4: Queue Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Offload Heavy Tasks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; moves heavy processing to queues:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bad: Synchronous processing&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validated&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="c1"&gt;// Slow operations block response&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;sendEmailNotifications&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;postToSocialMedia&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;generatePdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;updateSearchIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Good: Queue heavy tasks&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validated&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="c1"&gt;// Dispatch to queue&lt;/span&gt;
    &lt;span class="nc"&gt;ProcessPostCreated&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Job Implementation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/Jobs/ProcessPostCreated.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProcessPostCreated&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ShouldQueue&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Dispatchable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;InteractsWithQueue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Queueable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;SerializesModels&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$tries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$maxExceptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Post&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kt"&gt;EmailService&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;SocialService&lt;/span&gt; &lt;span class="nv"&gt;$social&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;SearchService&lt;/span&gt; &lt;span class="nv"&gt;$search&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;sendNotifications&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$social&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;share&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$search&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Throwable&lt;/span&gt; &lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Post processing failed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'post_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'error'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Queue Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config/queue.php&lt;/span&gt;
&lt;span class="s1"&gt;'connections'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'redis'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'driver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'redis'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'connection'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'queue'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'REDIS_QUEUE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'retry_after'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'block_for'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Queue Workers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; runs queue workers with Supervisor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/supervisor/conf.d/laravel-worker.conf
&lt;/span&gt;&lt;span class="nn"&gt;[program:laravel-worker]&lt;/span&gt;
&lt;span class="py"&gt;process_name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;%(program_name)s_%(process_num)02d&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;php /var/www/app/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600&lt;/span&gt;
&lt;span class="py"&gt;autostart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;autorestart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;stopasgroup&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;killasgroup&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;user&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;www-data&lt;/span&gt;
&lt;span class="py"&gt;numprocs&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;span class="py"&gt;redirect_stderr&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;stdout_logfile&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/www/app/storage/logs/worker.log&lt;/span&gt;
&lt;span class="py"&gt;stopwaitsecs&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;3600&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 5: Response Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  API Resource Collections
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/Http/Resources/PostResource.php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PostResource&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;JsonResource&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'title'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'slug'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'author'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;whenLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'author'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="s1"&gt;'created_at'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Controller&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'author'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;PostResource&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pagination
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; always paginates large datasets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simple pagination (faster, no count query)&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;simplePaginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Standard pagination (with total count)&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Cursor pagination (for infinite scroll)&lt;/span&gt;
&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;cursorPaginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Response Compression
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Enable compression middleware&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gzip'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getEncodings&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;gzencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Encoding'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'gzip'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 6: Configuration Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Optimize Composer Autoloader
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--optimize-autoloader&lt;/span&gt; &lt;span class="nt"&gt;--no-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Laravel Optimization Commands
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; runs these in production:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Cache configuration&lt;/span&gt;
php artisan config:cache

&lt;span class="c"&gt;# Cache routes&lt;/span&gt;
php artisan route:cache

&lt;span class="c"&gt;# Cache views&lt;/span&gt;
php artisan view:cache

&lt;span class="c"&gt;# Cache events&lt;/span&gt;
php artisan event:cache

&lt;span class="c"&gt;# Optimize application&lt;/span&gt;
php artisan optimize
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Environment Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# .env (production)
APP_ENV=production
APP_DEBUG=false
APP_URL=https://yourdomain.com

# Database
DB_PERSISTENT=true

# Cache and session
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis

# Octane for high performance (optional)
# OCTANE_SERVER=swoole
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 7: Monitoring and Debugging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Query Monitoring
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; monitors queries in development:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// AppServiceProvider.php&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'app.debug'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Log slow queries (&amp;gt;100ms)&lt;/span&gt;
                &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Slow query'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="s1"&gt;'sql'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'bindings'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bindings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'time'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance Metrics
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Measure execution time&lt;/span&gt;
&lt;span class="nv"&gt;$startTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Your code here&lt;/span&gt;

&lt;span class="nv"&gt;$endTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;microtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$executionTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$endTime&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$startTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Execution time'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'operation'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'post_import'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'time_ms'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$executionTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Debugging Tools
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Laravel Debugbar&lt;/td&gt;
&lt;td&gt;Query analysis, timeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telescope&lt;/td&gt;
&lt;td&gt;Request monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sentry&lt;/td&gt;
&lt;td&gt;Error tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blackfire&lt;/td&gt;
&lt;td&gt;Profiling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New Relic&lt;/td&gt;
&lt;td&gt;APM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; verifies these before deployment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Eager loading implemented&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database indexes added&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis caching enabled&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heavy tasks queued&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pagination applied&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config/routes cached&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debug mode disabled&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring configured&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Benchmark Results
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; measured improvements after optimization:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Average response time&lt;/td&gt;
&lt;td&gt;850ms&lt;/td&gt;
&lt;td&gt;120ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database queries per page&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory usage&lt;/td&gt;
&lt;td&gt;256MB&lt;/td&gt;
&lt;td&gt;64MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requests per second&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to first byte&lt;/td&gt;
&lt;td&gt;420ms&lt;/td&gt;
&lt;td&gt;45ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Laravel performance optimization requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Eager loading to prevent N+1 queries&lt;/li&gt;
&lt;li&gt;✅ Database indexing for fast lookups&lt;/li&gt;
&lt;li&gt;✅ Redis caching for expensive operations&lt;/li&gt;
&lt;li&gt;✅ Queue workers for heavy tasks&lt;/li&gt;
&lt;li&gt;✅ Pagination for large datasets&lt;/li&gt;
&lt;li&gt;✅ Configuration caching in production&lt;/li&gt;
&lt;li&gt;✅ Monitoring for continuous improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; has optimized Laravel applications serving millions of requests daily. You can explore these projects at &lt;a href="https://riadhasan.io" rel="noopener noreferrer"&gt;Riad Hasan&lt;/a&gt; or view specific implementations at &lt;a href="https://riadhasan.io/projects" rel="noopener noreferrer"&gt;Projects by Riad Hasan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more Laravel tutorials from &lt;strong&gt;Riad Hasan&lt;/strong&gt;, follow on &lt;a href="https://riad-hasan.hashnode.dev" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt; or &lt;a href="https://dev.to/riadhasan"&gt;Dev.to&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions about Laravel performance? Drop them in the comments below.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  laravel #php #performance #optimization #webdev #tutorial #database #caching
&lt;/h1&gt;

</description>
      <category>riadhasan</category>
      <category>laravel</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Build a Headless WordPress Site with Next.js and React - A Guide By Riad Hasan</title>
      <dc:creator>Riad Hasan</dc:creator>
      <pubDate>Sat, 09 May 2026 21:37:39 +0000</pubDate>
      <link>https://dev.to/riadhasan11/build-a-headless-wordpress-site-with-nextjs-and-react-a-guide-by-riad-hasan-54l5</link>
      <guid>https://dev.to/riadhasan11/build-a-headless-wordpress-site-with-nextjs-and-react-a-guide-by-riad-hasan-54l5</guid>
      <description>&lt;h1&gt;
  
  
  Build a Headless WordPress Site with Next.js and React
&lt;/h1&gt;

&lt;p&gt;Headless WordPress architecture separates your content management from your frontend presentation. This approach delivers faster page loads, better SEO control, and modern user experiences. This guide shows you how to build a production-ready headless WordPress site.&lt;/p&gt;

&lt;p&gt;I'm &lt;strong&gt;Riad Hasan&lt;/strong&gt;, a full stack developer who has built multiple headless WordPress sites for clients. Here's the implementation approach that works reliably.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Go Headless?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; chooses headless architecture for these benefits:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional WordPress&lt;/th&gt;
&lt;th&gt;Headless WordPress&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP renders pages&lt;/td&gt;
&lt;td&gt;React/Next.js renders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Theme-dependent&lt;/td&gt;
&lt;td&gt;Complete design freedom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slower page loads&lt;/td&gt;
&lt;td&gt;10x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limited API access&lt;/td&gt;
&lt;td&gt;Full REST API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugin conflicts&lt;/td&gt;
&lt;td&gt;Decoupled, stable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The structure &lt;strong&gt;Riad Hasan&lt;/strong&gt; uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WordPress (CMS) → REST API → Next.js Frontend → CDN → Users
     ↓
  Content Management Only
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Components:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WordPress for content management&lt;/li&gt;
&lt;li&gt;Custom REST API endpoints&lt;/li&gt;
&lt;li&gt;Next.js for frontend&lt;/li&gt;
&lt;li&gt;ISR (Incremental Static Regeneration)&lt;/li&gt;
&lt;li&gt;CDN for global delivery&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Configure WordPress as Headless
&lt;/h2&gt;

&lt;p&gt;Install required plugins:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WPGraphQL&lt;/td&gt;
&lt;td&gt;GraphQL API (optional alternative to REST)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom Post Type UI&lt;/td&gt;
&lt;td&gt;Custom content types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advanced Custom Fields&lt;/td&gt;
&lt;td&gt;Custom fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JWT Authentication&lt;/td&gt;
&lt;td&gt;API authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Create custom REST endpoints that &lt;strong&gt;Riad Hasan&lt;/strong&gt; uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// functions.php or custom plugin&lt;/span&gt;
&lt;span class="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'rest_api_init'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;register_rest_route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'api/v1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'methods'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'get_posts_api'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'permission_callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'__return_true'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="nf"&gt;register_rest_route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'api/v1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/post/(?P&amp;lt;slug&amp;gt;[a-zA-Z0-9-]+)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'methods'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'get_post_by_slug'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'permission_callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'__return_true'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;get_posts_api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'post_type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'post'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'posts_per_page'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'post_status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'publish'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'title'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'slug'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'excerpt'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;wp_trim_words&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'featured_image'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;get_the_post_thumbnail_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'large'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'date'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;get_the_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'author'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;get_the_author_meta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'display_name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post_author&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;rest_ensure_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;get_post_by_slug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'slug'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nv"&gt;$post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_page_by_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;OBJECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'post'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WP_Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'not_found'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Post not found'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'title'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'slug'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'content'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;apply_filters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'the_content'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post_content&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'featured_image'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;get_the_post_thumbnail_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'full'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'date'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;get_the_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'author'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;get_the_author_meta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'display_name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post_author&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'meta'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;get_post_meta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;rest_ensure_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Set Up Next.js Project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-next-app@latest headless-wp
&lt;span class="nb"&gt;cd &lt;/span&gt;headless-wp
npm &lt;span class="nb"&gt;install &lt;/span&gt;axios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# .env.local
NEXT_PUBLIC_WP_API_URL=https://your-wp-site.com/wp-json
NEXT_PUBLIC_SITE_URL=https://your-frontend.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Create API Service Layer
&lt;/h2&gt;

&lt;p&gt;Here's the API service &lt;strong&gt;Riad Hasan&lt;/strong&gt; implements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/wp-api.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WP_API&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_WP_API_URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;excerpt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getPosts&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;WP_API&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/posts`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getPostBySlug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;WP_API&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/post/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getAllPostSlugs&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getPosts&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4: Build Pages with ISR
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; uses Incremental Static Regeneration for optimal performance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/blog/page.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getPosts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/lib/wp-api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/link&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;revalidate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Revalidate every hour&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;BlogPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getPosts&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;container mx-auto px-4 py-12&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-4xl font-bold mb-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Blog&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grid md:grid-cols-2 lg:grid-cols-3 gap-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;border rounded-lg overflow-hidden&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured_image&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; 
                &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
                &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-full h-48 object-cover&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
              &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;)}&lt;/span&gt;

            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p-4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-sm text-gray-500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toLocaleDateString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;
              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/time&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-xl font-semibold mt-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hover:text-blue-600&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mt-2 text-gray-600&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;excerpt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mt-2 text-sm text-gray-500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nx"&gt;By&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/article&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;))}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Dynamic Post Pages
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/blog/[slug]/page.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getPostBySlug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getAllPostSlugs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/lib/wp-api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;notFound&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/navigation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;revalidate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateStaticParams&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;slugs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getAllPostSlugs&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;slugs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;slug&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PostPage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
  &lt;span class="nx"&gt;params&lt;/span&gt; 
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="nl"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getPostBySlug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;container mx-auto px-4 py-12 max-w-3xl&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mb-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-gray-500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toLocaleDateString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/time&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-4xl font-bold mt-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mt-2 text-gray-600&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;By&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/header&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured_image&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; 
            &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
            &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-full h-96 object-cover rounded-lg mb-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)}&lt;/span&gt;

        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; 
          &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prose prose-lg max-w-none&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="nx"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
        &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/article&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;notFound&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 6: Add SEO with Metadata
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; implements comprehensive SEO:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/blog/[slug]/page.tsx (add to top)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Metadata&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateMetadata&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
  &lt;span class="nx"&gt;params&lt;/span&gt; 
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="nl"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Metadata&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getPostBySlug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;excerpt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;openGraph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;excerpt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured_image&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;article&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;publishedTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;twitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;summary_large_image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;excerpt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured_image&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 7: Add Caching Layer
&lt;/h2&gt;

&lt;p&gt;For optimal performance, &lt;strong&gt;Riad Hasan&lt;/strong&gt; adds caching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/cache.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Redis&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@upstash/redis&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEnv&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;cachedFetch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;fetcher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetcher&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage in wp-api.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getPosts&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;cachedFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wp:posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;WP_API&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/posts`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 8: Handle Preview Mode
&lt;/h2&gt;

&lt;p&gt;For content previews, &lt;strong&gt;Riad Hasan&lt;/strong&gt; implements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/preview/route.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;slug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Verify secret&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PREVIEW_SECRET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Enable preview mode&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;__prerender_bypass&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PREVIEW_SECRET&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;httpOnly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;sameSite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 9: Deploy Configuration
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; uses this &lt;code&gt;next.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** @type {import('next').NextConfig} */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;domains&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-wp-site.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;remotePatterns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**.wp.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/:path*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-DNS-Prefetch-Control&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;on&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-Frame-Options&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SAMEORIGIN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Performance Comparison
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; measured these improvements:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Traditional WP&lt;/th&gt;
&lt;th&gt;Headless WP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;First Contentful Paint&lt;/td&gt;
&lt;td&gt;2.5s&lt;/td&gt;
&lt;td&gt;0.8s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Largest Contentful Paint&lt;/td&gt;
&lt;td&gt;4.2s&lt;/td&gt;
&lt;td&gt;1.2s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to Interactive&lt;/td&gt;
&lt;td&gt;5.1s&lt;/td&gt;
&lt;td&gt;1.5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lighthouse Score&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  When to Use Headless
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; recommends headless when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Performance is critical&lt;/li&gt;
&lt;li&gt;✅ Custom frontend needed&lt;/li&gt;
&lt;li&gt;✅ Multiple frontends (web + app)&lt;/li&gt;
&lt;li&gt;✅ Developer team available&lt;/li&gt;
&lt;li&gt;✅ Content editors separate from developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stick with traditional WordPress when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Simple brochure site&lt;/li&gt;
&lt;li&gt;❌ Non-technical team only&lt;/li&gt;
&lt;li&gt;❌ Budget constraints&lt;/li&gt;
&lt;li&gt;❌ Need WYSIWYG page builders&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Building headless WordPress requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ WordPress REST API configuration&lt;/li&gt;
&lt;li&gt;✅ Next.js frontend with ISR&lt;/li&gt;
&lt;li&gt;✅ Caching for performance&lt;/li&gt;
&lt;li&gt;✅ SEO metadata implementation&lt;/li&gt;
&lt;li&gt;✅ Preview mode for editors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Riad Hasan&lt;/strong&gt; has implemented headless WordPress architecture for e-commerce, publishing, and business websites. You can explore these projects at &lt;a href="https://riadhasan.io" rel="noopener noreferrer"&gt;Riad Hasan&lt;/a&gt; or view specific implementations at &lt;a href="https://riadhasan.io/projects" rel="noopener noreferrer"&gt;Projects by Riad Hasan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more web development tutorials from &lt;strong&gt;Riad Hasan&lt;/strong&gt;, follow on &lt;a href="https://riad-hasan.hashnode.dev" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt; or &lt;a href="https://dev.to/riadhasan"&gt;Dev.to&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions about headless WordPress? Drop them in the comments below.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  wordpress #headless #nextjs #react #webdev #tutorial #webdevelopment #javascript
&lt;/h1&gt;

</description>
      <category>riadhasan</category>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>Who is Riad Hasan? The Full Stack Developer Behind the Code</title>
      <dc:creator>Riad Hasan</dc:creator>
      <pubDate>Mon, 04 May 2026 00:48:48 +0000</pubDate>
      <link>https://dev.to/riadhasan11/who-is-riad-hasan-the-full-stack-developer-behind-the-code-3n7l</link>
      <guid>https://dev.to/riadhasan11/who-is-riad-hasan-the-full-stack-developer-behind-the-code-3n7l</guid>
      <description>&lt;p&gt;Riad Hasan is a name that appears in search results alongside a singer. But there's another Riad Hasan — a full stack developer who has spent over five years building web applications for clients worldwide.&lt;/p&gt;

&lt;p&gt;This article answers the question: Who is Riad Hasan, the developer?&lt;br&gt;
Quick Facts About Riad Hasan&lt;br&gt;
Attribute   Details&lt;br&gt;
Full Name   Riad Hasan&lt;br&gt;
Profession  Full Stack Web Developer&lt;br&gt;
Experience  5+ years&lt;br&gt;
Location    Bangladesh&lt;br&gt;
Specialization  Laravel, React, WordPress&lt;br&gt;
Portfolio   riadhasan.io&lt;br&gt;
Email   &lt;a href="mailto:hire.riadhasan@gmail.com"&gt;hire.riadhasan@gmail.com&lt;/a&gt;&lt;br&gt;
The Story of Riad Hasan&lt;br&gt;
Background&lt;/p&gt;

&lt;p&gt;Riad Hasan grew up in Bangladesh with a fascination for technology. While peers played video games, he wondered how they were built. This curiosity led to a computer science degree and, eventually, a career in web development.&lt;br&gt;
Career Beginnings&lt;/p&gt;

&lt;p&gt;The first year was humbling. Riad Hasan built WordPress sites for local businesses, earning $200-500 per project. Each project taught lessons that no tutorial could:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Clients don't care about clean code — they care about results

Communication is more important than technical brilliance

Deadlines are promises, not suggestions

Documentation is a gift to your future self
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The Evolution&lt;/p&gt;

&lt;p&gt;Year 1-2: WordPress and PHP fundamentals Year 3: Laravel backend development, React frontend Year 4: Performance optimization, headless architecture Year 5: System design, team collaboration, product thinking&lt;br&gt;
What Riad Hasan Does&lt;br&gt;
Core Services&lt;/p&gt;

&lt;p&gt;Riad Hasan offers comprehensive web development services:&lt;br&gt;
Service     Description&lt;br&gt;
Laravel Development     Custom backends, APIs, admin panels&lt;br&gt;
React Development   SPAs, dashboards, interactive UIs&lt;br&gt;
WordPress Development   Custom themes, plugins, WooCommerce&lt;br&gt;
Headless CMS    Decoupled architectures with Next.js&lt;br&gt;
Performance Optimization    Core Web Vitals, caching, CDN&lt;br&gt;
Technical Consultation  Architecture review, code audits&lt;br&gt;
Industries Served&lt;/p&gt;

&lt;p&gt;Riad Hasan has worked across diverse sectors:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E-commerce — Fashion, electronics, specialty retail

Healthcare — Medical portfolios, appointment systems

SaaS — AI tools, productivity platforms

Education — Learning platforms, course systems

Finance — Booking systems, client portals

Media — Publishing platforms, content sites
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Riad Hasan's Technical Philosophy&lt;br&gt;
Code Quality Standards&lt;/p&gt;

&lt;p&gt;Riad Hasan follows non-negotiable standards:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Readability First — Code is read more than written

Test What Matters — Critical paths always have tests

Document Decisions — Future developers need context

Security Built-In — Never an afterthought

Performance by Default — Fast is a feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Architecture Principles&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I don't start coding until I understand the data flow," Riad Hasan explains.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;His architecture approach:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Start with data models

Design APIs before implementation

Plan for 10x scale

Build for maintainability

Document the "why"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Technology Choices&lt;/p&gt;

&lt;p&gt;Riad Hasan chooses technologies based on:&lt;br&gt;
Factor  Weight&lt;br&gt;
Project requirements    40%&lt;br&gt;
Team familiarity    20%&lt;br&gt;
Long-term maintainability   20%&lt;br&gt;
Community support   10%&lt;br&gt;
Performance     10%&lt;br&gt;
Notable Projects by Riad Hasan&lt;br&gt;
Wooverse&lt;/p&gt;

&lt;p&gt;Type: Headless E-commerce Stack: WordPress, WooCommerce, Next.js Impact: Handles 50,000+ products, sub-second loads&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Riad Hasan transformed our sluggish WooCommerce site into a high-performance store," the client reports.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Doctor's Portfolio&lt;/p&gt;

&lt;p&gt;Type: Medical Platform Stack: React, Laravel, MySQL Impact: 3,000+ monthly appointments managed&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"The booking system Riad Hasan built reduced our scheduling errors by 90%."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;NexaPro AI SaaS&lt;/p&gt;

&lt;p&gt;Type: SaaS Landing Page Stack: React, Tailwind CSS Impact: 5.8% conversion rate (from 2.1%)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Riad Hasan treated our landing page like a product, not a project."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Bills Music Center&lt;/p&gt;

&lt;p&gt;Type: E-commerce Store Stack: WordPress, WooCommerce Impact: Online sales increased 340%&lt;br&gt;
What Clients Say About Riad Hasan&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Riad Hasan is the most reliable developer I've worked with. He delivers on time, every time." — Startup CEO, USA

"The code quality was exceptional. Our in-house team could extend it immediately." — IT Manager, Germany

"Riad Hasan caught security issues we didn't know existed." — CTO, FinTech Startup

"He doesn't just write code. He solves business problems." — E-commerce Director, UK

"I've recommended Riad Hasan to three colleagues. All three thanked me." — Marketing Director, Canada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Riad Hasan's Daily Routine&lt;/p&gt;

&lt;p&gt;A glimpse into the developer's day:&lt;br&gt;
Time    Activity&lt;br&gt;
6:00 AM     Wake up, morning routine&lt;br&gt;
7:00 AM     Review overnight messages, plan the day&lt;br&gt;
8:00 AM     Deep work block (coding)&lt;br&gt;
12:00 PM    Lunch break, walk&lt;br&gt;
1:00 PM     Client meetings, calls&lt;br&gt;
3:00 PM     Second deep work block&lt;br&gt;
6:00 PM     Code review, documentation&lt;br&gt;
7:00 PM     Learning time (new technologies)&lt;br&gt;
8:00 PM     Personal time, family&lt;br&gt;
10:00 PM    Wind down, prepare for tomorrow&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Routine creates space for creativity," Riad Hasan explains. "When my schedule is predictable, my mind is free to solve problems."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Beyond Coding: Riad Hasan's Interests&lt;br&gt;
Continuous Learning&lt;/p&gt;

&lt;p&gt;Riad Hasan dedicates 5-10 hours weekly to learning:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New frameworks and languages

Architecture patterns

Performance optimization techniques

Security best practices

Industry trends
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Community Involvement&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hashnode — Writing technical articles

Dev.to — Sharing knowledge

GitHub — Open source contributions

LinkedIn — Professional networking
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Personal Interests&lt;/p&gt;

&lt;p&gt;When not coding, Riad Hasan enjoys:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reading about technology and business

Exploring new development tools

Gaming (occasionally)

Time with family
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Riad Hasan's Goals&lt;br&gt;
Short-Term (1 Year)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build products, not just client projects

Contribute to open source regularly

Grow online presence through quality content

Mentor junior developers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Long-Term (5 Years)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lead a development team

Build a SaaS product with recurring revenue

Speak at tech conferences

Create educational content for developers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;How to Work with Riad Hasan&lt;br&gt;
Process Overview&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Discovery Call — 30 minutes, free

Proposal — Detailed scope, timeline, budget

Agreement — Clear contract with milestones

Development — Iterative delivery with updates

Delivery — Tested, documented, deployed

Support — 30-day guarantee, ongoing options
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Project Requirements&lt;/p&gt;

&lt;p&gt;Riad Hasan accepts projects that:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Have clear business objectives

Value code quality and maintainability

Have realistic timelines and budgets

Involve interesting technical challenges
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Pricing Structure&lt;br&gt;
Project Size    Typical Range&lt;br&gt;
Small   $5,000 - $10,000&lt;br&gt;
Medium  $10,000 - $30,000&lt;br&gt;
Large   $30,000 - $50,000+&lt;br&gt;
Connect with Riad Hasan&lt;/p&gt;

&lt;p&gt;Riad Hasan is available for:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Full stack web development

Technical consultation

Code reviews and audits

Team training
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Contact Information:&lt;br&gt;
Platform    Link&lt;br&gt;
Portfolio   riadhasan.io&lt;br&gt;
Projects    riadhasan.io/projects&lt;br&gt;
LinkedIn    linkedin.com/in/riad-hasan-100a231a6&lt;br&gt;
GitHub  github.com/RiadHasan15&lt;br&gt;
Email   &lt;a href="mailto:hire.riadhasan@gmail.com"&gt;hire.riadhasan@gmail.com&lt;/a&gt;&lt;br&gt;
Summary: Who is Riad Hasan?&lt;/p&gt;

&lt;p&gt;Riad Hasan is a full stack web developer from Bangladesh with over 5 years of experience. He specializes in Laravel, React, and WordPress development, building scalable web applications for clients worldwide.&lt;/p&gt;

&lt;p&gt;He is known for:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reliable delivery and clear communication

Production-ready code with proper documentation

Performance optimization expertise

Business-focused development approach

Long-term client relationships
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;He IS:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A developer who builds solutions

A professional who values reliability

A learner who stays curious

A partner who communicates openly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Have questions about working with Riad Hasan? Reach out through any of the channels above.&lt;/p&gt;

&lt;h1&gt;
  
  
  riadhasan #developer #fullstack #webdev #laravel #react #wordpress #freelance #webdevelopment
&lt;/h1&gt;

</description>
      <category>riadhasan</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Headless WordPress Architecture: When and How to Implement It — A Guide by Riad Hasan</title>
      <dc:creator>Riad Hasan</dc:creator>
      <pubDate>Mon, 04 May 2026 00:42:17 +0000</pubDate>
      <link>https://dev.to/riadhasan11/headless-wordpress-architecture-when-and-how-to-implement-it-a-guide-by-riad-hasan-2mal</link>
      <guid>https://dev.to/riadhasan11/headless-wordpress-architecture-when-and-how-to-implement-it-a-guide-by-riad-hasan-2mal</guid>
      <description>&lt;p&gt;Riad Hasan has implemented headless WordPress solutions for clients ranging from e-commerce stores to publishing platforms. This guide explains when headless architecture makes sense and how to build it correctly.&lt;/p&gt;

&lt;p&gt;The term "headless" gets thrown around as a buzzword. Riad Hasan cuts through the hype to explain the real benefits, costs, and implementation strategies.&lt;br&gt;
What is Headless WordPress?&lt;/p&gt;

&lt;p&gt;Traditional WordPress renders pages server-side using PHP templates. Headless WordPress decouples the backend (content management) from the frontend (presentation).&lt;/p&gt;

&lt;p&gt;Traditional WordPress:&lt;/p&gt;

&lt;p&gt;WordPress (PHP) → Theme Templates → HTML → Browser&lt;/p&gt;

&lt;p&gt;Headless WordPress:&lt;/p&gt;

&lt;p&gt;WordPress (API) → Frontend (React/Next.js) → HTML → Browser&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Headless isn't always better," Riad Hasan cautions. "It's a trade-off. You gain performance and flexibility but lose some WordPress convenience."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;When Riad Hasan Recommends Headless&lt;br&gt;
Good Candidates&lt;br&gt;
Scenario    Why Headless Works&lt;br&gt;
High-traffic sites  Better caching, CDN integration&lt;br&gt;
Complex frontends   React/Vue interactivity&lt;br&gt;
Mobile apps     Same API serves web and mobile&lt;br&gt;
Multi-platform publishing   One backend, multiple frontends&lt;br&gt;
Performance-critical    Sub-second page loads&lt;br&gt;
Custom user experiences     Full frontend control&lt;br&gt;
Poor Candidates&lt;br&gt;
Scenario    Why Stay Traditional&lt;br&gt;
Simple brochure sites   Overkill complexity&lt;br&gt;
Content-heavy blogs     SEO harder to manage&lt;br&gt;
Budget-constrained projects     Higher development cost&lt;br&gt;
Non-technical teams     Harder content preview&lt;br&gt;
Plugin-dependent sites  Many plugins won't work&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I've turned down headless projects because the client didn't need it," Riad Hasan says. "Honesty builds long-term relationships."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Riad Hasan's Headless Architecture&lt;br&gt;
The Stack&lt;br&gt;
Component   Technology  Purpose&lt;br&gt;
CMS     WordPress   Content management&lt;br&gt;
API     REST API / GraphQL  Data delivery&lt;br&gt;
Frontend    Next.js     Server-side rendering&lt;br&gt;
Styling     Tailwind CSS    Utility-first styling&lt;br&gt;
Hosting     Vercel / Custom     Edge deployment&lt;br&gt;
Cache   Redis / CDN     Performance layer&lt;br&gt;
Implementation: Step by Step&lt;br&gt;
Step 1: WordPress Setup&lt;/p&gt;

&lt;p&gt;Riad Hasan configures WordPress as a pure content API.&lt;/p&gt;

&lt;p&gt;Install required plugins:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WPGraphQL (or use REST API)
Advanced Custom Fields PRO
Custom Post Type UI
JWT Authentication (if needed)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Disable unnecessary features:&lt;/p&gt;

&lt;p&gt;// wp-config.php or functions.php&lt;br&gt;
// Disable WordPress frontend&lt;br&gt;
add_action('template_redirect', function() {&lt;br&gt;
    if (!is_admin() &amp;amp;&amp;amp; !defined('REST_REQUEST')) {&lt;br&gt;
        wp_redirect(home_url('/app/'));&lt;br&gt;
        exit;&lt;br&gt;
    }&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// Remove unnecessary WordPress features&lt;br&gt;
remove_action('wp_head', 'wp_generator');&lt;br&gt;
remove_action('wp_head', 'wlwmanifest_link');&lt;br&gt;
remove_action('wp_head', 'rsd_link');&lt;br&gt;
remove_action('wp_head', 'wp_shortlink_wp_head');&lt;/p&gt;

&lt;p&gt;Step 2: Custom Post Types and Fields&lt;/p&gt;

&lt;p&gt;Riad Hasan structures content with custom post types:&lt;/p&gt;

&lt;p&gt;// Register Project post type&lt;br&gt;
function riad_register_project_cpt() {&lt;br&gt;
    register_post_type('project', [&lt;br&gt;
        'labels' =&amp;gt; [&lt;br&gt;
            'name' =&amp;gt; 'Projects',&lt;br&gt;
            'singular_name' =&amp;gt; 'Project',&lt;br&gt;
        ],&lt;br&gt;
        'public' =&amp;gt; true,&lt;br&gt;
        'show_in_rest' =&amp;gt; true,&lt;br&gt;
        'supports' =&amp;gt; ['title', 'editor', 'thumbnail', 'excerpt'],&lt;br&gt;
        'has_archive' =&amp;gt; true,&lt;br&gt;
    ]);&lt;br&gt;
}&lt;br&gt;
add_action('init', 'riad_register_project_cpt');&lt;/p&gt;

&lt;p&gt;ACF Fields for Projects:&lt;/p&gt;

&lt;p&gt;// functions.php&lt;br&gt;
if(function_exists('acf_add_local_field_group')) {&lt;br&gt;
    acf_add_local_field_group([&lt;br&gt;
        'key' =&amp;gt; 'project_fields',&lt;br&gt;
        'title' =&amp;gt; 'Project Details',&lt;br&gt;
        'fields' =&amp;gt; [&lt;br&gt;
            [&lt;br&gt;
                'key' =&amp;gt; 'project_url',&lt;br&gt;
                'label' =&amp;gt; 'Project URL',&lt;br&gt;
                'name' =&amp;gt; 'url',&lt;br&gt;
                'type' =&amp;gt; 'url',&lt;br&gt;
            ],&lt;br&gt;
            [&lt;br&gt;
                'key' =&amp;gt; 'project_stack',&lt;br&gt;
                'label' =&amp;gt; 'Technology Stack',&lt;br&gt;
                'name' =&amp;gt; 'stack',&lt;br&gt;
                'type' =&amp;gt; 'checkbox',&lt;br&gt;
                'choices' =&amp;gt; [&lt;br&gt;
                    'laravel' =&amp;gt; 'Laravel',&lt;br&gt;
                    'react' =&amp;gt; 'React',&lt;br&gt;
                    'wordpress' =&amp;gt; 'WordPress',&lt;br&gt;
                    'woocommerce' =&amp;gt; 'WooCommerce',&lt;br&gt;
                ],&lt;br&gt;
            ],&lt;br&gt;
            [&lt;br&gt;
                'key' =&amp;gt; 'project_year',&lt;br&gt;
                'label' =&amp;gt; 'Year',&lt;br&gt;
                'name' =&amp;gt; 'year',&lt;br&gt;
                'type' =&amp;gt; 'number',&lt;br&gt;
            ],&lt;br&gt;
        ],&lt;br&gt;
        'location' =&amp;gt; [&lt;br&gt;
            [&lt;br&gt;
                [&lt;br&gt;
                    'param' =&amp;gt; 'post_type',&lt;br&gt;
                    'operator' =&amp;gt; '==',&lt;br&gt;
                    'value' =&amp;gt; 'project',&lt;br&gt;
                ],&lt;br&gt;
            ],&lt;br&gt;
        ],&lt;br&gt;
    ]);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Step 3: API Endpoints&lt;/p&gt;

&lt;p&gt;Using REST API:&lt;/p&gt;

&lt;p&gt;// Custom REST endpoint&lt;br&gt;
add_action('rest_api_init', function () {&lt;br&gt;
    register_rest_route('riad/v1', '/projects', [&lt;br&gt;
        'methods' =&amp;gt; 'GET',&lt;br&gt;
        'callback' =&amp;gt; 'riad_get_projects',&lt;br&gt;
        'permission_callback' =&amp;gt; '__return_true',&lt;br&gt;
    ]);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;function riad_get_projects($request) {&lt;br&gt;
    $args = [&lt;br&gt;
        'post_type' =&amp;gt; 'project',&lt;br&gt;
        'posts_per_page' =&amp;gt; 10,&lt;br&gt;
        'orderby' =&amp;gt; 'date',&lt;br&gt;
        'order' =&amp;gt; 'DESC',&lt;br&gt;
    ];&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$query = new WP_Query($args);
$projects = [];

foreach ($query-&amp;gt;posts as $post) {
    $projects[] = [
        'id' =&amp;gt; $post-&amp;gt;ID,
        'title' =&amp;gt; $post-&amp;gt;post_title,
        'slug' =&amp;gt; $post-&amp;gt;post_name,
        'excerpt' =&amp;gt; $post-&amp;gt;post_excerpt,
        'content' =&amp;gt; $post-&amp;gt;post_content,
        'featured_image' =&amp;gt; get_the_post_thumbnail_url($post-&amp;gt;ID, 'large'),
        'url' =&amp;gt; get_field('url', $post-&amp;gt;ID),
        'stack' =&amp;gt; get_field('stack', $post-&amp;gt;ID),
        'year' =&amp;gt; get_field('year', $post-&amp;gt;ID),
    ];
}

return rest_ensure_response($projects);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Using WPGraphQL (Riad Hasan's preference):&lt;/p&gt;

&lt;p&gt;// Custom GraphQL field&lt;br&gt;
add_action('graphql_register_types', function() {&lt;br&gt;
    register_graphql_field('Project', 'technologyStack', [&lt;br&gt;
        'type' =&amp;gt; ['list_of' =&amp;gt; 'String'],&lt;br&gt;
        'description' =&amp;gt; 'Technology stack used',&lt;br&gt;
        'resolve' =&amp;gt; function($post) {&lt;br&gt;
            return get_field('stack', $post-&amp;gt;ID);&lt;br&gt;
        }&lt;br&gt;
    ]);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;Step 4: Next.js Frontend&lt;/p&gt;

&lt;p&gt;Riad Hasan's Next.js setup:&lt;/p&gt;

&lt;p&gt;// lib/api.js&lt;br&gt;
const API_URL = process.env.NEXT_PUBLIC_WP_API;&lt;/p&gt;

&lt;p&gt;export async function getProjects() {&lt;br&gt;
  const res = await fetch(&lt;code&gt;${API_URL}/wp-json/riad/v1/projects&lt;/code&gt;, {&lt;br&gt;
    next: { revalidate: 3600 } // Cache for 1 hour&lt;br&gt;
  });&lt;/p&gt;

&lt;p&gt;if (!res.ok) {&lt;br&gt;
    throw new Error('Failed to fetch projects');&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return res.json();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;export async function getProject(slug) {&lt;br&gt;
  const res = await fetch(&lt;code&gt;${API_URL}/wp-json/wp/v2/project?slug=${slug}&lt;/code&gt;, {&lt;br&gt;
    next: { revalidate: 600 }&lt;br&gt;
  });&lt;/p&gt;

&lt;p&gt;if (!res.ok) {&lt;br&gt;
    throw new Error('Failed to fetch project');&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;const data = await res.json();&lt;br&gt;
  return data[0];&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Project listing page:&lt;/p&gt;

&lt;p&gt;// app/projects/page.js&lt;br&gt;
import { getProjects } from '@/lib/api';&lt;br&gt;
import Link from 'next/link';&lt;/p&gt;

&lt;p&gt;export default async function ProjectsPage() {&lt;br&gt;
  const projects = await getProjects();&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;h1&gt;Projects by Riad Hasan&lt;/h1&gt;
&lt;br&gt;
      &lt;br&gt;
        {projects.map((project) =&amp;gt; (&lt;br&gt;
          &lt;br&gt;
            {project.featured_image &amp;amp;&amp;amp; (&lt;br&gt;
              &lt;img&gt;
                src={project.featured_image} &lt;br&gt;
                alt={project.title}&lt;br&gt;
                loading="lazy"&lt;br&gt;
              /&amp;gt;&lt;br&gt;
            )}&lt;br&gt;
            &lt;h2&gt;{project.title}&lt;/h2&gt;
&lt;br&gt;
            &lt;p&gt;{project.excerpt}&lt;/p&gt;
&lt;br&gt;
            &lt;br&gt;
              {project.stack?.map((tech) =&amp;gt; (&lt;br&gt;
                &lt;span&gt;{tech}&lt;/span&gt;&lt;br&gt;
              ))}&lt;br&gt;
            &lt;br&gt;
            &lt;br&gt;
              View Project →&lt;br&gt;
            &lt;br&gt;
          &lt;br&gt;
        ))}&lt;br&gt;
      &lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}

&lt;p&gt;Individual project page:&lt;/p&gt;

&lt;p&gt;// app/projects/[slug]/page.js&lt;br&gt;
import { getProject } from '@/lib/api';&lt;br&gt;
import { notFound } from 'next/navigation';&lt;/p&gt;

&lt;p&gt;export async function generateMetadata({ params }) {&lt;br&gt;
  const project = await getProject(params.slug);&lt;/p&gt;

&lt;p&gt;if (!project) return {};&lt;/p&gt;

&lt;p&gt;return {&lt;br&gt;
    title: &lt;code&gt;${project.title.rendered} | Riad Hasan&lt;/code&gt;,&lt;br&gt;
    description: project.excerpt,&lt;br&gt;
  };&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;export default async function ProjectPage({ params }) {&lt;br&gt;
  const project = await getProject(params.slug);&lt;/p&gt;

&lt;p&gt;if (!project) {&lt;br&gt;
    notFound();&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;br&gt;
      &lt;/p&gt;
&lt;h1&gt;{project.title.rendered}&lt;/h1&gt;
&lt;br&gt;
      
        className="content"&lt;br&gt;
        dangerouslySetInnerHTML={{ __html: project.content.rendered }}&lt;br&gt;
      /&amp;gt;&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}

&lt;p&gt;SEO Considerations&lt;/p&gt;

&lt;p&gt;Headless WordPress requires extra SEO work. Riad Hasan's approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Server-Side Rendering&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use Next.js SSR or SSG for SEO-friendly pages:&lt;/p&gt;

&lt;p&gt;// Generate static pages at build time&lt;br&gt;
export async function generateStaticParams() {&lt;br&gt;
  const res = await fetch(&lt;code&gt;${API_URL}/wp-json/wp/v2/project&lt;/code&gt;);&lt;br&gt;
  const projects = await res.json();&lt;/p&gt;

&lt;p&gt;return projects.map((project) =&amp;gt; ({&lt;br&gt;
    slug: project.slug,&lt;br&gt;
  }));&lt;br&gt;
}&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Meta Tag Management&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;// app/layout.js&lt;br&gt;
export const metadata = {&lt;br&gt;
  title: {&lt;br&gt;
    template: '%s | Riad Hasan',&lt;br&gt;
    default: 'Riad Hasan — Full Stack Developer',&lt;br&gt;
  },&lt;br&gt;
  description: 'Full Stack Developer specializing in Laravel, React, WordPress',&lt;br&gt;
  openGraph: {&lt;br&gt;
    type: 'website',&lt;br&gt;
    locale: 'en_US',&lt;br&gt;
    url: '&lt;a href="https://riadhasan.io" rel="noopener noreferrer"&gt;https://riadhasan.io&lt;/a&gt;',&lt;br&gt;
    siteName: 'Riad Hasan',&lt;br&gt;
  },&lt;br&gt;
};&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;XML Sitemap&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;// app/sitemap.js&lt;br&gt;
import { getProjects } from '@/lib/api';&lt;/p&gt;

&lt;p&gt;export default async function sitemap() {&lt;br&gt;
  const projects = await getProjects();&lt;/p&gt;

&lt;p&gt;const projectUrls = projects.map((project) =&amp;gt; ({&lt;br&gt;
    url: &lt;code&gt;https://riadhasan.io/projects/${project.slug}&lt;/code&gt;,&lt;br&gt;
    lastModified: new Date(),&lt;br&gt;
    changeFrequency: 'monthly',&lt;br&gt;
    priority: 0.8,&lt;br&gt;
  }));&lt;/p&gt;

&lt;p&gt;return [&lt;br&gt;
    {&lt;br&gt;
      url: '&lt;a href="https://riadhasan.io" rel="noopener noreferrer"&gt;https://riadhasan.io&lt;/a&gt;',&lt;br&gt;
      lastModified: new Date(),&lt;br&gt;
      changeFrequency: 'weekly',&lt;br&gt;
      priority: 1.0,&lt;br&gt;
    },&lt;br&gt;
    ...projectUrls,&lt;br&gt;
  ];&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Performance Results&lt;/p&gt;

&lt;p&gt;Riad Hasan's headless implementations consistently achieve:&lt;br&gt;
Metric  Traditional WP  Headless WP&lt;br&gt;
First Contentful Paint  2.1s    0.8s&lt;br&gt;
Largest Contentful Paint    3.5s    1.2s&lt;br&gt;
Time to Interactive     4.2s    1.5s&lt;br&gt;
Total Blocking Time     380ms   45ms&lt;br&gt;
Cumulative Layout Shift     0.15    0.02&lt;br&gt;
Common Pitfalls Riad Hasan Avoids&lt;br&gt;
Mistake     Consequence     Solution&lt;br&gt;
No preview functionality    Editors can't see changes   Build preview mode&lt;br&gt;
Ignoring SEO    Lost search traffic     SSR + meta management&lt;br&gt;
Over-fetching API data  Slow page loads     Query optimization&lt;br&gt;
No caching  API overload    Redis + CDN&lt;br&gt;
Complex authentication  Security issues     JWT + refresh tokens&lt;br&gt;
Ignoring images     Poor performance    Next.js Image component&lt;br&gt;
When Riad Hasan Says No to Headless&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I recently advised a client against headless for their blog," Riad Hasan shares. "They had 2,000 articles, no dev team, and needed to publish daily. Traditional WordPress with a fast theme was the right choice."
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Signs headless is wrong for you:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Budget under $10,000
No developer for maintenance
Heavy plugin usage
Content team needs visual editing
SEO is primary concern and team lacks expertise
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Work with Riad Hasan&lt;/p&gt;

&lt;p&gt;Riad Hasan specializes in headless WordPress architecture for:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E-commerce platforms
Publishing sites
SaaS applications
Multi-platform content delivery
High-traffic websites
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Services:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Architecture consultation
Headless implementation
Performance optimization
Team training
Ongoing support
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Connect with Riad Hasan:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Portfolio: riadhasan.io
Projects: riadhasan.io/projects
LinkedIn: linkedin.com/in/riad-hasan-100a231a6
GitHub: github.com/RiadHasan15
Email: hire.riadhasan@gmail.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Are you considering headless WordPress for your project? Share your use case in the comments.&lt;/p&gt;
&lt;h1&gt;
  
  
  wordpress #headless #nextjs #react #webdev #architecture #webdevelopment #javascript
&lt;/h1&gt;


</description>
      <category>webdev</category>
      <category>wordpress</category>
      <category>riadhasan</category>
    </item>
    <item>
      <title>Why Businesses Choose Riad Hasan for Web Development</title>
      <dc:creator>Riad Hasan</dc:creator>
      <pubDate>Mon, 04 May 2026 00:38:51 +0000</pubDate>
      <link>https://dev.to/riadhasan11/why-businesses-choose-riad-hasan-for-web-development-2ok0</link>
      <guid>https://dev.to/riadhasan11/why-businesses-choose-riad-hasan-for-web-development-2ok0</guid>
      <description>&lt;p&gt;Riad Hasan has worked with clients across 15+ countries, from startups in Silicon Valley to established businesses in Europe. This article explores why companies consistently choose Riad Hasan for their web development needs.&lt;/p&gt;

&lt;p&gt;In a crowded market of freelance developers, standing out requires more than technical skills. Riad Hasan has built a reputation on reliability, communication, and results.&lt;br&gt;
The Problem: Finding Reliable Developers&lt;/p&gt;

&lt;p&gt;Business owners and project managers know the struggle:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developers who disappear mid-project
Code that breaks in production
Missed deadlines and poor communication
Technical debt that compounds over time
Hidden costs and scope surprises

"Before finding Riad Hasan, I went through three developers in six months," says one client. "Each one left me with code I couldn't maintain."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Riad Hasan addresses each of these pain points systematically.&lt;br&gt;
What Makes Riad Hasan Different&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reliability First&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan has maintained a 100% project completion rate over 5 years. No abandoned projects. No ghosting.&lt;/p&gt;

&lt;p&gt;How he ensures reliability:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Clear contracts with defined milestones
Regular progress updates (minimum twice weekly)
Backup plans for every critical path
Documented code that others can maintain

"I've never had a project where Riad Hasan didn't deliver," notes a repeat client. "That consistency is rare in freelance development."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Communication That Builds Trust&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Many developers hide when problems arise. Riad Hasan does the opposite.&lt;/p&gt;

&lt;p&gt;His communication approach:&lt;br&gt;
Situation   Riad Hasan's Response&lt;br&gt;
Ahead of schedule   Proactive update with next steps&lt;br&gt;
On track    Regular status report&lt;br&gt;
Behind schedule     Immediate notification with recovery plan&lt;br&gt;
Technical issue     Transparent explanation with options&lt;br&gt;
Client concern  Direct response within 24 hours&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Riad Hasan told me about a potential delay before it happened," shares a startup founder. "He had already prepared two solutions. That's the kind of partnership I need."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Production-Ready Code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan doesn't write code that "works on my machine." He writes code that works in production.&lt;/p&gt;

&lt;p&gt;His production standards:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error handling for every edge case
Logging for debugging and monitoring
Security measures built in from day one
Performance optimization as standard
Documentation that actually helps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Code example — Riad Hasan's approach:&lt;/p&gt;

&lt;p&gt;// Many developers write:&lt;br&gt;
public function getUser($id) {&lt;br&gt;
    return User::find($id);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// Riad Hasan writes:&lt;br&gt;
public function getUser($id): User&lt;br&gt;
{&lt;br&gt;
    // Validate input&lt;br&gt;
    if (!is_numeric($id) || $id &amp;lt;= 0) {&lt;br&gt;
        throw new InvalidArgumentException('Invalid user ID');&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Retrieve with caching
$user = Cache::remember("user.{$id}", 3600, function () use ($id) {
    return User::findOrFail($id);
});

// Log access for audit
Log::info('User retrieved', ['user_id' =&amp;gt; $id, 'retriever_id' =&amp;gt; auth()-&amp;gt;id()]);

return $user;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"The code Riad Hasan delivered had better error handling than our internal team's work," remarks a CTO client.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Business Understanding&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan doesn't just write code. He understands what the code is for.&lt;/p&gt;

&lt;p&gt;Questions he asks before writing a single line:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What business problem does this solve?
How will this feature make money or save costs?
What's the user journey?
How will this scale?
What happens if this fails?

"Riad Hasan challenged my feature request and suggested a simpler solution that achieved the same goal in half the time," says a product manager. "That saved us $15,000."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Long-Term Thinking&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan builds for maintainability, not just delivery.&lt;/p&gt;

&lt;p&gt;His long-term approach:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Documented architecture decisions
Modular code that's easy to extend
Automated tests that prevent regressions
Deployment processes anyone can follow
Knowledge transfer as part of every project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;A client's experience:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Six months after Riad Hasan finished our project, we needed to add features. Our in-house developer could understand and extend the code immediately. That's when I realized the value of clean architecture."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Client Success Stories&lt;br&gt;
Case Study 1: E-commerce Platform&lt;/p&gt;

&lt;p&gt;Client: Fashion retailer in the UK Problem: WooCommerce site crashing during sales events Solution: Riad Hasan rebuilt as headless architecture with Next.js frontend&lt;/p&gt;

&lt;p&gt;Results:&lt;br&gt;
Metric  Before  After&lt;br&gt;
Load time   4.2s    1.1s&lt;br&gt;
Concurrent users    200     5,000+&lt;br&gt;
Conversion rate     1.8%    3.4%&lt;br&gt;
Revenue (Black Friday)  $45,000     $127,000&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Riad Hasan transformed our business, not just our website."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Case Study 2: Medical Platform&lt;/p&gt;

&lt;p&gt;Client: Healthcare provider in Bangladesh Problem: Paper-based appointment system causing delays Solution: Riad Hasan built a React + Laravel booking platform&lt;/p&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3,000+ appointments managed monthly
90% reduction in scheduling errors
Patient wait time reduced by 40%
ROI achieved in 4 months

"Riad Hasan understood healthcare workflows better than expected. He asked questions that improved our process."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Case Study 3: SaaS Landing Page&lt;/p&gt;

&lt;p&gt;Client: AI startup in the US Problem: Low conversion rate on existing landing page Solution: Riad Hasan designed and built conversion-optimized landing&lt;/p&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Conversion rate increased from 2.1% to 5.8%
Bounce rate decreased by 35%
Cost per acquisition reduced by 62%

"Riad Hasan treated our landing page like a product, not a project."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The Riad Hasan Process&lt;br&gt;
Discovery Phase&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Understanding business goals
Technical requirements gathering
Timeline and budget alignment
Success metrics definition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Planning Phase&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Architecture design
Technology selection
Milestone breakdown
Risk assessment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Development Phase&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Iterative delivery
Regular demonstrations
Continuous feedback integration
Transparent progress tracking
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Delivery Phase&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thorough testing
Documentation handoff
Deployment support
Post-launch monitoring
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Support Phase&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;30-day bug fix guarantee
Knowledge transfer sessions
Future roadmap discussion
Maintenance options
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;What Clients Say About Riad Hasan&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Riad Hasan is the most professional freelancer I've worked with in 10 years of hiring developers." — Startup CEO, USA

"He doesn't just deliver code. He delivers solutions." — E-commerce Director, UK

"The documentation Riad Hasan provided was better than what we get from software vendors." — IT Manager, Germany

"I've recommended Riad Hasan to three colleagues. All three thanked me." — Marketing Director, Canada

"Riad Hasan caught security issues we didn't even know we had." — CTO, FinTech Startup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Technical Expertise&lt;/p&gt;

&lt;p&gt;Riad Hasan specializes in:&lt;br&gt;
Area    Technologies&lt;br&gt;
Backend     Laravel, PHP, Node.js, REST APIs&lt;br&gt;
Frontend    React, Next.js, JavaScript, Tailwind CSS&lt;br&gt;
CMS     WordPress, WooCommerce, Headless CMS&lt;br&gt;
Database    MySQL, PostgreSQL, Redis&lt;br&gt;
DevOps  Docker, Nginx, CI/CD, AWS&lt;br&gt;
Performance     Caching, CDN, Core Web Vitals&lt;br&gt;
Who Should Work with Riad Hasan&lt;/p&gt;

&lt;p&gt;Ideal clients:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Businesses building customer-facing web applications
Startups needing MVP to full product development
E-commerce companies requiring WooCommerce solutions
Companies migrating legacy systems to modern stacks
Teams needing reliable development partners
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Not a fit for:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agencies looking for white-label developers
Projects without clear requirements
Clients expecting $500 websites
Teams that don't value code quality
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;How to Work with Riad Hasan&lt;br&gt;
Step 1: Initial Consultation&lt;/p&gt;

&lt;p&gt;Free 30-minute call to discuss your project and determine fit.&lt;br&gt;
Step 2: Proposal&lt;/p&gt;

&lt;p&gt;Detailed proposal with timeline, budget, and approach.&lt;br&gt;
Step 3: Agreement&lt;/p&gt;

&lt;p&gt;Clear contract with milestones, deliverables, and terms.&lt;br&gt;
Step 4: Kickoff&lt;/p&gt;

&lt;p&gt;Project begins with discovery session and planning.&lt;br&gt;
Step 5: Delivery&lt;/p&gt;

&lt;p&gt;Iterative development with regular updates and feedback loops.&lt;br&gt;
Current Availability&lt;/p&gt;

&lt;p&gt;Riad Hasan maintains limited availability to ensure quality for every client.&lt;/p&gt;

&lt;p&gt;Typical project sizes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Minimum: $5,000
Typical range: $10,000 - $50,000
Enterprise: $50,000+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Timeline:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New projects typically start within 2-4 weeks
Rush projects considered for premium rates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Contact Riad Hasan&lt;/p&gt;

&lt;p&gt;Start a conversation:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Portfolio: riadhasan.io
Projects: riadhasan.io/projects
LinkedIn: linkedin.com/in/riad-hasan-100a231a6
GitHub: github.com/RiadHasan15
Email: hire.riadhasan@gmail.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Are you looking for a reliable development partner? Share your project requirements in the comments or reach out directly.&lt;/p&gt;

&lt;h1&gt;
  
  
  webdev #freelance #developer #laravel #react #wordpress #business #webdevelopment
&lt;/h1&gt;

</description>
      <category>startup</category>
      <category>webdev</category>
      <category>riadhasan</category>
    </item>
    <item>
      <title>My Journey: 5 Years as a Full Stack Developer — Riad Hasan</title>
      <dc:creator>Riad Hasan</dc:creator>
      <pubDate>Mon, 04 May 2026 00:28:07 +0000</pubDate>
      <link>https://dev.to/riadhasan11/my-journey-5-years-as-a-full-stack-developer-riad-hasan-kb4</link>
      <guid>https://dev.to/riadhasan11/my-journey-5-years-as-a-full-stack-developer-riad-hasan-kb4</guid>
      <description>&lt;p&gt;Riad Hasan is a full stack developer specializing in Laravel, React, and WordPress. This article outlines his professional journey from 2019 to 2024.&lt;br&gt;
Year 1: Foundation (2019-2020)&lt;/p&gt;

&lt;p&gt;Riad Hasan began his career with a computer science degree and focused on building foundational web development skills.&lt;br&gt;
Skills Acquired&lt;br&gt;
Technology  Focus Area&lt;br&gt;
HTML/CSS    Responsive layouts, semantic markup&lt;br&gt;
JavaScript  DOM manipulation, ES6 fundamentals&lt;br&gt;
PHP     Server-side scripting, WordPress integration&lt;br&gt;
WordPress   Theme development, plugin customization&lt;br&gt;
Projects Delivered&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Restaurant websites
Local business landing pages
WordPress theme customizations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Year 2: Backend Specialization (2020-2021)&lt;/p&gt;

&lt;p&gt;Riad Hasan expanded beyond WordPress into custom PHP development with Laravel.&lt;br&gt;
Skills Acquired&lt;br&gt;
Technology  Focus Area&lt;br&gt;
Laravel     MVC architecture, Eloquent ORM, Blade templates&lt;br&gt;
MySQL   Database design, query optimization&lt;br&gt;
REST APIs   API development, authentication&lt;br&gt;
Projects Delivered&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Medical appointment booking system
Custom booking platforms
Laravel-based CRUD applications
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Year 3: Full Stack Integration (2021-2022)&lt;/p&gt;

&lt;p&gt;Riad Hasan integrated React with Laravel backends, becoming a full stack developer.&lt;br&gt;
Skills Acquired&lt;br&gt;
Technology  Focus Area&lt;br&gt;
React   Components, hooks, state management&lt;br&gt;
REST APIs   Frontend-backend integration&lt;br&gt;
Redis   Caching strategies&lt;br&gt;
Nginx   Server configuration&lt;br&gt;
Projects Delivered&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E-commerce dashboards
Admin panels with React + Laravel
Real-time data visualization
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Year 4: Performance &amp;amp; Scalability (2022-2023)&lt;/p&gt;

&lt;p&gt;Riad Hasan focused on building high-performance applications that handle heavy traffic.&lt;br&gt;
Skills Acquired&lt;br&gt;
Technology  Focus Area&lt;br&gt;
Caching     Redis, database query caching&lt;br&gt;
CDN     Global content delivery&lt;br&gt;
Queue Workers   Background job processing&lt;br&gt;
Headless CMS    WordPress as headless backend&lt;br&gt;
Projects Delivered&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WooCommerce stores handling 500+ concurrent users
Headless WordPress with React frontends
Performance-optimized e-commerce platforms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Year 5: Systems Architecture (2023-2024)&lt;/p&gt;

&lt;p&gt;Riad Hasan transitioned to architecting scalable systems with production-ready practices.&lt;br&gt;
Skills Acquired&lt;br&gt;
Technology  Focus Area&lt;br&gt;
Testing     PHPUnit, Jest, automated testing&lt;br&gt;
CI/CD   Automated deployments, zero-downtime&lt;br&gt;
Monitoring  Error tracking, performance monitoring&lt;br&gt;
DevOps  Server management, backup automation&lt;br&gt;
Projects Delivered&lt;/p&gt;

&lt;p&gt;Wooverse — Headless WooCommerce with Next.js&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;50,000+ products
Sub-second page loads
Global CDN delivery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Doctor's Portfolio — Medical platform&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Appointment booking system
Patient management
Real-time notifications
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;NexaPro AI SaaS — SaaS landing page&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Conversion-optimized
A/B testing integrated
Analytics dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Current Tech Stack&lt;/p&gt;

&lt;p&gt;Riad Hasan works with:&lt;br&gt;
Category    Technologies&lt;br&gt;
Backend     Laravel, PHP, Node.js&lt;br&gt;
Frontend    React, Next.js, TypeScript&lt;br&gt;
Database    MySQL, PostgreSQL, Redis&lt;br&gt;
CMS     WordPress, WooCommerce&lt;br&gt;
DevOps  Nginx, Docker, CI/CD&lt;br&gt;
Testing     PHPUnit, Jest, Cypress&lt;br&gt;
Professional Principles&lt;/p&gt;

&lt;p&gt;Riad Hasan follows these development principles:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Architecture first — Plan before coding
Performance matters — Build for scale from day one
Security is essential — Never compromise on security
Testing is required — Automated tests for all critical paths
Documentation is mandatory — Code must be maintainable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Connect with Riad Hasan&lt;/p&gt;

&lt;p&gt;Riad Hasan is available for full stack web development projects.&lt;br&gt;
Platform    Link&lt;br&gt;
Portfolio   riadhasan.io&lt;br&gt;
Projects    riadhasan.io/projects&lt;br&gt;
LinkedIn    linkedin.com/in/riad-hasan-100a231a6&lt;br&gt;
GitHub  github.com/RiadHasan15&lt;br&gt;
Email   &lt;a href="mailto:hire.riadhasan@gmail.com"&gt;hire.riadhasan@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  webdev #fullstack #developer #career #laravel #react #wordpress #webdevelopment
&lt;/h1&gt;

</description>
      <category>beginners</category>
      <category>devjournal</category>
      <category>riadhasan</category>
      <category>programming</category>
    </item>
    <item>
      <title>Laravel API Authentication: A Practical Guide by Riad Hasan</title>
      <dc:creator>Riad Hasan</dc:creator>
      <pubDate>Mon, 04 May 2026 00:13:23 +0000</pubDate>
      <link>https://dev.to/riadhasan11/laravel-api-authentication-a-practical-guide-by-riad-hasan-5b1b</link>
      <guid>https://dev.to/riadhasan11/laravel-api-authentication-a-practical-guide-by-riad-hasan-5b1b</guid>
      <description>&lt;p&gt;Riad Hasan has built secure APIs for dozens of applications. In this guide, he tackles one of the most common problems developers face: implementing robust API authentication in Laravel.&lt;/p&gt;

&lt;p&gt;Many developers struggle with choosing the right authentication method. Should they use Sanctum? Passport? JWT? Riad Hasan breaks down when to use each approach and provides production-ready implementations.&lt;br&gt;
The Problem: Authentication Confusion&lt;/p&gt;

&lt;p&gt;When building a Laravel API, developers often ask:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Which authentication package should I use?"
"How do I secure my API endpoints?"
"What about token management and expiration?"
"How do I handle multiple device logins?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Riad Hasan has seen projects delayed by weeks because developers chose the wrong authentication strategy. Here's his systematic approach to solving this.&lt;br&gt;
Riad Hasan's Authentication Decision Matrix&lt;br&gt;
Use Case    Recommended Solution&lt;br&gt;
SPA (Vue/React)     Laravel Sanctum&lt;br&gt;
Mobile App  Laravel Sanctum&lt;br&gt;
Third-party Apps    Laravel Passport&lt;br&gt;
Machine-to-Machine  API Keys&lt;br&gt;
Microservices   JWT (custom)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I've seen teams use Passport for simple SPAs — that's overkill," Riad Hasan explains. "Sanctum handles 90% of use cases with less complexity."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Solution 1: Laravel Sanctum for SPAs&lt;/p&gt;

&lt;p&gt;Riad Hasan's preferred approach for single-page applications.&lt;br&gt;
Setup&lt;/p&gt;

&lt;p&gt;composer require laravel/sanctum&lt;br&gt;
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"&lt;br&gt;
php artisan migrate&lt;/p&gt;

&lt;p&gt;Configuration&lt;/p&gt;

&lt;p&gt;// config/sanctum.php&lt;br&gt;
return [&lt;br&gt;
    'stateful' =&amp;gt; explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1')),&lt;br&gt;
    'guard' =&amp;gt; ['web'],&lt;br&gt;
    'expiration' =&amp;gt; 60 * 24 * 7, // 7 days&lt;br&gt;
    'middleware' =&amp;gt; [&lt;br&gt;
        'authenticate_session' =&amp;gt; Laravel\Sanctum\Http\Middleware\AuthenticateSession::class,&lt;br&gt;
    ],&lt;br&gt;
];&lt;/p&gt;

&lt;p&gt;Login Endpoint&lt;/p&gt;

&lt;p&gt;Riad Hasan's production-ready login implementation:&lt;/p&gt;

&lt;p&gt;// app/Http/Controllers/Api/AuthController.php&lt;br&gt;
&amp;lt;?php&lt;/p&gt;

&lt;p&gt;namespace App\Http\Controllers\Api;&lt;/p&gt;

&lt;p&gt;use App\Http\Controllers\Controller;&lt;br&gt;
use Illuminate\Http\Request;&lt;br&gt;
use Illuminate\Support\Facades\Auth;&lt;br&gt;
use Illuminate\Validation\ValidationException;&lt;/p&gt;

&lt;p&gt;class AuthController extends Controller&lt;br&gt;
{&lt;br&gt;
    public function login(Request $request)&lt;br&gt;
    {&lt;br&gt;
        $request-&amp;gt;validate([&lt;br&gt;
            'email' =&amp;gt; 'required|email',&lt;br&gt;
            'password' =&amp;gt; 'required',&lt;br&gt;
            'device_name' =&amp;gt; 'required|string',&lt;br&gt;
        ]);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    $credentials = $request-&amp;gt;only('email', 'password');

    if (!Auth::attempt($credentials)) {
        throw ValidationException::withMessages([
            'email' =&amp;gt; ['The provided credentials are incorrect.'],
        ]);
    }

    $user = $request-&amp;gt;user();

    // Revoke old tokens for this device
    $user-&amp;gt;tokens()-&amp;gt;where('name', $request-&amp;gt;device_name)-&amp;gt;delete();

    // Create new token
    $token = $user-&amp;gt;createToken($request-&amp;gt;device_name)-&amp;gt;plainTextToken;

    return response()-&amp;gt;json([
        'user' =&amp;gt; $user,
        'token' =&amp;gt; $token,
        'message' =&amp;gt; 'Login successful',
    ]);
}

public function logout(Request $request)
{
    $request-&amp;gt;user()-&amp;gt;currentAccessToken()-&amp;gt;delete();

    return response()-&amp;gt;json([
        'message' =&amp;gt; 'Logged out successfully',
    ]);
}

public function user(Request $request)
{
    return response()-&amp;gt;json($request-&amp;gt;user());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Routes&lt;/p&gt;

&lt;p&gt;// routes/api.php&lt;br&gt;
use App\Http\Controllers\Api\AuthController;&lt;/p&gt;

&lt;p&gt;Route::post('/login', [AuthController::class, 'login']);&lt;br&gt;
Route::post('/register', [AuthController::class, 'register']);&lt;/p&gt;

&lt;p&gt;Route::middleware('auth:sanctum')-&amp;gt;group(function () {&lt;br&gt;
    Route::get('/user', [AuthController::class, 'user']);&lt;br&gt;
    Route::post('/logout', [AuthController::class, 'logout']);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Protected routes
Route::apiResource('projects', ProjectController::class);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;});&lt;/p&gt;

&lt;p&gt;Frontend Integration (React)&lt;/p&gt;

&lt;p&gt;Riad Hasan's React authentication hook:&lt;/p&gt;

&lt;p&gt;// hooks/useAuth.js&lt;br&gt;
import { useState, useEffect, useContext, createContext } from 'react';&lt;/p&gt;

&lt;p&gt;const AuthContext = createContext(null);&lt;/p&gt;

&lt;p&gt;export function AuthProvider({ children }) {&lt;br&gt;
  const [user, setUser] = useState(null);&lt;br&gt;
  const [loading, setLoading] = useState(true);&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    checkAuth();&lt;br&gt;
  }, []);&lt;/p&gt;

&lt;p&gt;const checkAuth = async () =&amp;gt; {&lt;br&gt;
    const token = localStorage.getItem('token');&lt;br&gt;
    if (token) {&lt;br&gt;
      try {&lt;br&gt;
        const response = await fetch('/api/user', {&lt;br&gt;
          headers: {&lt;br&gt;
            Authorization: &lt;code&gt;Bearer ${token}&lt;/code&gt;,&lt;br&gt;
          },&lt;br&gt;
        });&lt;br&gt;
        if (response.ok) {&lt;br&gt;
          const userData = await response.json();&lt;br&gt;
          setUser(userData);&lt;br&gt;
        } else {&lt;br&gt;
          localStorage.removeItem('token');&lt;br&gt;
        }&lt;br&gt;
      } catch (error) {&lt;br&gt;
        localStorage.removeItem('token');&lt;br&gt;
      }&lt;br&gt;
    }&lt;br&gt;
    setLoading(false);&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;const login = async (email, password) =&amp;gt; {&lt;br&gt;
    const response = await fetch('/api/login', {&lt;br&gt;
      method: 'POST',&lt;br&gt;
      headers: {&lt;br&gt;
        'Content-Type': 'application/json',&lt;br&gt;
      },&lt;br&gt;
      body: JSON.stringify({&lt;br&gt;
        email,&lt;br&gt;
        password,&lt;br&gt;
        device_name: 'web-browser',&lt;br&gt;
      }),&lt;br&gt;
    });&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (!response.ok) {
  throw new Error('Invalid credentials');
}

const data = await response.json();
localStorage.setItem('token', data.token);
setUser(data.user);
return data;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;p&gt;const logout = async () =&amp;gt; {&lt;br&gt;
    const token = localStorage.getItem('token');&lt;br&gt;
    await fetch('/api/logout', {&lt;br&gt;
      method: 'POST',&lt;br&gt;
      headers: {&lt;br&gt;
        Authorization: &lt;code&gt;Bearer ${token}&lt;/code&gt;,&lt;br&gt;
      },&lt;br&gt;
    });&lt;br&gt;
    localStorage.removeItem('token');&lt;br&gt;
    setUser(null);&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;br&gt;
      {children}&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;export const useAuth = () =&amp;gt; useContext(AuthContext);&lt;/p&gt;

&lt;p&gt;Solution 2: Laravel Passport for OAuth2&lt;/p&gt;

&lt;p&gt;When Riad Hasan needs third-party app access, he uses Passport.&lt;br&gt;
Setup&lt;/p&gt;

&lt;p&gt;composer require laravel/passport&lt;br&gt;
php artisan passport:install&lt;/p&gt;

&lt;p&gt;Configuration&lt;/p&gt;

&lt;p&gt;// app/Models/User.php&lt;br&gt;
use Laravel\Passport\HasApiTokens;&lt;/p&gt;

&lt;p&gt;class User extends Authenticatable&lt;br&gt;
{&lt;br&gt;
    use HasApiTokens, Notifiable;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Creating OAuth Clients&lt;/p&gt;

&lt;h1&gt;
  
  
  Password grant client (first-party apps)
&lt;/h1&gt;

&lt;p&gt;php artisan passport:client --password&lt;/p&gt;

&lt;h1&gt;
  
  
  Client credentials grant (machine-to-machine)
&lt;/h1&gt;

&lt;p&gt;php artisan passport:client --client&lt;/p&gt;

&lt;p&gt;Riad Hasan's OAuth Controller&lt;/p&gt;

&lt;p&gt;// app/Http/Controllers/Api/OAuthController.php&lt;br&gt;
&amp;lt;?php&lt;/p&gt;

&lt;p&gt;namespace App\Http\Controllers\Api;&lt;/p&gt;

&lt;p&gt;use App\Http\Controllers\Controller;&lt;br&gt;
use Illuminate\Http\Request;&lt;br&gt;
use Laravel\Passport\Client;&lt;br&gt;
use Laravel\Passport\Http\Controllers\AccessTokenController;&lt;br&gt;
use Psr\Http\Message\ServerRequestInterface;&lt;/p&gt;

&lt;p&gt;class OAuthController extends Controller&lt;br&gt;
{&lt;br&gt;
    public function issueToken(ServerRequestInterface $request)&lt;br&gt;
    {&lt;br&gt;
        $controller = app(AccessTokenController::class);&lt;br&gt;
        return $controller-&amp;gt;issueToken($request);&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function refreshToken(Request $request)
{
    $request-&amp;gt;validate([
        'refresh_token' =&amp;gt; 'required',
    ]);

    $client = Client::where('password_client', 1)-&amp;gt;first();

    $response = \Http::asForm()-&amp;gt;post(url('/oauth/token'), [
        'grant_type' =&amp;gt; 'refresh_token',
        'refresh_token' =&amp;gt; $request-&amp;gt;refresh_token,
        'client_id' =&amp;gt; $client-&amp;gt;id,
        'client_secret' =&amp;gt; $client-&amp;gt;secret,
        'scope' =&amp;gt; '',
    ]);

    return $response-&amp;gt;json();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Solution 3: API Keys for Machine-to-Machine&lt;/p&gt;

&lt;p&gt;For services and webhooks, Riad Hasan uses simple API keys.&lt;br&gt;
Migration&lt;/p&gt;

&lt;p&gt;// database/migrations/create_api_keys_table.php&lt;br&gt;
Schema::create('api_keys', function (Blueprint $table) {&lt;br&gt;
    $table-&amp;gt;id();&lt;br&gt;
    $table-&amp;gt;foreignId('user_id')-&amp;gt;constrained()-&amp;gt;onDelete('cascade');&lt;br&gt;
    $table-&amp;gt;string('name');&lt;br&gt;
    $table-&amp;gt;string('key', 64)-&amp;gt;unique();&lt;br&gt;
    $table-&amp;gt;text('permissions')-&amp;gt;nullable();&lt;br&gt;
    $table-&amp;gt;timestamp('last_used_at')-&amp;gt;nullable();&lt;br&gt;
    $table-&amp;gt;timestamps();&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;Middleware&lt;/p&gt;

&lt;p&gt;// app/Http/Middleware/ApiKeyAuth.php&lt;br&gt;
&amp;lt;?php&lt;/p&gt;

&lt;p&gt;namespace App\Http\Middleware;&lt;/p&gt;

&lt;p&gt;use Closure;&lt;br&gt;
use Illuminate\Http\Request;&lt;br&gt;
use App\Models\ApiKey;&lt;/p&gt;

&lt;p&gt;class ApiKeyAuth&lt;br&gt;
{&lt;br&gt;
    public function handle(Request $request, Closure $next)&lt;br&gt;
    {&lt;br&gt;
        $key = $request-&amp;gt;header('X-API-KEY') ?? $request-&amp;gt;query('api_key');&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    if (!$key) {
        return response()-&amp;gt;json([
            'error' =&amp;gt; 'API key required',
        ], 401);
    }

    $apiKey = ApiKey::where('key', $key)-&amp;gt;first();

    if (!$apiKey) {
        return response()-&amp;gt;json([
            'error' =&amp;gt; 'Invalid API key',
        ], 401);
    }

    // Update last used
    $apiKey-&amp;gt;update(['last_used_at' =&amp;gt; now()]);

    $request-&amp;gt;setUserResolver(function () use ($apiKey) {
        return $apiKey-&amp;gt;user;
    });

    return $next($request);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Riad Hasan's Security Best Practices&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Token Expiration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;// config/sanctum.php&lt;br&gt;
'expiration' =&amp;gt; 60 * 24, // 24 hours for sensitive apps&lt;/p&gt;

&lt;p&gt;// Or dynamically&lt;br&gt;
$token = $user-&amp;gt;createToken('device', ['*'], now()-&amp;gt;addHours(4));&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rate Limiting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;// app/Http/Kernel.php&lt;br&gt;
protected $middlewareAliases = [&lt;br&gt;
    'throttle.auth' =&amp;gt; \App\Http\Middleware\ThrottleAuth::class,&lt;br&gt;
];&lt;/p&gt;

&lt;p&gt;// routes/api.php&lt;br&gt;
Route::post('/login', [AuthController::class, 'login'])&lt;br&gt;
    -&amp;gt;middleware('throttle:5,1'); // 5 attempts per minute&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Token Abilities&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;// Create token with limited abilities&lt;br&gt;
$token = $user-&amp;gt;createToken('read-only', ['read']);&lt;/p&gt;

&lt;p&gt;// Check ability in controller&lt;br&gt;
if (!$request-&amp;gt;user()-&amp;gt;tokenCan('write')) {&lt;br&gt;
    return response()-&amp;gt;json(['error' =&amp;gt; 'Insufficient permissions'], 403);&lt;br&gt;
}&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Secure Password Reset&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan's password reset flow:&lt;/p&gt;

&lt;p&gt;// app/Http/Controllers/Api/PasswordResetController.php&lt;br&gt;
public function reset(Request $request)&lt;br&gt;
{&lt;br&gt;
    $request-&amp;gt;validate([&lt;br&gt;
        'token' =&amp;gt; 'required',&lt;br&gt;
        'email' =&amp;gt; 'required|email',&lt;br&gt;
        'password' =&amp;gt; 'required|confirmed|min:8',&lt;br&gt;
    ]);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$status = Password::reset(
    $request-&amp;gt;only('email', 'password', 'password_confirmation', 'token'),
    function ($user, $password) {
        $user-&amp;gt;forceFill([
            'password' =&amp;gt; Hash::make($password),
        ])-&amp;gt;setRememberToken(Str::random(60));
        $user-&amp;gt;save();

        // Revoke all existing tokens
        $user-&amp;gt;tokens()-&amp;gt;delete();

        event(new PasswordReset($user));
    }
);

return $status === Password::PASSWORD_RESET
    ? response()-&amp;gt;json(['message' =&amp;gt; 'Password reset successfully'])
    : response()-&amp;gt;json(['error' =&amp;gt; 'Unable to reset password'], 400);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Common Mistakes Riad Hasan Avoids&lt;br&gt;
Mistake     Solution&lt;br&gt;
Storing tokens in localStorage  Use httpOnly cookies for sensitive apps&lt;br&gt;
No token expiration     Always set expiration times&lt;br&gt;
Not revoking tokens on logout   Delete tokens server-side&lt;br&gt;
Using Passport for simple SPAs  Use Sanctum instead&lt;br&gt;
No rate limiting on auth endpoints  Implement throttle middleware&lt;br&gt;
Storing plain API keys  Hash keys like passwords&lt;br&gt;
Work with Riad Hasan&lt;/p&gt;

&lt;p&gt;Riad Hasan specializes in building secure, scalable APIs with Laravel. He offers:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Laravel API development
Authentication system implementation
Security audits
Performance optimization
Team training and consultation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Connect with Riad Hasan:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Portfolio: riadhasan.io
Projects: riadhasan.io/projects
LinkedIn: linkedin.com/in/riad-hasan-100a231a6
GitHub: github.com/RiadHasan15
Email: hire.riadhasan@gmail.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Which authentication method do you prefer for your Laravel APIs? Share your experience in the comments.&lt;/p&gt;

&lt;h1&gt;
  
  
  laravel #php #api #authentication #webdev #security #sanctum #passport #webdevelopment
&lt;/h1&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>webdev</category>
    </item>
    <item>
      <title>WordPress Performance Optimization — A Developer's Guide by Riad Hasan</title>
      <dc:creator>Riad Hasan</dc:creator>
      <pubDate>Mon, 04 May 2026 00:03:02 +0000</pubDate>
      <link>https://dev.to/riadhasan11/wordpress-performance-optimization-a-developers-guide-by-riad-hasan-g5a</link>
      <guid>https://dev.to/riadhasan11/wordpress-performance-optimization-a-developers-guide-by-riad-hasan-g5a</guid>
      <description>&lt;p&gt;Riad Hasan has optimized dozens of WordPress sites for clients worldwide. In this guide, he shares the exact techniques he uses to achieve sub-2-second load times and perfect Core Web Vitals scores.&lt;/p&gt;

&lt;p&gt;Performance isn't just about speed — it impacts SEO, user experience, and conversions. Riad Hasan explains his systematic approach to WordPress optimization.&lt;br&gt;
Why WordPress Performance Matters&lt;/p&gt;

&lt;p&gt;Google's Core Web Vitals are now ranking factors. A slow WordPress site loses:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;7% conversion rate for every 1-second delay
11% page views from frustrated visitors
16% customer satisfaction drop

"I've seen businesses double their leads just by fixing performance," Riad Hasan notes. "It's the highest-ROI improvement you can make."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Riad Hasan's WordPress Optimization Checklist&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hosting Foundation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before any code changes, Riad Hasan ensures the hosting is solid:&lt;br&gt;
Factor  Requirement&lt;br&gt;
PHP Version     8.1 or higher&lt;br&gt;
Memory Limit    256MB minimum&lt;br&gt;
Object Cache    Redis or Memcached&lt;br&gt;
SSL     HTTPS everywhere&lt;br&gt;
Server Response     Under 200ms&lt;/p&gt;

&lt;p&gt;He recommends:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cloudways — For managed hosting with Redis
Kinsta — Premium managed WordPress
DigitalOcean — For custom server setups
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Theme Optimization&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan builds custom themes that are performance-first:&lt;/p&gt;

&lt;p&gt;What he removes:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jQuery dependency (use vanilla JS)
Unnecessary CSS frameworks
Page builders (Divi, Elementor, WPBakery)
Bloated starter themes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;What he adds:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Critical CSS inline
Deferred JavaScript loading
Optimized font loading (font-display: swap)
Lazy loading for images and iframes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;// Riad Hasan's functions.php optimizations&lt;br&gt;
function riad_optimize_scripts() {&lt;br&gt;
    // Remove jQuery migrate&lt;br&gt;
    wp_deregister_script('jquery-migrate');&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Defer all JS
add_filter('script_loader_tag', function($tag) {
    return str_replace(' src', ' defer src', $tag);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
add_action('wp_enqueue_scripts', 'riad_optimize_scripts');&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Plugin Audit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan follows a strict plugin philosophy:&lt;/p&gt;

&lt;p&gt;Keep:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WooCommerce (if e-commerce)
Yoast SEO or Rank Math
WP Rocket or custom caching
Imagify or ShortPixel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Remove:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Contact form plugins (build custom)
Social sharing plugins (add manually)
Analytics plugins (use GTM)
Backup plugins (server-level backups)
Admin toolbar plugins

"Every plugin adds overhead. I count each one as a performance cost," Riad Hasan explains.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Database Optimization&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan's database cleanup routine:&lt;/p&gt;

&lt;p&gt;-- Clean post revisions&lt;br&gt;
DELETE FROM wp_posts WHERE post_type = 'revision';&lt;/p&gt;

&lt;p&gt;-- Clean auto-drafts&lt;br&gt;
DELETE FROM wp_posts WHERE post_status = 'auto-draft';&lt;/p&gt;

&lt;p&gt;-- Clean trashed content&lt;br&gt;
DELETE FROM wp_posts WHERE post_status = 'trash';&lt;/p&gt;

&lt;p&gt;-- Clean orphaned postmeta&lt;br&gt;
DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts p ON pm.post_id = p.ID WHERE p.ID IS NULL;&lt;/p&gt;

&lt;p&gt;-- Clean transient options&lt;br&gt;
DELETE FROM wp_options WHERE option_name LIKE '&lt;em&gt;transient&lt;/em&gt;%';&lt;br&gt;
DELETE FROM wp_options WHERE option_name LIKE '&lt;em&gt;site_transient&lt;/em&gt;%';&lt;/p&gt;

&lt;p&gt;He also:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Limits post revisions to 3
Sets auto-save interval to 60 seconds
Removes spam comments weekly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Image Optimization&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan's image workflow:&lt;br&gt;
Step    Tool    Result&lt;br&gt;
Compression     ShortPixel/Imagify  70% size reduction&lt;br&gt;
Format  WebP    25% smaller than JPEG&lt;br&gt;
Lazy Load   Native + JS fallback    Faster initial load&lt;br&gt;
CDN     Cloudflare/BunnyCDN     Global delivery&lt;/p&gt;

&lt;p&gt;He adds responsive images manually:&lt;/p&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img&gt;&lt;/a&gt;
  src="image-800.webp" &lt;br&gt;
  srcset="image-400.webp 400w, image-800.webp 800w, image-1200.webp 1200w"&lt;br&gt;
  sizes="(max-width: 600px) 100vw, 800px"&lt;br&gt;
  loading="lazy"&lt;br&gt;
  alt="Descriptive alt text"&lt;br&gt;
/&amp;gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Caching Strategy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan implements multi-layer caching:&lt;/p&gt;

&lt;p&gt;Browser Caching (.htaccess):&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
  ExpiresActive On&lt;br&gt;
  ExpiresByType image/webp "access plus 1 year"&lt;br&gt;
  ExpiresByType image/jpeg "access plus 1 year"&lt;br&gt;
  ExpiresByType image/png "access plus 1 year"&lt;br&gt;
  ExpiresByType text/css "access plus 1 month"&lt;br&gt;
  ExpiresByType application/javascript "access plus 1 month"&lt;br&gt;
  ExpiresByType font/woff2 "access plus 1 year"&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Object Caching (Redis):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database query caching
Transient caching
WooCommerce session caching
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Page Caching (WP Rocket or custom):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTML page cache
CSS/JS minification
Delayed JavaScript execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;WooCommerce Optimization&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For e-commerce sites, Riad Hasan applies extra optimizations:&lt;/p&gt;

&lt;p&gt;Cart Fragment Removal:&lt;/p&gt;

&lt;p&gt;// Disable WooCommerce cart fragments&lt;br&gt;
function riad_disable_cart_fragments() {&lt;br&gt;
    wp_dequeue_script('wc-cart-fragments');&lt;br&gt;
}&lt;br&gt;
add_action('wp_enqueue_scripts', 'riad_disable_cart_fragments');&lt;/p&gt;

&lt;p&gt;Additional WooCommerce optimizations:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Disable scripts on non-shop pages
Limit related products to 4
Use product galleries efficiently
Implement AJAX cart sparingly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Core Web Vitals Fixes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan's LCP optimization:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Preload critical images
Use server push for fonts
Optimize above-the-fold content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;CLS prevention:&lt;/p&gt;

&lt;p&gt;img {&lt;br&gt;
  aspect-ratio: attr(width) / attr(height);&lt;br&gt;
  height: auto;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;FID improvement:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Break up long tasks
Use web workers for heavy JS
Minimize main thread work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Before and After: Riad Hasan's Results&lt;br&gt;
Metric  Before  After&lt;br&gt;
Load Time   5.2s    1.4s&lt;br&gt;
LCP     4.8s    1.2s&lt;br&gt;
FID     180ms   45ms&lt;br&gt;
CLS     0.25    0.02&lt;br&gt;
Page Size   3.2MB   450KB&lt;br&gt;
Requests    85  22&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Every site I optimize follows this same systematic approach," Riad Hasan says. "The results are consistent."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Work with Riad Hasan&lt;/p&gt;

&lt;p&gt;Riad Hasan offers WordPress performance optimization as part of his full stack development services. He works with:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WordPress performance audits
WooCommerce optimization
Custom theme development
Headless WordPress builds
Ongoing maintenance and monitoring
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Connect with Riad Hasan:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Portfolio: riadhasan.io
Projects: riadhasan.io/projects
LinkedIn: linkedin.com/in/riad-hasan-100a231a6
GitHub: github.com/RiadHasan15
Email: hire.riadhasan@gmail.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;What performance challenges are you facing with WordPress? Share in the comments.&lt;/p&gt;

&lt;h1&gt;
  
  
  wordpress #performance #webdev #corewebvitals #optimization #php #woocommerce #webdevelopment
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>wordpress</category>
      <category>performance</category>
    </item>
    <item>
      <title>How Riad Hasan Builds Scalable Web Applications</title>
      <dc:creator>Riad Hasan</dc:creator>
      <pubDate>Sun, 03 May 2026 23:43:40 +0000</pubDate>
      <link>https://dev.to/riadhasan11/how-riad-hasan-builds-scalable-web-applications-3lm3</link>
      <guid>https://dev.to/riadhasan11/how-riad-hasan-builds-scalable-web-applications-3lm3</guid>
      <description>&lt;p&gt;Riad Hasan is a Full Stack Developer who has spent over 5 years building web applications that scale. From Laravel APIs to React frontends, his approach focuses on clean architecture, performance, and maintainability.&lt;/p&gt;

&lt;p&gt;In this article, Riad Hasan shares the principles and practices he follows when building production-ready web applications.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with Architecture, Not Code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before writing a single line of code, Riad Hasan maps out the system architecture. This includes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Data flow diagrams — How data moves through the application
API contracts — Defining endpoints before implementation
Component structure — Planning frontend architecture

"The time you spend planning saves 10x the time debugging later," Riad Hasan explains. "I've learned this the hard way."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Backend First, Frontend Second&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan typically builds from the backend outward:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database schema — Normalized, indexed, scalable
API layer — RESTful, versioned, documented
Business logic — Services, repositories, clean separation
Frontend integration — React components consuming APIs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This approach ensures the foundation is solid before adding the presentation layer.&lt;/p&gt;

&lt;p&gt;His Laravel stack typically includes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Laravel as the framework
MySQL for relational data
Redis for caching and sessions
Queue workers for background jobs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Performance is a Feature, Not an Afterthought&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan optimizes for Core Web Vitals throughout development:&lt;br&gt;
Metric  Target  How He Achieves It&lt;br&gt;
LCP     &amp;lt; 2.5s  Image optimization, lazy loading, CDN&lt;br&gt;
FID     &amp;lt; 100ms     Minimal JavaScript, deferred scripts&lt;br&gt;
CLS     &amp;lt; 0.1   Reserved space for dynamic content&lt;/p&gt;

&lt;p&gt;He uses tools like:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lighthouse — Regular audits during development
WebPageTest — Deep performance analysis
Chrome DevTools — Runtime performance debugging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;SEO-Driven Development&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Unlike many developers who treat SEO as a marketing concern, Riad Hasan integrates SEO into the development process:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Semantic HTML — Proper heading hierarchy, ARIA labels
Structured data — JSON-LD schema for rich snippets
Meta management — Dynamic titles, descriptions, Open Graph
Sitemap generation — Automated, always up-to-date
Canonical URLs — Preventing duplicate content issues

"SEO isn't something you add at the end. It's how you build," says Riad Hasan.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;WordPress Without the Bloat&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For WordPress projects, Riad Hasan follows a strict philosophy:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Custom themes — No page builders, clean PHP templates
Minimal plugins — Only essential functionality
Headless when needed — Decoupled frontend with REST API
Performance optimization — Object caching, image optimization, CDN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;His WooCommerce builds focus on:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Streamlined checkout flows
Custom payment integrations
Inventory management systems
Headless storefronts with React
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Testing and Quality Assurance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Riad Hasan implements testing at multiple levels:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unit tests — PHPUnit for Laravel, Jest for React
Feature tests — API endpoint validation
Browser tests — Laravel Dusk, Cypress for critical flows
Code quality — PHP_CodeSniffer, ESLint, Prettier

"Tests are documentation that never goes stale," Riad Hasan notes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Deployment and DevOps&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;His deployment pipeline typically includes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Git-based workflow — Feature branches, pull requests
CI/CD — Automated testing before merge
Zero-downtime deployments — Blue-green or rolling updates
Monitoring — Error tracking, performance monitoring
Backups — Automated, tested, off-site
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Notable Projects by Riad Hasan&lt;/p&gt;

&lt;p&gt;Riad Hasan has built applications across various industries:&lt;br&gt;
Project     Type    Stack&lt;br&gt;
Wooverse    Headless E-commerce     WordPress, Next.js, WooCommerce&lt;br&gt;
Doctor's Portfolio  Medical Platform    React, Laravel, MySQL&lt;br&gt;
NexaPro AI SaaS     SaaS Landing    React, Tailwind CSS&lt;br&gt;
Bills Music Center  E-commerce  WordPress, WooCommerce&lt;/p&gt;

&lt;p&gt;View all projects at riadhasan.io/projects.&lt;br&gt;
Work with Riad Hasan&lt;/p&gt;

&lt;p&gt;Riad Hasan is available for:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Full stack web development
Laravel backend development
React frontend applications
WordPress and WooCommerce solutions
API design and integration
Performance optimization
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Connect with Riad Hasan:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Portfolio: riadhasan.io
LinkedIn: linkedin.com/in/riad-hasan-100a231a6
GitHub: github.com/RiadHasan15
Email: hire.riadhasan@gmail.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;What development practices do you follow? Share your approach in the comments below.&lt;/p&gt;

&lt;h1&gt;
  
  
  webdev #laravel #react #wordpress #fullstack #webdevelopment #php #scalability
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>webapp</category>
      <category>riadhasan</category>
      <category>programming</category>
    </item>
    <item>
      <title>About Riad Hasan — Full Stack Developer (Laravel &amp; WordPress)</title>
      <dc:creator>Riad Hasan</dc:creator>
      <pubDate>Sun, 08 Feb 2026 14:15:27 +0000</pubDate>
      <link>https://dev.to/riadhasan11/about-riad-hasan-full-stack-developer-laravel-wordpress-48d8</link>
      <guid>https://dev.to/riadhasan11/about-riad-hasan-full-stack-developer-laravel-wordpress-48d8</guid>
      <description>&lt;p&gt;Hi, I’m Riad Hasan — a Full Stack Developer specializing in Laravel and WordPress. I build fast, SEO-friendly websites and scalable web applications focused on clean architecture and real performance.&lt;/p&gt;

&lt;p&gt;Official portfolio: &lt;a href="https://riadhasan.io/about" rel="noopener noreferrer"&gt;https://riadhasan.io/about&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I do&lt;/strong&gt;&lt;br&gt;
Laravel backends: APIs, dashboards, authentication, integrations&lt;br&gt;
WordPress/WooCommerce: custom themes, plugins, headless setups&lt;br&gt;
Performance &amp;amp; SEO: Core Web Vitals, structured data, technical SEO fixes&lt;br&gt;
UI/UX: responsive layouts with consistent design systems&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here are a few projects from my portfolio:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Projects page: &lt;a href="https://riadhasan.io/projects" rel="noopener noreferrer"&gt;https://riadhasan.io/projects&lt;/a&gt;&lt;br&gt;
Case study: &lt;a href="https://riadhasan.io/projects/wooverse" rel="noopener noreferrer"&gt;https://riadhasan.io/projects/wooverse&lt;/a&gt;&lt;br&gt;
Case study: &lt;a href="https://riadhasan.io/projects/doctors-portfolio" rel="noopener noreferrer"&gt;https://riadhasan.io/projects/doctors-portfolio&lt;/a&gt;&lt;br&gt;
Case study: &lt;a href="https://riadhasan.io/projects/nexapro-ai-saas" rel="noopener noreferrer"&gt;https://riadhasan.io/projects/nexapro-ai-saas&lt;/a&gt;&lt;br&gt;
How to contact me&lt;br&gt;
If you want to work together, reach me here:&lt;/p&gt;

&lt;p&gt;Portfolio contact section: &lt;a href="https://riadhasan.io/#contact" rel="noopener noreferrer"&gt;https://riadhasan.io/#contact&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/riad-hasan-100a231a6/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/riad-hasan-100a231a6/&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/RiadHasan15" rel="noopener noreferrer"&gt;https://github.com/RiadHasan15&lt;/a&gt;&lt;br&gt;
Thanks for reading.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>webdeveloper</category>
      <category>riadhasan</category>
      <category>fullstack</category>
    </item>
  </channel>
</rss>
