<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Break · Build · Repeat</title><link>http://ashishji.is-a.dev/blog/</link><description>Recent content on Break · Build · Repeat</description><image><title>Break · Build · Repeat</title><url>http://ashishji.is-a.dev/blog/og-default-200.png</url><link>http://ashishji.is-a.dev/blog/og-default-200.png</link></image><generator>Hugo -- 0.152.2</generator><language>en-us</language><lastBuildDate>Fri, 03 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://ashishji.is-a.dev/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260403/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260403/</guid><description>&lt;h1 id="creating-a-block"&gt;Creating a block&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;block.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;$schema&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;https://schemas.wp.org/trunk/block.json&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;apiVersion&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;create-block/copyright-date-block&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Copyright Date Block&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;category&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;widgets&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Display your site&amp;#39;s copyright date.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;: {},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;supports&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;background&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;html&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;typography&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;fontSize&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;textdomain&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;copyright-date-block&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;editorScript&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;file:./index.js&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;render&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;file:./render.php&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Similar to the &lt;code&gt;useBlockProps()&lt;/code&gt; function in the Editor, &lt;a href="https://developer.wordpress.org/reference/functions/get_block_wrapper_attributes/"&gt;&lt;code&gt;get_block_wrapper_attributes()&lt;/code&gt;&lt;/a&gt; outputs all the necessary CSS classes and styles in the &lt;a href="https://developer.wordpress.org/block-editor/getting-started/fundamentals/block-wrapper/#the-server-side-render-markup"&gt;block’s wrapper&lt;/a&gt;. Only the content needs to be updated.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;p &amp;lt;?php echo get_block_wrapper_attributes(); ?&amp;gt;&amp;gt;© &amp;lt;?php echo date( &amp;#34;Y&amp;#34; ); ?&amp;gt;&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;adding block attributes&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; {}&lt;span style="color:#960050;background-color:#1e0010"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;attributes&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;showStartingYear&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;boolean&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;startingYear&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#960050;background-color:#1e0010"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can create your own custom panels using the &lt;code&gt;InspectorControls&lt;/code&gt; component. The &lt;code&gt;InspectorControls&lt;/code&gt; belongs to the &lt;a href="https://developer.wordpress.org/block-editor/reference-guides/packages/packages-block-editor/"&gt;&lt;code&gt;@wordpress/block-editor&lt;/code&gt;&lt;/a&gt; package.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260402/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260402/</guid><description>&lt;p&gt;Gutenberg replaced the &amp;ldquo;Classic Editor&amp;rdquo; (which was essentially a digital typewriter) with a &lt;strong&gt;modular system&lt;/strong&gt;. Every element—a paragraph, an image, or a button—is a standalone object (a block).&lt;/p&gt;
&lt;h3 id="the-core-categories"&gt;The &amp;ldquo;Core&amp;rdquo; Categories:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Common Blocks:&lt;/strong&gt; The essentials (Paragraph, Heading, Image).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Formatting:&lt;/strong&gt; Tools for structured data like Table, Code snippets, or Pullquotes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Layout Elements:&lt;/strong&gt; These are &amp;ldquo;container&amp;rdquo; blocks. Columns, Groups, and Rows allow you to create complex grid structures without writing HTML/CSS from scratch.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260401/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260401/</guid><description>&lt;h1 id="notices"&gt;Notices&lt;/h1&gt;
&lt;p&gt;In the WordPress Block Editor, &lt;strong&gt;Notices&lt;/strong&gt; are UI messages used to inform users about events, errors, warnings, or successful operations. They are typically displayed at the top of the editor or inside specific UI components.&lt;/p&gt;
&lt;p&gt;WordPress provides a &lt;strong&gt;Notices API through the &lt;code&gt;@wordpress/notices&lt;/code&gt; package&lt;/strong&gt;, which integrates with the WordPress &lt;strong&gt;data store&lt;/strong&gt; system.&lt;/p&gt;
&lt;p&gt;Common use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Showing validation errors&lt;/li&gt;
&lt;li&gt;Confirming successful actions&lt;/li&gt;
&lt;li&gt;Displaying warnings or info messages&lt;/li&gt;
&lt;li&gt;Communicating background processes to the user&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="types-of-notices"&gt;Types of Notices&lt;/h2&gt;
&lt;p&gt;The main types of notices include:&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260331/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260331/</guid><description>&lt;h2 id="widgets-block-editor-overview"&gt;Widgets Block Editor Overview&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Widgets Block Editor&lt;/strong&gt; replaces the traditional Widgets screen in WordPress with a block-based interface similar to the post/page editor introduced with the Gutenberg.&lt;/p&gt;
&lt;p&gt;Instead of dragging classic widgets into widget areas, users can now insert &lt;strong&gt;blocks&lt;/strong&gt; into sidebars and widget areas.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Block-based editing experience&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Consistent UI with the post/page editor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Access to all available blocks in widget areas&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ability to mix &lt;strong&gt;blocks and legacy widgets&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260330/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260330/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Session Fixation&lt;/strong&gt; is a security vulnerability where an attacker &amp;ldquo;fixes&amp;rdquo; a user&amp;rsquo;s session ID before the user even logs in. If the application doesn&amp;rsquo;t change the session ID upon authentication, the attacker can use that pre-set ID to hijack the user&amp;rsquo;s account.&lt;/li&gt;
&lt;li&gt;Attacker visits target website and obtains valid session ID. Attacker traps victim to login with that session ID. &lt;code&gt;http://example.com/?PHPSESSID=123&lt;/code&gt;. Because the server did not issue a &lt;em&gt;new&lt;/em&gt; session ID after login, the old ID (&lt;code&gt;123&lt;/code&gt;) is now associated with the victim&amp;rsquo;s authenticated account.&lt;/li&gt;
&lt;li&gt;Modern WordPress (version 4.0 and later) has moved away from standard PHP native sessions (&lt;code&gt;PHPSESSID&lt;/code&gt;) and implemented a much more robust system that specifically defends against fixation.&lt;/li&gt;
&lt;li&gt;WordPress uses a custom session manager. When a user logs in, WordPress generates a brand-new, random &lt;strong&gt;Session Token&lt;/strong&gt;. Even if an attacker managed to plant a cookie on a user&amp;rsquo;s browser beforehand, that cookie is ignored or overwritten during the &lt;code&gt;wp_signon()&lt;/code&gt; process.
Session token stored in &lt;code&gt;wp_usermeta&lt;/code&gt; table for that user.
WordPress then sends that token to your browser wrapped inside a cookie (typically named &lt;code&gt;wordpress_logged_in_[hash]&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primitive Capabilities:&lt;/strong&gt; These are &amp;ldquo;hard&amp;rdquo; permissions stored in the database for a specific role (e.g., &lt;code&gt;edit_posts&lt;/code&gt;, &lt;code&gt;manage_options&lt;/code&gt;). They are a simple &amp;ldquo;Yes&amp;rdquo; or &amp;ldquo;No.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meta Capabilities:&lt;/strong&gt; These are &amp;ldquo;contextual&amp;rdquo; permissions that depend on a specific object, usually a Post ID (e.g., &lt;code&gt;edit_post&lt;/code&gt;, &lt;code&gt;delete_post&lt;/code&gt;).****&lt;/li&gt;
&lt;li&gt;When you call &lt;code&gt;current_user_can('edit_post', 123)&lt;/code&gt;, WordPress runs &lt;code&gt;map_meta_cap&lt;/code&gt;. If Post 123 belongs to the current user, it maps the request to the primitive &lt;code&gt;edit_posts&lt;/code&gt;. If Post 123 belongs to someone else, it maps it to &lt;code&gt;edit_others_posts&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Custom Permission Logic:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Allow users to edit a post if they are the &amp;#34;Project Lead&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * via a custom meta field.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_filter&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;map_meta_cap&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;my_custom_project_permissions&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;my_custom_project_permissions&lt;/span&gt;( $caps, $cap, $user_id, $args ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 1. Target the specific meta capability
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#e6db74"&gt;&amp;#39;edit_post&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; $cap &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;delete_post&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; $cap ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $post_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $args[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;// The ID of the post being checked
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; $post_type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_post_type&lt;/span&gt;( $post_id );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 2. Only apply logic to our &amp;#39;project&amp;#39; post type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#e6db74"&gt;&amp;#39;project&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; $post_type ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Fetch the assigned &amp;#34;Lead&amp;#34; from post meta
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; $project_lead_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_post_meta&lt;/span&gt;( $post_id, &lt;span style="color:#e6db74"&gt;&amp;#39;_project_lead_id&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 3. If the current user is the Lead, give them the &amp;#39;exist&amp;#39; capability
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// &amp;#39;exist&amp;#39; is a primitive cap everyone has, effectively granting permission.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( (&lt;span style="color:#a6e22e"&gt;int&lt;/span&gt;) $project_lead_id &lt;span style="color:#f92672"&gt;===&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;int&lt;/span&gt;) $user_id ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;exist&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Return the original capabilities for all other cases
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; $caps;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Never&lt;/strong&gt; return an empty array if you want to deny access. If you return an empty array, WordPress assumes no primitive capabilities are required, and the check will pass! To &lt;strong&gt;deny&lt;/strong&gt; access, you should return a capability that you know the user doesn&amp;rsquo;t have, such as &lt;code&gt;'do_not_allow'&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260327/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260327/</guid><description>&lt;h1 id="dynamic-blocks-gutenberg"&gt;Dynamic Blocks (Gutenberg)&lt;/h1&gt;
&lt;p&gt;Dynamic blocks render content at runtime instead of saving full HTML in the database.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Rendering:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Server-side (PHP) — most common&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Client-side (JavaScript)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;save()&lt;/code&gt; must return &lt;code&gt;null&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="when-to-use"&gt;When to Use&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Data-driven content (posts, APIs)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Frequently changing content&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Centralized rendering logic&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="basic-dynamic-block-js"&gt;Basic Dynamic Block (JS)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;registerBlockType&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@wordpress/blocks&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;registerBlockType&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;my-plugin/dynamic-block&amp;#39;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Dynamic Block&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;category&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;widgets&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;attributes&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Hello&amp;#39;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;edit&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; ({ &lt;span style="color:#a6e22e"&gt;attributes&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;setAttributes&lt;/span&gt; }) =&amp;gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;attributes&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;onChange&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;setAttributes&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; })}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; () =&amp;gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="server-side-rendering-php"&gt;Server-side Rendering (PHP)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;render_dynamic_block&lt;/span&gt;($attributes) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $message &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $attributes[&lt;span style="color:#e6db74"&gt;&amp;#39;message&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;??&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;div&amp;gt;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;esc_html&lt;/span&gt;($message) &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;init&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;register_block_type&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;__DIR__&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/build&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;render_callback&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;render_dynamic_block&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;No static markup stored&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260326/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260326/</guid><description>&lt;h1 id="block-editor"&gt;Block Editor&lt;/h1&gt;
&lt;p&gt;The &lt;strong&gt;WordPress Block Editor (Gutenberg)&lt;/strong&gt; is a modern editing experience that allows content to be created using modular components called &lt;strong&gt;blocks&lt;/strong&gt;. Each block represents a piece of content such as text, images, lists, or custom UI elements.&lt;/p&gt;
&lt;p&gt;Creating custom blocks allows developers to extend the editor with tailored functionality suited to specific websites or applications.&lt;/p&gt;
&lt;p&gt;The process of learning block development typically begins with a simple example and progressively adds functionality such as attributes, controls, styling, and dynamic rendering.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260325/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260325/</guid><description>&lt;h2 id="hooks-in-react"&gt;Hooks in React&lt;/h2&gt;
&lt;p&gt;Hooks are functions that let you use state and lifecycle features in functional components. Introduced in React 16.8, they eliminate the need for class components in most cases.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="common-hooks"&gt;Common Hooks&lt;/h3&gt;
&lt;h4 id="usestate"&gt;useState&lt;/h4&gt;
&lt;p&gt;Manages local component state.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Points&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Returns current state and a setter function&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;State updates trigger re-render&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;State is preserved across renders&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Code Example&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;useState&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Counter&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;setCount&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useState&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;&lt;span style="color:#a6e22e"&gt;Count&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;}&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{() =&amp;gt; &lt;span style="color:#a6e22e"&gt;setCount&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)}&amp;gt;&lt;span style="color:#a6e22e"&gt;Increment&lt;/span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Counter&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="useeffect"&gt;useEffect&lt;/h4&gt;
&lt;p&gt;Handles side effects such as API calls, subscriptions, or DOM updates.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260324/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260324/</guid><description>&lt;h2 id="react-functional-components"&gt;React Functional Components&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Functional components are JavaScript functions that return JSX and are the modern standard for building React applications. They are simpler, easier to read, and support hooks for state and lifecycle management.
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Defined as plain JavaScript functions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use React Hooks (e.g., useState, useEffect) for state and side effects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No need for &lt;code&gt;this&lt;/code&gt; keyword.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Preferred over class components in modern React.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easier to test and reuse.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;useState&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;useEffect&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FunctionalComponent&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;setCount&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useState&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;useEffect&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Component mounted or updated&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, [&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Count&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;}&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/p&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{() =&amp;gt; &lt;span style="color:#a6e22e"&gt;setCount&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)}&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Increment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/button&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FunctionalComponent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="react-class-components"&gt;React Class Components&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Class components are ES6 classes that extend `React.Component` and include lifecycle methods and internal state. They were widely used before hooks were introduced.
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Must extend &lt;code&gt;React.Component&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260323/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260323/</guid><description>&lt;p&gt;By default, WordPress provides several built-in sections you can hook into or build upon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Site Identity:&lt;/strong&gt; Site title, tagline, and logo/favicon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Colors:&lt;/strong&gt; Background colors, header colors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Header Media:&lt;/strong&gt; Header images or videos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Background Image:&lt;/strong&gt; Site-wide background image settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Menus:&lt;/strong&gt; Menu creation and location assignment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Widgets:&lt;/strong&gt; Managing widget areas directly from the front end.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Homepage Settings:&lt;/strong&gt; Choosing between a static page or latest posts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Additional CSS:&lt;/strong&gt; A built-in code editor for custom styles.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260320/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260320/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cache Stampede, Customizer API : Selective Refresh vs postMessage, Webpack&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;component&lt;/strong&gt; is a reusable, independent unit of UI in React.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Each component &lt;strong&gt;must return JSX&lt;/strong&gt; (cannot return &lt;code&gt;undefined&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A React app can be visualized as a &lt;strong&gt;tree of components&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="functional-components"&gt;Functional Components&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Defined as JavaScript functions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Accept &lt;strong&gt;props&lt;/strong&gt; (input data from parent).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Return JSX.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Welcome&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;props&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;h1&lt;/span&gt;&amp;gt;&lt;span style="color:#a6e22e"&gt;Hello&lt;/span&gt;, {&lt;span style="color:#a6e22e"&gt;props&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;}&amp;lt;/&lt;span style="color:#f92672"&gt;h1&lt;/span&gt;&amp;gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="using-components-and-props"&gt;Using Components and Props&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Props are &lt;strong&gt;read-only inputs&lt;/strong&gt; passed from parent → child.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260319/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260319/</guid><description>&lt;h1 id="decoupled-wordpress-advanced-notes"&gt;Decoupled WordPress (Advanced Notes)&lt;/h1&gt;
&lt;h2 id="concept"&gt;Concept&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;decoupled (headless) WordPress architecture&lt;/strong&gt; separates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Backend (WordPress CMS)&lt;/strong&gt; → content management&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Frontend (React / Next.js / other)&lt;/strong&gt; → presentation layer&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="architecture-flow"&gt;Architecture Flow&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WordPress (REST API / GraphQL)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;API Layer (JSON)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Frontend (React / Next.js)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="headless-vs-decoupled"&gt;Headless vs Decoupled&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Headless&lt;/th&gt;
&lt;th&gt;Decoupled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Completely external&lt;/td&gt;
&lt;td&gt;External but may still use WP frontend partially&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rendering&lt;/td&gt;
&lt;td&gt;Fully independent&lt;/td&gt;
&lt;td&gt;Hybrid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibility&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;SPA / mobile apps&lt;/td&gt;
&lt;td&gt;Progressive migration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="enabling-api-in-wordpress"&gt;Enabling API in WordPress&lt;/h2&gt;
&lt;h3 id="rest-api-built-in"&gt;REST API (built-in)&lt;/h3&gt;
&lt;p&gt;Example endpoint:&lt;/p&gt;</description></item><item><title>TOTP Explained: How a Stopwatch and Math Replaced Your Password</title><link>http://ashishji.is-a.dev/blog/posts/totp/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/posts/totp/</guid><description>&lt;p&gt;&lt;img alt="TOTP Thumbnail" loading="lazy" src="http://ashishji.is-a.dev/blog/posts/TOTP_thumbnail2.png"&gt;&lt;/p&gt;
&lt;p&gt;Ever wondered about that six-digit code your authenticator app displays? The one that changes every 30 seconds? That&amp;rsquo;s &lt;strong&gt;TOTP (Time-based One-Time Password)&lt;/strong&gt;, and it&amp;rsquo;s one of the most elegant pieces of security technology we use every day.&lt;/p&gt;
&lt;h2 id="the-problem-with-passwords"&gt;The Problem with Passwords&lt;/h2&gt;
&lt;p&gt;Traditional username-password authentication is inherently vulnerable. Even with complex passwords containing letters, numerals, and symbols, a single data breach from an inadequately secured server or a malicious observer looking over your shoulder can expose your credentials and grant unlimited access to your account.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260318/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260318/</guid><description>&lt;h2 id="graphql-overview"&gt;GraphQL Overview&lt;/h2&gt;
&lt;p&gt;GraphQL is a strongly typed query language and runtime designed to enable clients to request exactly the data they need from an API. It was originally developed by Facebook and is now maintained by the GraphQL Foundation.&lt;/p&gt;
&lt;p&gt;Unlike traditional REST APIs, GraphQL exposes a single endpoint and allows clients to define the structure of the response, reducing over-fetching and under-fetching of data.&lt;/p&gt;
&lt;h3 id="key-characteristics"&gt;Key Characteristics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Declarative data fetching&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Strongly typed schema&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260317/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260317/</guid><description>&lt;h3 id="asset-building-using-webpack--babel"&gt;Asset Building using Webpack &amp;amp; Babel&lt;/h3&gt;
&lt;p&gt;Modern WordPress development often separates source code (ES6+, SCSS, modules) from production-ready assets (minified JS/CSS). Tools like Webpack and Babel enable this workflow.&lt;/p&gt;
&lt;h4 id="key-concepts"&gt;Key Concepts&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Module Bundling&lt;/strong&gt;: Combines multiple JavaScript files into a single optimized bundle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transpilation&lt;/strong&gt;: Converts modern JavaScript (ES6+) into backward-compatible versions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tree Shaking&lt;/strong&gt;: Removes unused code from final bundles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Loaders &amp;amp; Plugins&lt;/strong&gt;: Extend Webpack functionality (e.g., handling CSS, images).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="typical-project-structure"&gt;Typical Project Structure&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;theme/
├── src/
│ ├── js/
│ │ └── index.js
│ ├── scss/
│ │ └── style.scss
├── dist/
│ ├── bundle.js
│ └── style.css
├── webpack.config.js
├── package.json
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="webpack-configuration-example"&gt;Webpack Configuration Example&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exports&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;entry&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./src/js/index.js&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;output&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;__dirname&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;dist&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filename&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;bundle.js&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;rules&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;test&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/\.js$/&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;exclude&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/node_modules/&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;use&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;loader&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;babel-loader&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;test&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/\.scss$/&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;use&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;style-loader&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;css-loader&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;sass-loader&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mode&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="babel-configuration-babelrc"&gt;Babel Configuration (.babelrc)&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;presets&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;@babel/preset-env&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="enqueuing-compiled-assets-in-wordpress"&gt;Enqueuing Compiled Assets in WordPress&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme_enqueue_assets&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wp_enqueue_script&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;theme-bundle&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;get_template_directory_uri&lt;/span&gt;() &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/dist/bundle.js&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wp_enqueue_style&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;theme-style&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;get_template_directory_uri&lt;/span&gt;() &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/dist/style.css&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;wp_enqueue_scripts&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;theme_enqueue_assets&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="internal-mechanics"&gt;Internal Mechanics&lt;/h3&gt;
&lt;p&gt;Understanding WordPress internals is essential for extending functionality and debugging.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260316/</link><pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260316/</guid><description>&lt;h2 id="dashboard-widgets"&gt;Dashboard widgets&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback, $callback_args );&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$widget_id&lt;/code&gt;: an identifying slug for your widget. This will be used as its CSS class and its key in the array of widgets.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$widget_name&lt;/code&gt;: this is the name your widget will display in its heading.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$callback&lt;/code&gt;: The name of a function you will create that will display the actual contents of your widget.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$control_callback&lt;/code&gt; (Optional): The name of a function you create that will handle submission of widget options forms, and will also display the form elements.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$callback_args&lt;/code&gt; (Optional): Set of arguments for the callback function.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wporg_add_dashboard_widgets&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Add function here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;wp_dashboard_setup&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;wporg_add_dashboard_widgets&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# wp_network_dashboard_setup to use in network dashboard
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wporg_add_dashboard_widgets&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wp_add_dashboard_widget&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wporg_dashboard_widget&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Widget slug.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;esc_html__&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;Example Dashboard Widget&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;wporg&amp;#39;&lt;/span&gt; ), &lt;span style="color:#75715e"&gt;// Title.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wporg_dashboard_widget_render&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Display function.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;wp_dashboard_setup&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;wporg_add_dashboard_widgets&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wporg_dashboard_widget_render&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;esc_html_e&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#34;Howdy! I&amp;#39;m a great Dashboard Widget.&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;wporg&amp;#34;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Removing default widget&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Create the function to use in the action hook
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wporg_remove_dashboard_widget&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;remove_meta_box&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;dashboard_quick_press&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;dashboard&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;side&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Hook into the &amp;#39;wp_dashboard_setup&amp;#39; action to register our function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;wp_dashboard_setup&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;wporg_remove_dashboard_widget&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# use these instad of wp_add_dashboard_widget fn to place at custom position
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;add_meta_box&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;dashboard_widget_id&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;esc_html__&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;Dashboard Widget Title&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;wporg&amp;#39;&lt;/span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;dashboard_widget&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;dashboard&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;side&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;high&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;delete_expired_transients&lt;/code&gt; action is used to call function of same name, used to schedule deletion of expired transients daily.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;A widget adds content and features to a widget area (also called a sidebar).
A widget is a PHP object that outputs some HTML. The same kind of widget can be used multiple times on the same page (e.g. the Text Widget). Widgets can save data in the database (in the options table).&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260313/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260313/</guid><description>&lt;ul&gt;
&lt;li&gt;HEAD is much less well known than the other two. HEAD is essentially the same as a GET request except that it does not retrieve the data, only information about the data. This data describes such things as when the data was last updated, whether the client should cache the data, what type the data is, etc. Modern browsers often send HEAD requests to pages you have previously visited to determine if there are any updates.&lt;/li&gt;
&lt;li&gt;All good API clients utilize HEAD before performing a GET request to potentially save on bandwidth.&lt;/li&gt;
&lt;li&gt;GET, POST, HEAD are the most common used in wp.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status Code&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2xx&lt;/td&gt;
&lt;td&gt;Request was successful&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3xx&lt;/td&gt;
&lt;td&gt;Request was redirected to another URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4xx&lt;/td&gt;
&lt;td&gt;Request failed due to client error. Usually invalid authentication or missing data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5xx&lt;/td&gt;
&lt;td&gt;Request failed due to a server error. Commonly missing or misconfigured configuration files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$response = wp_remote_get( 'https://api.github.com/users/blobaugh' );&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The following defaults are assumed, though they can be changed via the $args parameter:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;method – GET&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260312/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260312/</guid><description>&lt;h1 id="customizer-api"&gt;Customizer API&lt;/h1&gt;
&lt;h2 id="overview-of-the-wordpress-customizer"&gt;Overview of the WordPress Customizer&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;WordPress Customizer&lt;/strong&gt; provides a user-friendly interface that allows website owners to modify theme settings and preview changes in real time before publishing them. It is designed primarily for non-technical users such as bloggers, designers, and business owners.&lt;/p&gt;
&lt;p&gt;The Customizer enables users to adjust theme elements such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Site title and tagline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Colors and typography&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Header and background images&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Menus and widgets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom theme options&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260311/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260311/</guid><description>&lt;h2 id="drop-ins"&gt;Drop-ins&lt;/h2&gt;
&lt;p&gt;WordPress &lt;strong&gt;drop-ins&lt;/strong&gt; are special PHP files placed directly in the &lt;code&gt;wp-content&lt;/code&gt; directory that override or extend specific WordPress core functionality. Unlike regular plugins, they are automatically loaded by WordPress if the file exists.&lt;/p&gt;
&lt;p&gt;Key characteristics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stored in &lt;code&gt;wp-content/&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatically detected and loaded&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cannot be activated or deactivated via the admin panel&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Used to replace or extend core behavior&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Visible under &lt;strong&gt;Plugins → Drop-ins&lt;/strong&gt; in the admin area&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Default WordPress drop-ins:&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260310/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260310/</guid><description>&lt;h2 id="email-integration-in-wordpress"&gt;Email Integration in WordPress&lt;/h2&gt;
&lt;p&gt;WordPress sends emails using the &lt;code&gt;wp_mail()&lt;/code&gt; function, which is a wrapper around PHP’s &lt;code&gt;mail()&lt;/code&gt; function. While it works for simple setups, it is unreliable in production environments because many hosting providers block or throttle PHP mail. Professional deployments typically use an SMTP or API-based email service. A commonly recommended solution is Amazon SES (Simple Email Service), which provides scalable and reliable email delivery.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wp_mail()&lt;/code&gt; basics&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;wp_mail()&lt;/code&gt; function sends emails using the WordPress mail system. It supports plain text and HTML emails and allows attachments and custom headers.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260309/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260309/</guid><description>&lt;h2 id="custom-database-tables-in-wordpress"&gt;Custom Database Tables in WordPress&lt;/h2&gt;
&lt;p&gt;A custom database table in WordPress is used when plugin data does not fit well into the default WordPress database schema. WordPress provides built-in tables such as &lt;code&gt;wp_posts&lt;/code&gt;, &lt;code&gt;wp_postmeta&lt;/code&gt;, &lt;code&gt;wp_users&lt;/code&gt;, and others. However, certain plugins require structured, high-performance storage that cannot be efficiently managed through post meta or options tables.&lt;/p&gt;
&lt;p&gt;Using custom tables allows developers to define their own schema optimized for the plugin’s data model.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260306/</link><pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260306/</guid><description>&lt;h1 id="wordpress-cron-api"&gt;WordPress Cron API&lt;/h1&gt;
&lt;h2 id="understanding-wp-cron"&gt;Understanding WP-Cron&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;WP-Cron&lt;/strong&gt; is WordPress’s task scheduling system used to run automated tasks such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;publishing scheduled posts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;checking for plugin/theme updates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sending scheduled emails&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cleaning temporary data&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;running background jobs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unlike a traditional &lt;strong&gt;Linux cron daemon&lt;/strong&gt;, WP-Cron:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;runs &lt;strong&gt;only when a page loads&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;does &lt;strong&gt;not run continuously&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;executes &lt;strong&gt;missed tasks immediately&lt;/strong&gt; on the next page load&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This system is often called &lt;strong&gt;pseudo-cron&lt;/strong&gt; or &lt;strong&gt;false cron&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Key characteristics:&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260305/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260305/</guid><description>&lt;h2 id="concept-of-roles-and-capabilities"&gt;Concept of Roles and Capabilities&lt;/h2&gt;
&lt;p&gt;WordPress provides a &lt;strong&gt;role-based permission system&lt;/strong&gt; that controls what actions a user can perform on a website. Instead of granting every user full administrative access, WordPress assigns each user a &lt;strong&gt;role&lt;/strong&gt;, and each role contains a set of &lt;strong&gt;capabilities&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;capability&lt;/strong&gt; is a specific permission such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;editing posts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;publishing posts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;installing plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;managing options&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;deleting users&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A &lt;strong&gt;role&lt;/strong&gt; is simply a collection of capabilities.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260304/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260304/</guid><description>&lt;h2 id="wordpress-ajax-in-plugin-development"&gt;WordPress AJAX in Plugin Development&lt;/h2&gt;
&lt;p&gt;AJAX in WordPress allows asynchronous server communication via &lt;code&gt;admin-ajax.php&lt;/code&gt; or the REST API without reloading the page. In plugins, this is commonly implemented using &lt;code&gt;wp_ajax_{action}&lt;/code&gt; and &lt;code&gt;wp_ajax_nopriv_{action}&lt;/code&gt; hooks.&lt;/p&gt;
&lt;p&gt;AJAX request flow with admin-ajax.php&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;JavaScript sends request to &lt;code&gt;admin_url( 'admin-ajax.php' )&lt;/code&gt; with an &lt;code&gt;action&lt;/code&gt; parameter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WordPress routes the request to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_ajax_{action}&lt;/code&gt; for authenticated users&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_ajax_nopriv_{action}&lt;/code&gt; for unauthenticated users&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHP callback processes data and outputs JSON.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Script exits with &lt;code&gt;exit;&lt;/code&gt; or &lt;code&gt;wp_die();&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260303/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260303/</guid><description>&lt;p&gt;&lt;code&gt;rest_pre_serve_request&lt;/code&gt; filter) to intercept the data right before it&amp;rsquo;s sent and convert the JSON object into XML or CSV.&lt;/p&gt;
&lt;p&gt;An API is an Application Programming Interface. REST, which stands for “Representational State Transfer,” is a set of concepts for modeling and accessing your application’s data as interrelated objects and collections.&lt;/p&gt;
&lt;p&gt;API is a set of code that allows one system to interact (or “interface”) with another.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt; – Representational State Transfer, or REST, provides standards that web systems can use to interface with each other.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260302/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260302/</guid><description>&lt;h2 id="1-wordpress-http-api-overview"&gt;1. WordPress HTTP API Overview&lt;/h2&gt;
&lt;p&gt;WordPress provides a standardized HTTP API for communicating with remote servers.&lt;/p&gt;
&lt;h3 id="main-functions"&gt;Main Functions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_remote_get()&lt;/code&gt; — Perform GET request&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_remote_post()&lt;/code&gt; — Perform POST request&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_remote_request()&lt;/code&gt; — Custom HTTP methods (PUT, DELETE, PATCH)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_remote_retrieve_body()&lt;/code&gt; — Extract response body&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_remote_retrieve_response_code()&lt;/code&gt; — Get HTTP status code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_remote_retrieve_headers()&lt;/code&gt; — Get response headers&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="core-classes"&gt;Core Classes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;WP_Http&lt;/code&gt; — Main HTTP wrapper class&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;WP_Http_Curl&lt;/code&gt; — cURL transport&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;WP_Http_Streams&lt;/code&gt; — Streams transport&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;WP_Http_Response&lt;/code&gt; — Standardized response object&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260227/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260227/</guid><description>&lt;h1 id="wordpress-core-apis"&gt;&lt;strong&gt;WordPress Core APIs&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Overview:&lt;/strong&gt;&lt;br&gt;
WordPress Core APIs provide functions to extend WordPress safely. They handle heavy-lifting tasks and ensure backward compatibility for plugins and themes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Core APIs Learned:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Metadata API – manage metadata for posts, users, comments, terms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shortcode API – create dynamic shortcodes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Admin Menus – add menus in admin dashboard&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Settings &amp;amp; Options API – manage plugin/theme settings&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Advanced Core APIs:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;HTTP API – remote requests with caching &amp;amp; authentication&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260226/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260226/</guid><description>&lt;h2 id="wp-cli"&gt;WP-CLI&lt;/h2&gt;
&lt;h3 id="overview"&gt;Overview&lt;/h3&gt;
&lt;p&gt;WP-CLI (WordPress Command Line Interface) lets you manage a WordPress installation directly from the terminal. Instead of using the browser-based admin dashboard, you execute commands via SSH or a local terminal.&lt;/p&gt;
&lt;p&gt;It supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Core management (install, update, downgrade)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin and theme management&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Database operations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User and role management&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Content import/export&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom command development&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WP-CLI commands follow this structure:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wp &amp;lt;entity&amp;gt; &amp;lt;subcommand&amp;gt; [options] [--global-parameters]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wp core update
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="installation-quick-method"&gt;Installation (Quick Method)&lt;/h2&gt;
&lt;p&gt;Download and make executable:&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260225/</link><pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260225/</guid><description>&lt;p&gt;In the context of the WordPress REST API a &lt;strong&gt;route&lt;/strong&gt; is a URI which can be mapped to different HTTP methods. The mapping of an individual HTTP method to a route is known as an &lt;strong&gt;endpoint&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Route&lt;/strong&gt; is the URL path itself
The &lt;strong&gt;Endpoint&lt;/strong&gt; is the combination of a &lt;strong&gt;Route&lt;/strong&gt; and an &lt;strong&gt;HTTP Method&lt;/strong&gt; (like GET, POST, or DELETE).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/wp-json/&lt;/code&gt; is a route, and when that route receives a &lt;code&gt;GET&lt;/code&gt; request then that request is handled by the endpoint which displays what is known as the index for the WordPress REST API.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260224/</link><pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260224/</guid><description>&lt;p&gt;&lt;code&gt;get_template_directory_uri()&lt;/code&gt;
Retrieves template directory URI for the active theme. Returns the URL of the &lt;strong&gt;parent theme directory&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;get_header($name = null, $args = array()) { }&lt;/code&gt;
Includes the header template for a theme or if a name is specified then a specialized header will be included. For the parameter, if the file is called &amp;ldquo;header-special.php&amp;rdquo; then specify &amp;ldquo;special&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;get_theme_file_uri('/assets/css/style.css')&lt;/code&gt;
The URL to a specific file, and it checks Child theme first, Then parent theme (fallback)&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260223/</link><pubDate>Mon, 23 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260223/</guid><description>&lt;h2 id="wordpress-rest-api"&gt;WordPress REST API&lt;/h2&gt;
&lt;p&gt;The WordPress REST API allows applications to interact with a WordPress site using JSON over HTTP. It exposes WordPress data (posts, pages, users, taxonomies, custom post types) through RESTful endpoints.&lt;/p&gt;
&lt;p&gt;It powers the WordPress Block Editor and enables headless architectures, custom dashboards, mobile apps, and external integrations.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="what-is-rest"&gt;What Is REST?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;API&lt;/strong&gt; – A set of rules that allows systems to communicate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;REST (Representational State Transfer)&lt;/strong&gt; – A standard for structuring APIs using:&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260219/</link><pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260219/</guid><description>&lt;h3 id="css-reset--normalize"&gt;CSS Reset / Normalize&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;before&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;border-box&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="layout-structure-flexbox"&gt;Layout Structure (Flexbox)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1200&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;auto&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;space-between&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;align-items&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="grid-layout-example"&gt;Grid Layout Example&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;post-grid&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;repeat&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;fr);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;gap&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="typography-precision"&gt;Typography Precision&lt;/h2&gt;
&lt;h3 id="font-loading"&gt;Font Loading&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;basic_theme_fonts&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wp_enqueue_style&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;google-fonts&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&amp;amp;display=swap&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;wp_enqueue_scripts&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;basic_theme_fonts&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="typography-system"&gt;Typography System&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-family&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;Inter&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;sans-serif&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;line-height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1.6&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#222&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;h1&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;font-weight&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;700&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;h2&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;font-weight&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;600&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;margin-bottom&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="headerphp"&gt;header.php&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;html&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;html&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;language_attributes&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;meta charset=&amp;#34;&amp;lt;?php bloginfo(&amp;#39;charset&amp;#39;); ?&amp;gt;&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php wp_head(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;/head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;body &amp;lt;?php body_class(); ?&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;header class=&amp;#34;site-header&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;div class=&amp;#34;container&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;h1 class=&amp;#34;logo&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;a href=&amp;#34;&amp;lt;?php echo home_url(); ?&amp;gt;&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php bloginfo(&amp;#39;name&amp;#39;); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; wp_nav_menu(array(
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;#39;theme_location&amp;#39; =&amp;gt; &amp;#39;primary&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;#39;container&amp;#39; =&amp;gt; &amp;#39;nav&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;#39;menu_class&amp;#39; =&amp;gt; &amp;#39;main-menu&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; ));
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;/header&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="register-menu"&gt;Register Menu&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;basic_theme_setup&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;register_nav_menus&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;primary&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Primary Menu&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;after_setup_theme&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;basic_theme_setup&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="responsive-design"&gt;Responsive Design&lt;/h2&gt;
&lt;h3 id="viewport-meta"&gt;Viewport Meta&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="media-queries"&gt;Media Queries&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#66d9ef"&gt;media&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;max-width&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;992px&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;post-grid&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;fr &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;fr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#66d9ef"&gt;media&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;max-width&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;600px&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;post-grid&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;fr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="custom-single-template"&gt;Custom Single Template&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_header&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;main class=&amp;#34;single-post container&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;if ( have_posts() ) :
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; while ( have_posts() ) : the_post(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;h1&amp;gt;&amp;lt;?php the_title(); ?&amp;gt;&amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php the_content(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php endwhile;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;endif;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;/main&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php get_footer(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260218/</link><pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260218/</guid><description>&lt;h2 id="media-management-in-wordpress-themes"&gt;Media Management in WordPress Themes&lt;/h2&gt;
&lt;h3 id="handling-images"&gt;Handling Images&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Uploading &amp;amp; Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Get attachment metadata
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$meta &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wp_get_attachment_metadata&lt;/span&gt;( $attachment_id );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Access width and height
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $meta[&lt;span style="color:#e6db74"&gt;&amp;#39;width&amp;#39;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $meta[&lt;span style="color:#e6db74"&gt;&amp;#39;height&amp;#39;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;WordPress stores media under &lt;code&gt;wp-content/uploads/year/month/&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generates multiple sizes automatically (&lt;code&gt;thumbnail&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;large&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Metadata stored in &lt;code&gt;wp_postmeta&lt;/code&gt; for efficient retrieval.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Featured Images&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Enable support in functions.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_theme_support&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;post-thumbnails&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Display a specific size
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#a6e22e"&gt;has_post_thumbnail&lt;/span&gt;() ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;the_post_thumbnail&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;medium&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Get URL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_the_post_thumbnail_url&lt;/span&gt;( &lt;span style="color:#a6e22e"&gt;get_the_ID&lt;/span&gt;(), &lt;span style="color:#e6db74"&gt;&amp;#39;large&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Custom Image Sizes&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260217/</link><pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260217/</guid><description>&lt;ul&gt;
&lt;li&gt;Classic themes: Edited using classic editor, or third party plugins like elementor. Has Widget, menus&lt;/li&gt;
&lt;li&gt;Block Themes: Introduced FSE&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="is-it-important-to-have-indexphp-in-wordpress-themes"&gt;Is it important to have index.php in wordpress themes?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Yes, it is still strictly required.&lt;/strong&gt; If you are building a theme using the traditional PHP method (the way themes have been built for 20 years), WordPress still looks for &lt;code&gt;index.php&lt;/code&gt; as the primary fallback. Without it, the theme is considered &amp;ldquo;broken&amp;rdquo; and cannot be activated.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260216/</link><pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260216/</guid><description>&lt;h2 id="child-themes-in-wordpress"&gt;Child Themes in WordPress&lt;/h2&gt;
&lt;h3 id="concept-and-purpose"&gt;Concept and Purpose&lt;/h3&gt;
&lt;p&gt;A child theme is a WordPress theme that inherits the design and functionality of another theme, called the parent theme. It allows developers to modify or extend a site’s appearance and behavior without editing the parent theme’s files directly.&lt;/p&gt;
&lt;p&gt;This approach ensures that customizations remain intact after parent theme updates and that core theme files remain untouched. It is considered best practice when modifying styling, template files, or &lt;code&gt;functions.php&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260213/</link><pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260213/</guid><description>&lt;h2 id="advanced-css-properties-and-techniques"&gt;Advanced CSS Properties and Techniques&lt;/h2&gt;
&lt;h3 id="css-custom-properties-variables"&gt;CSS Custom Properties (Variables)&lt;/h3&gt;
&lt;p&gt;Useful for theming and maintaining consistent design values across components.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --primary-color: &lt;span style="color:#ae81ff"&gt;#6c5ce7&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --border-radius: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --shadow: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; rgba(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;card&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;var&lt;/span&gt;(&lt;span style="color:#f92672"&gt;--&lt;/span&gt;primary&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;var&lt;/span&gt;(&lt;span style="color:#f92672"&gt;--&lt;/span&gt;border&lt;span style="color:#f92672"&gt;-&lt;/span&gt;radius);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;box-shadow&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;var&lt;/span&gt;(&lt;span style="color:#f92672"&gt;--&lt;/span&gt;shadow);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Variables can be overridden inside media queries or themes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;dark&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --primary-color: &lt;span style="color:#ae81ff"&gt;#1e1e2f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="advanced-css-grid-layout"&gt;Advanced CSS Grid Layout&lt;/h3&gt;
&lt;p&gt;Responsive auto-fitting layout:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;repeat&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;auto&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;fit, &lt;span style="color:#a6e22e"&gt;minmax&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;250&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;fr));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;gap&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Grid template areas for complex layouts:&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260212/</link><pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260212/</guid><description>&lt;h2 id="theme-file-structure"&gt;Theme File Structure&lt;/h2&gt;
&lt;p&gt;A basic WordPress theme requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;style.css&lt;/code&gt; (theme metadata and styles)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;index.php&lt;/code&gt; (fallback template)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Common additional files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;header.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;footer.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;sidebar.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;functions.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;single.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;page.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;archive.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;search.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;404.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="page-template-layout"&gt;Page Template Layout&lt;/h2&gt;
&lt;p&gt;Custom Page Template:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Template Name: Custom Layout */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;get_header&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;section class=&amp;#34;custom-page&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; while (have_posts()) : the_post();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; the_content();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; endwhile;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;/section&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php get_footer(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="enqueue-styles-and-scripts"&gt;Enqueue Styles and Scripts&lt;/h2&gt;
&lt;p&gt;In &lt;code&gt;functions.php&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260211/</link><pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260211/</guid><description>&lt;p&gt;A WordPress theme controls the visual presentation and layout of a WordPress site. It consists of template files, stylesheets, functions, and optional assets (JavaScript, images, fonts). Themes define how content stored in the database is rendered in the browser.&lt;/p&gt;
&lt;p&gt;A theme does not modify core WordPress functionality; instead, it uses WordPress APIs, hooks, and template hierarchy rules to display content.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="basic-theme-structure"&gt;Basic Theme Structure&lt;/h2&gt;
&lt;p&gt;A minimal theme requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;style.css&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;index.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="example-stylecss-theme-header"&gt;Example: style.css (Theme Header)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Theme Name: Example Theme
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Theme URI: https://example.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Author: Your Name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Author URI: https://example.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Description: A minimal custom WordPress theme.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Version: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;License: GNU General Public License v2 or later
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Text Domain: example-theme
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The header comment identifies the theme in the WordPress admin panel.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260210/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260210/</guid><description>&lt;h3 id="administration-menu"&gt;Administration menu&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Administration Menus&lt;/strong&gt; are the menus you see on the &lt;strong&gt;left sidebar&lt;/strong&gt; of the WordPress admin dashboard (&lt;code&gt;/wp-admin&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Each of these is an &lt;strong&gt;admin menu&lt;/strong&gt;, and plugins can:
&lt;ol&gt;
&lt;li&gt;Add a &lt;strong&gt;top-level menu&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Add a &lt;strong&gt;submenu&lt;/strong&gt; under an existing menu&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;hidden pages&lt;/strong&gt; (no visible menu item)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Plugin Name: My Admin Menu Plugin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Description: Demonstrates how to create WordPress administration menus.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Version: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Author: You
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#f92672"&gt;!&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;defined&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;ABSPATH&amp;#39;&lt;/span&gt; ) ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;exit&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Prevent direct access
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Hook into the admin menu system
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;admin_menu&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_register_admin_menu&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Register admin menus
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;my_plugin_register_admin_menu&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TOP-LEVEL MENU
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;add_menu_page&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;My Plugin Dashboard&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Page title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;My Plugin&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Menu title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;manage_options&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Capability
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my-plugin&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Menu slug
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_dashboard_page&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Callback function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;dashicons-admin-generic&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Icon
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Position
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// SUBMENU PAGE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;add_submenu_page&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my-plugin&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Parent slug
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;My Plugin Settings&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Page title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Settings&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Menu title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;manage_options&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Capability
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my-plugin-settings&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Menu slug
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_settings_page&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Callback function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Dashboard page callback
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;my_plugin_dashboard_page&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#f92672"&gt;!&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current_user_can&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;manage_options&amp;#39;&lt;/span&gt; ) ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;div class=&amp;#34;wrap&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;h1&amp;gt;My Plugin Dashboard&amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;p&amp;gt;This is the main dashboard page of the plugin.&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; * Settings page callback
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;function my_plugin_settings_page() {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; if ( ! current_user_can( &amp;#39;manage_options&amp;#39; ) ) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; return;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;div class=&amp;#34;wrap&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;h1&amp;gt;My Plugin Settings&amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;form method=&amp;#34;post&amp;#34; action=&amp;#34;options.php&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; settings_fields( &amp;#39;my_plugin_settings_group&amp;#39; );
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; do_settings_sections( &amp;#39;my-plugin-settings&amp;#39; );
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; submit_button();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;/form&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="settings--options-api"&gt;Settings &amp;amp; Options API&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Options API - Stores and retrieves data from the database&lt;/li&gt;
&lt;li&gt;Settings API - Builds admin settings pages (UI + validation + security)&lt;/li&gt;
&lt;li&gt;Settings API does NOT store data. Options API does NOT render UI&lt;/li&gt;
&lt;li&gt;All wordpress options are stored in &lt;code&gt;wp_options&lt;/code&gt; table.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_option&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_color&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;blue&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;update_option&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_color&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;red&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_option&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_color&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;default&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;delete_option&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_color&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Plugin Name: My Settings Plugin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Description: End-to-end example of Admin Menu + Settings &amp;amp; Options API
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Version: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#f92672"&gt;!&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;defined&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;ABSPATH&amp;#39;&lt;/span&gt; ) ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;exit&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * 1️⃣ ADMIN MENU (ENTRY POINT)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;admin_menu&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_add_admin_menu&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;my_plugin_add_admin_menu&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;add_menu_page&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;My Plugin Settings&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Page title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;My Plugin&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Menu title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;manage_options&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Capability
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my-plugin&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Menu slug
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_settings_page&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Page callback
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;dashicons-admin-settings&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Icon
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * 2️⃣ REGISTER SETTINGS (SETTINGS API)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;admin_init&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_register_settings&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;my_plugin_register_settings&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Register option (Options API via Settings API)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;register_setting&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_settings_group&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Settings group
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_options&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Option name (stored in wp_options)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_sanitize_options&amp;#39;&lt;/span&gt;&lt;span style="color:#75715e"&gt;// Sanitization callback
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Settings section
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;add_settings_section&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_main_section&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Section ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Main Settings&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_section_text&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Callback
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my-plugin&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Page slug (menu slug)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Settings field
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;add_settings_field&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;enable_feature&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Field ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Enable Feature&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Label
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_enable_field&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Field callback
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my-plugin&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Page slug
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_main_section&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Section ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * 3️⃣ SECTION DESCRIPTION
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;my_plugin_section_text&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;p&amp;gt;Configure the main settings for the plugin.&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * 4️⃣ FIELD HTML
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;my_plugin_enable_field&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $options &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_option&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_options&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $options[&lt;span style="color:#e6db74"&gt;&amp;#39;enable_feature&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;??&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;input type=&amp;#34;checkbox&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; name=&amp;#34;my_plugin_options[enable_feature]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; value=&amp;#34;1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php checked( 1, $enabled ); ?&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;label&amp;gt;Enable the main feature&amp;lt;/label&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; * 5️⃣ SANITIZATION
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;function my_plugin_sanitize_options( $input ) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; $output = [];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; $output[&amp;#39;enable_feature&amp;#39;] = isset( $input[&amp;#39;enable_feature&amp;#39;] ) ? 1 : 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; return $output;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; * 6️⃣ SETTINGS PAGE (CONNECTED TO ADMIN MENU)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;function my_plugin_settings_page() {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; if ( ! current_user_can( &amp;#39;manage_options&amp;#39; ) ) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; return;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;div class=&amp;#34;wrap&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;h1&amp;gt;My Plugin Settings&amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;form method=&amp;#34;post&amp;#34; action=&amp;#34;options.php&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; settings_fields( &amp;#39;my_plugin_settings_group&amp;#39; );
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; do_settings_sections( &amp;#39;my-plugin&amp;#39; );
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; submit_button();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;/form&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="what-the-settings-api-does-and-does-not-do"&gt;What the Settings API Does (and DOES NOT do)&lt;/h2&gt;
&lt;h3 id="what-it-does"&gt;What it DOES&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Registers settings&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260209/</link><pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260209/</guid><description>&lt;ul&gt;
&lt;li&gt;Block Patterns:
A predefined group of blocks (text, images, buttons, columns, etc.) inserted inside a post or page. Once inserted, they’re just normal blocks—you can fully edit them&lt;/li&gt;
&lt;li&gt;Template Patterns:
Larger structural layouts meant for templates used in the Site Editor (not regular page editing). Often define parts of a page or an entire page layout&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;The WordPress commitment is to conform to all WCAG 2.2 Level A and Level AA guidelines.&lt;/li&gt;
&lt;li&gt;Nonce:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyPlugin_Admin&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Display a form in the WP Admin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;render_settings_page&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;div class=&amp;#34;wrap&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;h1&amp;gt;&amp;lt;?php echo esc_html__( &amp;#39;Plugin Settings&amp;#39;, &amp;#39;my-plugin&amp;#39; ); ?&amp;gt;&amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;form method=&amp;#34;post&amp;#34; action=&amp;#34;admin-post.php&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php wp_nonce_field( &amp;#39;save_plugin_settings&amp;#39;, &amp;#39;my_admin_nonce&amp;#39; ); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;input type=&amp;#34;hidden&amp;#34; name=&amp;#34;action&amp;#34; value=&amp;#34;my_save_action&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;input type=&amp;#34;text&amp;#34; name=&amp;#34;setting_one&amp;#34; value=&amp;#34;&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php submit_button( esc_html__( &amp;#39;Save Changes&amp;#39;, &amp;#39;my-plugin&amp;#39; ) ); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;/form&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handle_save&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 1. Verify the nonce
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// If this fails, WP automatically calls wp_die() with a 403 error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;check_admin_referer&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;save_plugin_settings&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;my_admin_nonce&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 2. If we reach here, the request is valid!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Now sanitize the other inputs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#a6e22e"&gt;isset&lt;/span&gt;( $_POST[&lt;span style="color:#e6db74"&gt;&amp;#39;setting_one&amp;#39;&lt;/span&gt;] ) ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sanitize_text_field&lt;/span&gt;( $_POST[&lt;span style="color:#e6db74"&gt;&amp;#39;setting_one&amp;#39;&lt;/span&gt;] );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;update_option&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;my_plugin_data&amp;#39;&lt;/span&gt;, $data );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 3. Redirect back
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wp_redirect&lt;/span&gt;( &lt;span style="color:#a6e22e"&gt;admin_url&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;admin.php?page=my-plugin-page&amp;amp;status=success&amp;#39;&lt;/span&gt; ) );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;exit&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;$action&lt;/code&gt; (The &amp;ldquo;What&amp;rdquo;)&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260206/</link><pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260206/</guid><description>&lt;h3 id="wordpress-theme"&gt;WordPress Theme&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A theme controls the &lt;strong&gt;visual presentation&lt;/strong&gt; of a WordPress website.&lt;/li&gt;
&lt;li&gt;It defines layout, typography, colors, and structure.&lt;/li&gt;
&lt;li&gt;Themes use &lt;strong&gt;PHP, HTML, CSS, and JavaScript&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;WordPress themes follow a &lt;strong&gt;template hierarchy&lt;/strong&gt; to load files.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="theme-architecture-overview"&gt;Theme Architecture Overview&lt;/h2&gt;
&lt;p&gt;A WordPress theme is composed of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Template files&lt;/strong&gt; (PHP)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stylesheets&lt;/strong&gt; (CSS)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Functions file&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assets&lt;/strong&gt; (CSS, JS, images)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;theme-name/
├── style.css
├── index.php
├── functions.php
├── header.php
├── footer.php
├── sidebar.php
├── page.php
├── single.php
├── archive.php
├── 404.php
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="required-theme-files"&gt;Required Theme Files&lt;/h2&gt;
&lt;h3 id="1-stylecss"&gt;1. style.css&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Contains theme metadata&lt;/li&gt;
&lt;li&gt;Required for theme recognition&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Theme Name: Basic Theme
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Author: Developer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Version: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="2-indexphp"&gt;2. index.php&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Main fallback template&lt;/li&gt;
&lt;li&gt;Required for rendering content&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#a6e22e"&gt;have_posts&lt;/span&gt;() ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; ( &lt;span style="color:#a6e22e"&gt;have_posts&lt;/span&gt;() ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;the_post&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;the_title&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;h1&amp;gt;&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;/h1&amp;gt;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;the_content&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="template-files-and-their-purpose"&gt;Template Files and Their Purpose&lt;/h2&gt;
&lt;h3 id="headerphp"&gt;header.php&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Contains opening HTML, &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, and navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;html&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;html&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;language_attributes&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php wp_head(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;/head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;body &amp;lt;?php body_class(); ?&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="footerphp"&gt;footer.php&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Contains footer content and closing tags&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wp_footer&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;/body&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="sidebarphp"&gt;sidebar.php&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Displays widget areas&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#a6e22e"&gt;is_active_sidebar&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;main-sidebar&amp;#39;&lt;/span&gt;) ) &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;?php dynamic_sidebar(&amp;#39;main-sidebar&amp;#39;); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php endif; ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="pagephp"&gt;page.php&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Used for static pages&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_header&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php the_title(&amp;#39;&amp;lt;h1&amp;gt;&amp;#39;, &amp;#39;&amp;lt;/h1&amp;gt;&amp;#39;); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php the_content(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php get_footer(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="singlephp"&gt;single.php&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Used for single blog posts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_header&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;h1&amp;gt;&amp;lt;?php the_title(); ?&amp;gt;&amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php the_content(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php get_footer(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="template-hierarchy-basic"&gt;Template Hierarchy (Basic)&lt;/h2&gt;
&lt;p&gt;Order WordPress follows to load templates:&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260205/</link><pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260205/</guid><description>&lt;h2 id="wp_query"&gt;WP_Query&lt;/h2&gt;
&lt;h3 id="what-wp_query-is"&gt;What &lt;code&gt;WP_Query&lt;/code&gt; is&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;WP_Query&lt;/code&gt; is WordPress’s main class for querying posts from the database. It powers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The main loop&lt;/li&gt;
&lt;li&gt;Custom loops (recommended way)&lt;/li&gt;
&lt;li&gt;Complex queries (meta, tax, date, pagination, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use it instead of &lt;code&gt;query_posts()&lt;/code&gt; (which you should basically never use).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="basic-usage-pattern"&gt;Basic Usage Pattern&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$args &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;post_type&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;post&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;posts_per_page&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$query &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WP_Query&lt;/span&gt;($args);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ($query&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;have_posts&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; ($query&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;have_posts&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $query&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;the_post&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;the_title&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wp_reset_postdata&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Key points&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Always call &lt;code&gt;wp_reset_postdata()&lt;/code&gt; after a custom loop&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$query-&amp;gt;the_post()&lt;/code&gt; sets up global &lt;code&gt;$post&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="common-query-arguments"&gt;Common Query Arguments&lt;/h2&gt;
&lt;h3 id="post-type"&gt;Post Type&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;post_type&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;post&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// or &amp;#39;page&amp;#39;, &amp;#39;product&amp;#39;, &amp;#39;custom_post_type&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Multiple post types:&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260204/</link><pubDate>Wed, 04 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260204/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;WordPress uses a &lt;strong&gt;MySQL&lt;/strong&gt; (or MariaDB) database. By default, it consists of &lt;strong&gt;12 core tables&lt;/strong&gt;.
The 12 core tables are:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_commentmeta&lt;/code&gt;: Stores extra information (metadata) about comments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_comments&lt;/code&gt;: Contains all comments on posts and pages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_links&lt;/code&gt;: Stores information related to the Links feature (often deprecated but still included for backward compatibility).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp_options&lt;/code&gt;: Stores general site settings, configuration options, and temporary data (transients) for themes and plugins.(Site URL, Admin email, active plugins, and theme configurations).&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260203/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260203/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;code&gt;defined( 'ABSPATH' ) || exit;&lt;/code&gt; contains the &lt;strong&gt;absolute path to the WordPress root directory&lt;/strong&gt;. If php run directly, it exits.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="this"&gt;&lt;code&gt;$this&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Refers to the &lt;strong&gt;current object instance&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Used for &lt;strong&gt;non-static properties and methods&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Only available &lt;strong&gt;inside object context&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="self"&gt;&lt;code&gt;self::&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Refers to the &lt;strong&gt;class itself&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Used for &lt;strong&gt;static properties and methods&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Does NOT require an object&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;add_action( 'init', array( $post_types, 'register_post_types' ) )&lt;/code&gt; is a &lt;strong&gt;callable reference&lt;/strong&gt; that means:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;When the &lt;code&gt;init&lt;/code&gt; hook fires, call &lt;code&gt;$post_types-&amp;gt;register_post_types()&lt;/code&gt;&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260202/</link><pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260202/</guid><description>&lt;ul&gt;
&lt;li&gt;Create a folder named plugin name in &lt;code&gt;wp-content/plugins&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Inside it create a php file with same name as plugin name.&lt;/li&gt;
&lt;li&gt;It should contain header which is used by wordpress to display meta information about it.&lt;/li&gt;
&lt;li&gt;WordPress uses &lt;strong&gt;gettext&lt;/strong&gt; via wrapper functions to make strings translatable.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;text domain&lt;/strong&gt; uniquely identifies your plugin’s translations. Must match the &lt;strong&gt;plugin slug&lt;/strong&gt; (folder or main file name).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Plugin Name: My Plugin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Text Domain: my-plugin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="domain-path"&gt;Domain Path&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Defines where translation files live.&lt;/li&gt;
&lt;li&gt;Defaults to the plugin folder.&lt;/li&gt;
&lt;li&gt;If using a &lt;code&gt;/languages&lt;/code&gt; directory, add to header:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Domain Path: /languages
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;__( 'Text', 'my-plugin' )&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Returns a translated string.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_e( 'Text', 'my-plugin' )&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Echoes the translated string.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="uninstall-hook"&gt;Uninstall hook&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Method 1:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;register_uninstall_hook&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;__FILE__&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;pluginprefix_function_to_run&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Method 2: To use this method you need to create an &lt;code&gt;uninstall.php&lt;/code&gt; file inside the root folder of your plugin. This magic file is run automatically when the users deletes the plugin.
&lt;code&gt;/plugin-name/uninstall.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If both are defined, &lt;code&gt;uninstall.php&lt;/code&gt; will be used.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// if uninstall.php is not called by WordPress, die
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#f92672"&gt;!&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;defined&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;WP_UNINSTALL_PLUGIN&amp;#39;&lt;/span&gt; ) ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;die&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$option_name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wporg_option&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;delete_option&lt;/span&gt;( $option_name );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// for site options in Multisite
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;delete_site_option&lt;/span&gt;( $option_name );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// drop a custom database table
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;global&lt;/span&gt; $wpdb;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$wpdb&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;query&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#34;DROP TABLE IF EXISTS &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;$wpdb&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;prefix&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;mytable&amp;#34;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="wpdb"&gt;&lt;code&gt;wpdb&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;This is WordPress’s &lt;strong&gt;global database object&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It’s an instance of the &lt;code&gt;wpdb&lt;/code&gt; class.&lt;/li&gt;
&lt;li&gt;You use it to safely interact with the WordPress database instead of using raw &lt;code&gt;mysqli&lt;/code&gt; or &lt;code&gt;PDO&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;require&lt;/strong&gt; Includes and loads a PHP file so its code can run.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;use&lt;/strong&gt; Imports a &lt;strong&gt;namespace or class&lt;/strong&gt; so you can refer to it with a shorter name. &lt;code&gt;use&lt;/code&gt; works &lt;strong&gt;after the code is loaded&lt;/strong&gt; (so you still need &lt;code&gt;require&lt;/code&gt; or autoloading).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="shortcode"&gt;shortcode&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_shortcode&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;wporg&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;wporg_shortcode&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wporg_shortcode&lt;/span&gt;( $atts &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [], $content &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// do something to $content
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// always return
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; $content;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[wporg]&lt;/code&gt; is your new shortcode. The use of the shortcode will trigger the &lt;code&gt;wporg_shortcode&lt;/code&gt; callback function.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Actions allow you to add data or change how WordPress operates. Callback functions for Actions will run at a specific point in the execution of WordPress. Actions do not return anything back to the calling hook,(i.e., &lt;code&gt;do_action()&lt;/code&gt; do not return anythin)&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260130/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260130/</guid><description>&lt;ul&gt;
&lt;li&gt;Plugins are packages of code that extend the core functionality of WordPress. WordPress plugins are made up of PHP code and can include other assets such as images, CSS, and JavaScript.&lt;/li&gt;
&lt;li&gt;FileDoc comment example:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Get all image nodes.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @param \DOMNode $node The \DOMDocument instance
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @param boolean $strict If the document has to be valid
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @return \DOMNode
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getImageNodes&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;\DOMNode&lt;/span&gt; $node, $strict &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;)&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;\DOMNode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="example-hello-dolly-plugin"&gt;Example: Hello Dolly Plugin&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @package Hello_Dolly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @version 1.7.2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Plugin Name: Hello Dolly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Plugin URI: http://wordpress.org/plugins/hello-dolly/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from &amp;lt;cite&amp;gt;Hello, Dolly&amp;lt;/cite&amp;gt; in the upper right of your admin screen on every page.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Author: Matt Mullenweg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Version: 1.7.2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Author URI: http://ma.tt/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hello_dolly_get_lyric&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;/** These are the lyrics to Hello Dolly */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $lyrics &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Hello, Dolly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Well, hello, Dolly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;It&amp;#39;s so nice to have you back where you belong
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;You&amp;#39;re lookin&amp;#39; swell, Dolly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;I can tell, Dolly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;You&amp;#39;re still glowin&amp;#39;, you&amp;#39;re still crowin&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;You&amp;#39;re still goin&amp;#39; strong
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;I feel the room swayin&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;While the band&amp;#39;s playin&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;One of our old favorite songs from way back when
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;So, take her wrap, fellas
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Dolly, never go away again
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Hello, Dolly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Well, hello, Dolly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;It&amp;#39;s so nice to have you back where you belong
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;You&amp;#39;re lookin&amp;#39; swell, Dolly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;I can tell, Dolly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;You&amp;#39;re still glowin&amp;#39;, you&amp;#39;re still crowin&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;You&amp;#39;re still goin&amp;#39; strong
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;I feel the room swayin&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;While the band&amp;#39;s playin&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;One of our old favorite songs from way back when
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;So, golly, gee, fellas
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Have a little faith in me, fellas
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Dolly, never go away
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Promise, you&amp;#39;ll never go away
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Dolly&amp;#39;ll never go away again&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Here we split it into lines.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; $lyrics &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;explode&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, $lyrics );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// And then randomly choose a line.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wptexturize&lt;/span&gt;( $lyrics[ &lt;span style="color:#a6e22e"&gt;mt_rand&lt;/span&gt;( &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;( $lyrics ) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; ) ] );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// This just echoes the chosen line, we&amp;#39;ll position it later.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hello_dolly&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $chosen &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hello_dolly_get_lyric&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $lang &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#e6db74"&gt;&amp;#39;en_&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;substr&lt;/span&gt;( &lt;span style="color:#a6e22e"&gt;get_user_locale&lt;/span&gt;(), &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; ) ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $lang &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39; lang=&amp;#34;en&amp;#34;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;p id=&amp;#34;dolly&amp;#34;&amp;gt;&amp;lt;span class=&amp;#34;screen-reader-text&amp;#34;&amp;gt;%s &amp;lt;/span&amp;gt;&amp;lt;span dir=&amp;#34;ltr&amp;#34;%s&amp;gt;%s&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;__&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;Quote from Hello Dolly song, by Jerry Herman:&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;hello-dolly&amp;#39;&lt;/span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $lang,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $chosen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Now we set that function up to execute when the admin_notices action is called.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;admin_notices&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;hello_dolly&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// We need some CSS to position the paragraph.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dolly_css&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;lt;style type=&amp;#39;text/css&amp;#39;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; #dolly {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; float: right;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; padding: 5px 10px;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; margin: 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; font-size: 12px;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; line-height: 1.6666;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; .rtl #dolly {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; float: left;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; .block-editor-page #dolly {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; display: none;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; @media screen and (max-width: 782px) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; #dolly,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; .rtl #dolly {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; float: none;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; padding-left: 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; padding-right: 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;lt;/style&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;admin_head&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;dolly_css&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;WordPress installation&lt;/strong&gt; is &lt;strong&gt;a website/project that is built using WordPress&lt;/strong&gt;. It is a &lt;strong&gt;folder on a server&lt;/strong&gt; (or your local machine) that contains files like:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# example files in wordpress project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wp-admin/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wp-content/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wp-includes/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wp-config.php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;index.php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Create your plugin here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;your-wordpress-site/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── wp-content/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── plugins/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── plugin-name/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── plugin-name.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Header format. Simple and extended:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Plugin Name: YOUR PLUGIN NAME
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Plugin Name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @package PluginPackage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @author Your Name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @copyright 2019 Your Name or Company Name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @license GPL-2.0-or-later
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * @wordpress-plugin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Plugin Name: Plugin Name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Plugin URI: https://example.com/plugin-name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Description: Description of the plugin.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Version: 1.0.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Requires at least: 5.2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Requires PHP: 7.2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Author: Your Name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Author URI: https://example.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Text Domain: plugin-slug
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * License: GPL v2 or later
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Update URI: https://example.com/my-plugin/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; * Requires Plugins: my-plugin, yet-another-plugin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Activation and deactivation hooks let your plugin &lt;strong&gt;react to being turned on or off&lt;/strong&gt;, so it can set itself up properly and clean up after itself — without doing unnecessary work every time WordPress runs.&lt;/li&gt;
&lt;li&gt;The deactivation hook is sometimes confused with the &lt;a href="https://developer.wordpress.org/plugins/plugin-basics/uninstall-methods/"&gt;uninstall hook&lt;/a&gt;. The uninstall hook is best suited to &lt;strong&gt;delete all data permanently&lt;/strong&gt; such as deleting plugin options and custom tables, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;register_activation_hook&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;__FILE__&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;pluginprefix_function_to_run&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;register_deactivation_hook&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;__FILE__&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;pluginprefix_function_to_run&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# first parameter in each of these functions refers to your main plugin file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;PHP provides a number of functions to verify existence of variables, functions, classes and constants. All of these will return true if the entity exists.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Variables&lt;/strong&gt;: &lt;a href="http://php.net/manual/en/function.isset.php"&gt;isset()&lt;/a&gt; (includes arrays, objects, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Functions&lt;/strong&gt;: &lt;a href="http://php.net/manual/en/function.function-exists.php"&gt;function_exists()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Classes&lt;/strong&gt;: &lt;a href="http://php.net/manual/en/function.class-exists.php"&gt;class_exists()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Constants&lt;/strong&gt;: &lt;a href="http://php.net/manual/en/function.defined.php"&gt;defined()&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The root level of your plugin directory should contain your &lt;code&gt;plugin-name.php&lt;/code&gt; file and, optionally, your &lt;a href="https://developer.wordpress.org/plugin/the-basics/uninstall-methods/"&gt;uninstall.php&lt;/a&gt; file. All other files should be organized into sub folders whenever possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/plugin-name
plugin-name.php
uninstall.php
/languages
/includes
/admin
/js
/css
/images
/public
/js
/css
/images
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;__FILE__&lt;/code&gt; is a PHP magic constant. It resolves to the full filesystem path of the current PHP file at runtime.&lt;/li&gt;
&lt;li&gt;Authorization checking:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Example of a core wordpress fn to chck permission
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;current_user_can&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;edit_others_posts&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="i18n-and-l10n"&gt;i18n and l10n&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;i18n refers to &lt;strong&gt;preparing a theme or plugin so it can be easily translated&lt;/strong&gt; into multiple languages. This involves &lt;strong&gt;wrapping all text strings in translation functions&lt;/strong&gt; (&lt;code&gt;__()&lt;/code&gt;, &lt;code&gt;_e()&lt;/code&gt;, &lt;code&gt;_x()&lt;/code&gt;, etc.) so they can later be translated without editing the code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;10n&lt;/strong&gt; stands for &lt;strong&gt;“localization”&lt;/strong&gt; (10 letters between “l” and “n”). This is the process of &lt;strong&gt;translating and adapting a theme/plugin for a specific language or region&lt;/strong&gt;. It uses the internationalization groundwork (i18n) to actually provide &lt;strong&gt;translated content&lt;/strong&gt; to users.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Internationalisation (i18n)&lt;/th&gt;
&lt;th&gt;Localisation (l10n)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Product design &amp;amp; architecture&lt;/td&gt;
&lt;td&gt;Language &amp;amp; cultural adaptation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-time (mostly) effort&lt;/td&gt;
&lt;td&gt;Repeated for each locale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Done by developers&lt;/td&gt;
&lt;td&gt;Done by translators &amp;amp; local experts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Makes localisation possible&lt;/td&gt;
&lt;td&gt;Uses internationalisation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;__('Settings saved', 'super-plugin');&lt;/code&gt; : translates string for localisation. It is core wordpress function.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260129/</link><pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260129/</guid><description>&lt;h3 id="traits"&gt;Traits&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Traits are used to declare methods that can be used in multiple classes. Traits can have methods and abstract methods that can be used in multiple classes, and the methods can have any access modifier (public, private, or protected).&lt;/li&gt;
&lt;li&gt;Traits allow you to reuse several methods freely in different classes, and are a mechanism for code reuse.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;trait&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TraitName&lt;/span&gt; { &lt;span style="color:#75715e"&gt;// some code...}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyClass&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;use&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TraitName&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ----------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Define a trait
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;trait&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;message1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;msg1&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;PHP OOP is fun! &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Use the trait in a class
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Welcome&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;use&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;message1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$obj &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Welcome&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$obj&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;msg1&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="static-methods-and-properties"&gt;Static methods and properties&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pi&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#75715e"&gt;// static property
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;  &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; $value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.14159&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Get static property directly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pi&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;$value;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;greeting&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#75715e"&gt;// static method
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;  &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;welcome&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;    &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Hello World!&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Call static method directly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;greeting&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;welcome&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The purpose of these lessons is to get a conceptual understanding of PHPUnit testing using WP_PHPUnit for WordPress plugins/themes.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260128/</link><pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260128/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Coding standards help avoid common coding errors, improve the readability of code, and simplify modification. They ensure that files within the project appear as if they were created by a single person.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The WordPress commitment is to conform to all WCAG 2.2 Level A and Level AA guidelines. Conformance to level AAA success criteria is encouraged where relevant, as is exceeding the accessibility of any of these guidelines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Level A&lt;/strong&gt; success criteria address concerns considered to be accessibility barriers on a very wide scale that will prevent many people from accessing the site and the minimum set of accomplished goals required for the majority of web-based interfaces.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260127/</link><pubDate>Tue, 27 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260127/</guid><description>&lt;h2 id="wp_phpunit-testing-architecture"&gt;WP_PHPUnit Testing Architecture&lt;/h2&gt;
&lt;h3 id="purpose-of-wp_phpunit"&gt;Purpose of WP_PHPUnit&lt;/h3&gt;
&lt;p&gt;WP_PHPUnit extends PHPUnit to work within the WordPress ecosystem. Its main goal is to validate WordPress-specific behavior that cannot be tested in isolation.&lt;/p&gt;
&lt;h2 id="test-lifecycle-in-wordpress"&gt;Test Lifecycle in WordPress&lt;/h2&gt;
&lt;p&gt;Each test follows a predictable lifecycle managed by WP_PHPUnit.&lt;/p&gt;
&lt;h3 id="lifecycle-phases"&gt;Lifecycle Phases&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;setUp()&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Runs before &lt;em&gt;each&lt;/em&gt; test method.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Used to create test data (users, posts, options).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Database transaction begins here.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test Execution&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The actual test logic runs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Assertions check expected vs actual behavior.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260123/</link><pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260123/</guid><description>&lt;h2 id="full-site-editing-fse"&gt;Full Site Editing (FSE)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Full Site Editing (FSE)&lt;/strong&gt; is a modern WordPress feature introduced in &lt;strong&gt;WordPress 5.9&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It allows users to &lt;strong&gt;edit the entire website visually&lt;/strong&gt; (header, footer, templates, layouts) &lt;strong&gt;without writing code&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;FSE is built on the &lt;strong&gt;Gutenberg block editor&lt;/strong&gt; and works only with &lt;strong&gt;Block Themes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="full-site-editing-fse-1"&gt;Full Site Editing (FSE)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;FSE is an &lt;strong&gt;umbrella project&lt;/strong&gt; that includes multiple Gutenberg-related features.&lt;/li&gt;
&lt;li&gt;It focuses on &lt;strong&gt;user-friendly site customization&lt;/strong&gt; using blocks.&lt;/li&gt;
&lt;li&gt;Users can design pages, posts, headers, footers, and templates directly from the dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="core-concepts-of-full-site-editing"&gt;Core Concepts of Full Site Editing&lt;/h2&gt;
&lt;h3 id="1-site-editor"&gt;1. Site Editor&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Used to build and edit the entire site using blocks.&lt;/li&gt;
&lt;li&gt;Allows customization of &lt;strong&gt;templates, layouts, menus, and styles&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Accessible via &lt;strong&gt;Appearance → Editor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Works only with &lt;strong&gt;Block Themes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-blocks"&gt;2. Blocks&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Blocks are &lt;strong&gt;individual, reusable components&lt;/strong&gt; (e.g., paragraph, image, button).&lt;/li&gt;
&lt;li&gt;Pages, posts, and templates are created by combining multiple blocks.&lt;/li&gt;
&lt;li&gt;Blocks are customizable and flexible.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-templates"&gt;3. Templates&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;template&lt;/strong&gt; is a collection of blocks arranged for a specific purpose.&lt;/li&gt;
&lt;li&gt;Used for pages, posts, archives, search results, etc.&lt;/li&gt;
&lt;li&gt;Examples: Single Post template, Page template, Archive template.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-block-themes"&gt;4. Block Themes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Themes designed specifically for Full Site Editing.&lt;/li&gt;
&lt;li&gt;Fully editable using the Site Editor.&lt;/li&gt;
&lt;li&gt;Include a &lt;strong&gt;theme.json&lt;/strong&gt; file to control:
&lt;ul&gt;
&lt;li&gt;Colors&lt;/li&gt;
&lt;li&gt;Typography&lt;/li&gt;
&lt;li&gt;Layout settings&lt;/li&gt;
&lt;li&gt;Block styles&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="key-benefits-of-full-site-editing"&gt;Key Benefits of Full Site Editing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No coding required for site-wide changes.&lt;/li&gt;
&lt;li&gt;Unified editing experience for content and design.&lt;/li&gt;
&lt;li&gt;Better control over global styles and layouts.&lt;/li&gt;
&lt;li&gt;Faster and more consistent site customization.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="multisite--network"&gt;Multisite / Network&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WordPress Multisite&lt;/strong&gt; allows multiple websites to run from a &lt;strong&gt;single WordPress installation&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;All sites share the same core files but have:
&lt;ul&gt;
&lt;li&gt;Separate dashboards&lt;/li&gt;
&lt;li&gt;Separate content&lt;/li&gt;
&lt;li&gt;Individual users&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Managed by a &lt;strong&gt;Network Admin (Super Admin)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="multisite-setup-basics"&gt;Multisite Setup Basics&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Enabled by adding &lt;strong&gt;one line of code&lt;/strong&gt; in &lt;code&gt;wp-config.php&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Can be created easily using &lt;strong&gt;LocalWP&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Multisite options during setup:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single Site&lt;/strong&gt; (default)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subdirectory Multisite&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;myproject.local/site1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subdomain Multisite&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;site1.myproject.local&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="use-cases-of-multisite"&gt;Use Cases of Multisite&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Managing multiple blogs or websites from one dashboard.&lt;/li&gt;
&lt;li&gt;Useful for universities, companies, or agencies.&lt;/li&gt;
&lt;li&gt;Centralized updates and plugin management.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260122/</link><pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260122/</guid><description>&lt;h2 id="wordpress-customizing"&gt;WordPress Customizing&lt;/h2&gt;
&lt;h3 id="themes--plugins"&gt;Themes &amp;amp; Plugins&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Themes&lt;/strong&gt; control the &lt;em&gt;appearance&lt;/em&gt; of a WordPress site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugins&lt;/strong&gt; extend &lt;em&gt;functionality&lt;/em&gt; beyond WordPress core features.&lt;/li&gt;
&lt;li&gt;WordPress relies heavily on plugins for customization and scalability.&lt;/li&gt;
&lt;li&gt;Multiple themes can be installed, but &lt;strong&gt;only one theme can be active&lt;/strong&gt; at a time.&lt;/li&gt;
&lt;li&gt;Theme and plugin &lt;strong&gt;auto-updates&lt;/strong&gt; can be enabled or disabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="wordpress-customizer"&gt;WordPress Customizer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Allows real-time visual customization of site settings.&lt;/li&gt;
&lt;li&gt;Common options include:
&lt;ul&gt;
&lt;li&gt;Site Identity (logo, title, tagline)&lt;/li&gt;
&lt;li&gt;Colors &amp;amp; typography&lt;/li&gt;
&lt;li&gt;Menus &amp;amp; widgets&lt;/li&gt;
&lt;li&gt;Homepage settings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="wordpress-editor-block-editor--gutenberg"&gt;WordPress Editor (Block Editor / Gutenberg)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Default editor since WordPress 5.0.&lt;/li&gt;
&lt;li&gt;Uses a &lt;strong&gt;block-based&lt;/strong&gt; content creation approach.&lt;/li&gt;
&lt;li&gt;Everything is a block: text, images, buttons, headings, etc.&lt;/li&gt;
&lt;li&gt;Supports:
&lt;ul&gt;
&lt;li&gt;Block patterns&lt;/li&gt;
&lt;li&gt;Reusable / Synced blocks&lt;/li&gt;
&lt;li&gt;Block directory for third-party blocks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="wordpress-terminology-key-terms"&gt;WordPress Terminology (Key Terms)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Back-end&lt;/strong&gt;: Admin dashboard for managing the site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Front-end&lt;/strong&gt;: Public-facing part of the website.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CMS&lt;/strong&gt;: Content Management System.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Theme&lt;/strong&gt;: Controls site design and layout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugin&lt;/strong&gt;: Adds or modifies functionality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Permalink&lt;/strong&gt;: Permanent URL for posts/pages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Widgets&lt;/strong&gt;: Small content blocks in sidebars or footers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menu / Navigation&lt;/strong&gt;: Structured links for site navigation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sidebar&lt;/strong&gt;: Widget-ready area (can have multiple).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Roles&lt;/strong&gt;: Define access and permissions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nonce&lt;/strong&gt;: Security token to prevent unauthorized actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="full-site-editing-fse"&gt;Full Site Editing (FSE)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Introduced in &lt;strong&gt;WordPress 5.9&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enables editing the entire site using blocks (no code required).&lt;/li&gt;
&lt;li&gt;Works only with &lt;strong&gt;Block Themes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="core-concepts"&gt;Core Concepts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Site Editor&lt;/strong&gt;: Edit templates, headers, footers, and layouts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blocks&lt;/strong&gt;: Building units of content and layout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Templates&lt;/strong&gt;: Define structure for pages, posts, archives, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Template Parts&lt;/strong&gt;: Reusable sections (header, footer).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global Styles&lt;/strong&gt;: Control site-wide typography, colors, and spacing via &lt;code&gt;theme.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="key-takeaways"&gt;Key Takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;WordPress customization relies on themes, plugins, and blocks.&lt;/li&gt;
&lt;li&gt;Gutenberg and FSE shift WordPress toward a &lt;strong&gt;visual, block-first editing experience&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Block themes + Global Styles = powerful, code-free site customization.&lt;/li&gt;
&lt;li&gt;Understanding WordPress terminology improves development and collaboration.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260121/</link><pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260121/</guid><description>&lt;h3 id="advanced-wordpress--php-integration--system-snippets"&gt;Advanced WordPress &amp;amp; PHP: Integration &amp;amp; System Snippets&lt;/h3&gt;
&lt;p&gt;External Database Connection&lt;/p&gt;
&lt;p&gt;Connecting to a database outside of the WordPress installation using the wpdb class.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Create a new database object for an external server
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;$external_db &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wpdb&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;db_user&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;db_password&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;db_name&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;db_host&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Query the external DB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;$results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $external_db&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;get_results&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#34;SELECT * FROM external_table LIMIT 10&amp;#34;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Error checking
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( $external_db&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;last_error&lt;/span&gt; ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;error_log&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;DB Error: &amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; $external_db&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;last_error&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="curl--remote-requests-wp_http"&gt;cURL / Remote Requests (WP_Http)&lt;/h3&gt;
&lt;p&gt;Using the WordPress wrapper for cURL (more secure and handles timeouts/SSL better).&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260120/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260120/</guid><description>&lt;h2 id="wordpress-core-architecture-and-request-lifecycle"&gt;WordPress Core Architecture and Request Lifecycle&lt;/h2&gt;
&lt;p&gt;WordPress is a dynamic Content Management System (CMS) powered by PHP and backed by a MySQL or MariaDB database. Understanding the path a request takes from the server to the browser is essential for high-performance development.&lt;/p&gt;
&lt;h3 id="1-the-request-pathway"&gt;1. The Request Pathway&lt;/h3&gt;
&lt;p&gt;When a user accesses a URL on a WordPress site, the following sequence occurs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Initialization:&lt;/strong&gt; The &lt;code&gt;index.php&lt;/code&gt; file in the root directory loads &lt;code&gt;wp-blog-header.php&lt;/code&gt;, which subsequently triggers &lt;code&gt;wp-load.php&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration:&lt;/strong&gt; The &lt;code&gt;wp-config.php&lt;/code&gt; file is parsed to establish database connections, set memory limits, and define security constants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core Loading:&lt;/strong&gt; WordPress loads the core files in &lt;code&gt;wp-includes/&lt;/code&gt;, initializes the plugin environment, and then loads the active theme.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Query:&lt;/strong&gt; The &lt;code&gt;WP_Query&lt;/code&gt; class parses the URL to determine what content is being requested (e.g., a single post, a category archive, or a custom post type).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Template Hierarchy:&lt;/strong&gt; WordPress selects the most specific template file available in the theme (e.g., &lt;code&gt;single-post.php&lt;/code&gt; before &lt;code&gt;single.php&lt;/code&gt; before &lt;code&gt;index.php&lt;/code&gt;) based on the Template Hierarchy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Loop:&lt;/strong&gt; The selected template executes &amp;ldquo;The Loop,&amp;rdquo; fetching data from the database and rendering the HTML output.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-file-and-directory-structure"&gt;2. File and Directory Structure&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;wp-admin/&lt;/code&gt;:&lt;/strong&gt; Contains the administrative dashboard logic. Core files here should never be modified.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;wp-includes/&lt;/code&gt;:&lt;/strong&gt; The library folder containing the majority of WordPress core functions, classes (like &lt;code&gt;WP_Query&lt;/code&gt;, &lt;code&gt;WP_Error&lt;/code&gt;), and APIs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;wp-content/&lt;/code&gt;:&lt;/strong&gt; The only directory where developers should actively add files.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/plugins/&lt;/code&gt;: Individual folders for site functionality.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/themes/&lt;/code&gt;: Folder for the active design and layout templates.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/uploads/&lt;/code&gt;: Media and file assets.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="the-hook-system-actions-and-filters"&gt;The Hook System: Actions and Filters&lt;/h2&gt;
&lt;p&gt;The &amp;ldquo;Hook&amp;rdquo; system is the mechanism that makes WordPress extensible without modifying core files. This is the foundation of professional plugin and theme development.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260119/</link><pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260119/</guid><description>&lt;ul&gt;
&lt;li&gt;WordPress started as a simple blogging platform but today is used as a CMS as well as an application framework. It can power many things such as eCommerce, LMS (this site), membership sites, communities (social networks), and backend for mobile/decoupled applications.&lt;/li&gt;
&lt;li&gt;WordPress can be installed using developer tools like &lt;a href="https://easyengine.io/"&gt;EasyEngine&lt;/a&gt;, &lt;a href="https://laravel.com/docs/11.x/valet"&gt;Laravel Valet&lt;/a&gt;, &lt;a href="https://localwp.com/"&gt;Local by Flywheel&lt;/a&gt;, &lt;a href="https://varyingvagrantvagrants.org/"&gt;Varying Vagrant Vagrants&lt;/a&gt; (VVV), and &lt;a href="https://lando.dev/"&gt;Lando&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="layout"&gt;Layout&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Toolbar&lt;/strong&gt; has links to various administration functions, and is displayed at the top of each Administration Screen. Many Toolbar items expand (flyout) when hovered over to display more information.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260116/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260116/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;code&gt;array_key_exists()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;username&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Ashish&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;bio&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// array_key_exists returns true because the key &amp;#39;bio&amp;#39; is present
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;var_dump&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;array_key_exists&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;bio&amp;#39;&lt;/span&gt;, $data)); &lt;span style="color:#75715e"&gt;// Output: bool(true)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;var_dump()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$user &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;id&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;active&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;var_dump&lt;/span&gt;($user);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Output:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;array(2) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; [&amp;#34;id&amp;#34;]=&amp;gt; int(1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; [&amp;#34;active&amp;#34;]=&amp;gt; bool(true)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;array_push($stack, &amp;quot;Apple&amp;quot;, &amp;quot;Raspberry&amp;quot;);&lt;/code&gt;: Adds to the end&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;array_unshift()&lt;/code&gt;: Adds to the start&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;$result = array_merge($defaults, $userSettings)&lt;/code&gt; : merge the arrays&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Function Declaration&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;functionName&lt;/span&gt;() { }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$functionName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() { };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;functionName&lt;/span&gt; ($arg1, $arg2) { }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;echo&lt;/code&gt;&lt;/strong&gt;: Does not have a return value&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;print&lt;/code&gt;&lt;/strong&gt;: Always returns the integer &lt;strong&gt;1&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;This &amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;is &amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;multiple &amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;parameters.&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// accepts multiple params
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;$result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;print&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// $result is now
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;include&lt;/code&gt;&lt;/strong&gt;: If the file is missing, it generates a &lt;strong&gt;Warning&lt;/strong&gt; (&lt;code&gt;E_WARNING&lt;/code&gt;). The script will &lt;strong&gt;continue&lt;/strong&gt; to execute the remaining code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;require&lt;/code&gt;&lt;/strong&gt;: If the file is missing, it generates a &lt;strong&gt;Fatal Error&lt;/strong&gt; (&lt;code&gt;E_COMPILE_ERROR&lt;/code&gt;). The script will &lt;strong&gt;stop&lt;/strong&gt; immediately.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;isset()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;test&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;isset&lt;/span&gt;($a)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;var set!&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;$_SERVER&lt;/code&gt;&lt;/strong&gt;: Contains information about headers, paths, and script locations.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260115/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260115/</guid><description>&lt;ul&gt;
&lt;li&gt;WP-CLI is a PHP-based tool that interacts with your WordPress files and database. It bypasses the web browser, making it significantly faster for repetitive tasks and bulk operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Task&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Command&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;List all plugins&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wp plugin list&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install &amp;amp; Activate&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wp plugin install contact-form-7 --activate&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update all plugins&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wp plugin update --all&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deactivate a plugin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wp plugin deactivate akismet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Export DB:&lt;/strong&gt; &lt;code&gt;wp db export&lt;/code&gt; (creates a &lt;code&gt;.sql&lt;/code&gt; file instantly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Import DB:&lt;/strong&gt; &lt;code&gt;wp db import file.sql&lt;/code&gt;&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260114/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260114/</guid><description>&lt;p&gt;&lt;a href="http://wordpress.org/"&gt;WordPress&lt;/a&gt; is a free and open-source web content management software (CMS) that can be downloaded and installed on one’s own server.&lt;/p&gt;
&lt;p&gt;VSCode Extensions&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eslint&lt;/li&gt;
&lt;li&gt;Code runner&lt;/li&gt;
&lt;li&gt;CSS flexbox cheatsheet&lt;/li&gt;
&lt;li&gt;Beautify&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Applications&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;LocalWP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;brew install composer wget php node&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install PHPCS&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;composer global require &amp;#34;squizlabs/php_codesniffer=*&amp;#34;
export PATH=&amp;#34;$HOME/.composer/vendor/bin:$PATH&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Install rules&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;composer global require dealerdirect/phpcodesniffer-composer-installer \
automattic/vipwpcs \
&amp;#34;phpcompatibility/phpcompatibility-wp:*&amp;#34; \
--update-no-dev -W
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Update&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;composer global update automattic/vipwpcs phpcompatibility/phpcompatibility-wp -W
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;p&gt;a &lt;strong&gt;&amp;ldquo;Sniff&amp;rdquo;&lt;/strong&gt; is a single PHP class that checks one specific coding rule.&lt;/p&gt;</description></item><item><title>daily notes</title><link>http://ashishji.is-a.dev/blog/notes/20260113/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/notes/20260113/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PHP: Hypertext Preprocessor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Runs on the &lt;strong&gt;server&lt;/strong&gt;, not in the browser&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With PHP you are not limited to output HTML. You can output images or PDF files. You can also output any text, such as XHTML and XML.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install: &lt;code&gt;dnf install php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;declare&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;strict_types&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Hello, PHP&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Master&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$age &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;21&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$iStudent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$int1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;012&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// =&amp;gt; 10 (a leading 0 denotes an octal number)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;$int4 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x0F&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// =&amp;gt; 15 (a leading 0x denotes a hex literal)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;$int5 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;b11111111&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 255 (a leading 0b denotes a binary number)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$float &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.234&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$float &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.2e3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$float &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;7E-10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Delete variable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;unset&lt;/span&gt;($int1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$number &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Shorthand op
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; $number&lt;span style="color:#f92672"&gt;++&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// increment op
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Special characters are only escaped in double quotes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;$escaped &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;This contains a &lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt; tab character.&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Age check&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ($age &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Adult&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Minor&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; ($i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; $i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;; $i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; $i;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;int&lt;/span&gt; $a, &lt;span style="color:#a6e22e"&gt;int&lt;/span&gt; $b)&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; $a &lt;span style="color:#f92672"&gt;+&lt;/span&gt; $b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;45&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$nums &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$user &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Master&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;role&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;student&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;User&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__construct&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt; $name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt; $role
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$user &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;User&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Master&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Student&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; $user&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Single line comment
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# single line comment
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; Mulit line comment*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;var_dump&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;var_dump&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;John&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;var_dump&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3.14&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;var_dump&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;PHP script starts with &lt;code&gt;&amp;lt;?php&lt;/code&gt; and ends with &lt;code&gt;?&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;php basic.php&lt;/code&gt; To run a file
&lt;code&gt;php -S web.php&lt;/code&gt; To start php server&lt;/p&gt;</description></item><item><title>CTF Write-up: TCS HackQuest Season 10</title><link>http://ashishji.is-a.dev/blog/posts/hackquest-2025/</link><pubDate>Fri, 19 Dec 2025 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/posts/hackquest-2025/</guid><description>&lt;p&gt;Cybersecurity is as much about persistence as it is about technical skill. I recently participated in &lt;strong&gt;TCS HackQuest Season 10&lt;/strong&gt; (held on December 13, 2025). The competition was intense, featuring a total of 14 challenges ranging from steganography and reverse engineering to web exploitation and binary analysis.&lt;/p&gt;
&lt;p&gt;Despite some technical hurdles with the server in the final hours, I managed to successfully solve &lt;strong&gt;11 out of the 14 questions&lt;/strong&gt;. This writeup provides a brief breakdown of my approach and the logic used to solve each challenge.&lt;/p&gt;</description></item><item><title>About This Blog</title><link>http://ashishji.is-a.dev/blog/posts/about-this-blog/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/posts/about-this-blog/</guid><description>&lt;p&gt;Hi, I’m Ashish. This is my blog, where I:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Document my journey in coding, security, and projects&lt;/li&gt;
&lt;li&gt;Share writeups of CTF challenges, experiments, and bypasses&lt;/li&gt;
&lt;li&gt;Explain technical concepts like TOTP, credit card verification, and system internals&lt;/li&gt;
&lt;li&gt;Record my projects, and everything else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a space to learn, reflect, and maybe help someone along the way.
Posts range from mini-experiments to full project deep dives.&lt;/p&gt;
&lt;p&gt;Welcome!&lt;/p&gt;</description></item><item><title>Bad Feedback</title><link>http://ashishji.is-a.dev/blog/posts/cloudsek-ctf-2025/bad-feedback/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/posts/cloudsek-ctf-2025/bad-feedback/</guid><description>&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Web Security / Injection&lt;br&gt;
&lt;strong&gt;Vulnerability:&lt;/strong&gt; XML External Entity (XXE) Injection&lt;/p&gt;
&lt;h2 id="1-challenge-description"&gt;1. Challenge Description&lt;/h2&gt;
&lt;p&gt;The challenge features a customer feedback form that claims to accept feedback &amp;ldquo;at face value.&amp;rdquo; The goal is to read a flag file stored on the server&amp;rsquo;s root directory.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Description: &amp;ldquo;Every feedback is accepted at face value, no questions asked. What can go wrong? Flag is in the root.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="2-reconnaissance"&gt;2. Reconnaissance&lt;/h2&gt;
&lt;p&gt;Inspecting the HTML source code revealed how the frontend processes the form data. A script intercepts the form submission and manually constructs an XML payload string before sending it to the &lt;code&gt;/feedback&lt;/code&gt; endpoint via &lt;code&gt;fetch&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Nitro</title><link>http://ashishji.is-a.dev/blog/posts/cloudsek-ctf-2025/nitro/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/posts/cloudsek-ctf-2025/nitro/</guid><description>&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Scripting / Automation&lt;br&gt;
&lt;strong&gt;Description:&lt;/strong&gt; A race-against-time challenge where the user must process data and submit a response faster than humanly possible.&lt;/p&gt;
&lt;h2 id="1-challenge-description"&gt;1. Challenge Description&lt;/h2&gt;
&lt;p&gt;The challenge provides a landing page with a clear directive: &lt;strong&gt;&amp;ldquo;Manual attempts miss the window—only code will do.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The workflow requires the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GET&lt;/strong&gt; a random string from &lt;code&gt;/task&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reverse&lt;/strong&gt; the string.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Base64 encode&lt;/strong&gt; the reversed string.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Format&lt;/strong&gt; the result into a specific template: &lt;code&gt;CSK__{{payload}}__2025&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;POST&lt;/strong&gt; the final string to &lt;code&gt;/submit&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Any attempt to perform these steps manually results in a generic &amp;ldquo;Too slow!&amp;rdquo; error, confirming that the server enforces a strict timeout (likely under 1 second).&lt;/p&gt;</description></item><item><title>Orbital Boot Sequence</title><link>http://ashishji.is-a.dev/blog/posts/cloudsek-ctf-2025/orbital-boot-sequence/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/posts/cloudsek-ctf-2025/orbital-boot-sequence/</guid><description>&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Web Exploitation&lt;br&gt;
&lt;strong&gt;Vulnerability:&lt;/strong&gt; Hardcoded Credentials, Weak JWT Secret, Server-Side Template Injection (SSTI)&lt;/p&gt;
&lt;h2 id="1-challenge-description"&gt;1. Challenge Description&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; &amp;ldquo;The Orbital Boot Sequence has stalled mid-launch. Can you restart the relay and seize control before the fleet drifts off-course? Submit the &lt;code&gt;root&lt;/code&gt; flag for the win.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="2-reconnaissance"&gt;2. Reconnaissance&lt;/h2&gt;
&lt;p&gt;Upon accessing the main page, I inspected the source code and noticed a reference to a JavaScript file named &lt;code&gt;/static/js/secrets.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Analyzing &lt;code&gt;secrets.js&lt;/code&gt; revealed hardcoded credentials in the &lt;code&gt;operatorLedger&lt;/code&gt; array:&lt;/p&gt;</description></item><item><title>Ticket</title><link>http://ashishji.is-a.dev/blog/posts/cloudsek-ctf-2025/ticket/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/posts/cloudsek-ctf-2025/ticket/</guid><description>&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Mobile / Web Security&lt;br&gt;
&lt;strong&gt;Vulnerability:&lt;/strong&gt; Hardcoded Secrets &amp;amp; JWT Forgery&lt;/p&gt;
&lt;h2 id="1-challenge-description"&gt;1. Challenge Description&lt;/h2&gt;
&lt;p&gt;Strike Bank detected unusual activity in their customer portal. The objective is to investigate their Android application (&lt;code&gt;com.strikebank.netbanking&lt;/code&gt;) using public OSINT tools, uncover hidden secrets, and use them to compromise the web portal to retrieve the flag.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Hint: &amp;ldquo;Everything you need is already out there! Connect the dots&amp;hellip;&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="2-reconnaissance-mobile-analysis"&gt;2. Reconnaissance (Mobile Analysis)&lt;/h2&gt;
&lt;p&gt;The challenge explicitly pointed to &lt;code&gt;bevigil.com&lt;/code&gt;, a search engine for mobile applications. By searching for the package name &lt;code&gt;com.strikebank.netbanking&lt;/code&gt;, we accessed the automated security report.&lt;/p&gt;</description></item><item><title>Triangle</title><link>http://ashishji.is-a.dev/blog/posts/cloudsek-ctf-2025/triangle/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>http://ashishji.is-a.dev/blog/posts/cloudsek-ctf-2025/triangle/</guid><description>&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Web Security / Source Code Review&lt;br&gt;
&lt;strong&gt;Vulnerability:&lt;/strong&gt; PHP Type Juggling (Loose Comparison) &amp;amp; Backup File Disclosure&lt;/p&gt;
&lt;h2 id="1-challenge-description"&gt;1. Challenge Description&lt;/h2&gt;
&lt;p&gt;The challenge presents a login interface protected by a &amp;ldquo;Trinity&amp;rdquo; of security layers: a username, a password, and three sequential One-Time Password (OTP) verification steps. The goal is to bypass these layers to retrieve the flag.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Description: &amp;ldquo;The system guards its secrets behind a username, a password, and three sequential verification steps. Only those who truly understand how the application works will pass all three. Break the Trinity and claim the flag.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>