<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>JH Tech Services</title>
  <subtitle>Freelance WordPress developer based in Cypress, TX. 10+ years building, migrating, and troubleshooting WordPress sites.</subtitle>
  <link href="https://jhtechservices.com/feed.xml" rel="self"/>
  <link href="https://jhtechservices.com/"/>
  <updated>2026-03-15T00:00:00Z</updated>
  <id>https://jhtechservices.com/</id>
  <author>
    <name>Jerod Hammerstein</name>
  </author>
  
  <entry>
    <title>Rebuilding My Site with Eleventy and AI</title>
    <link href="https://jhtechservices.com/posts/rebuilding-my-site-with-eleventy-and-ai/"/>
    <updated>2026-03-15T00:00:00Z</updated>
    <id>https://jhtechservices.com/posts/rebuilding-my-site-with-eleventy-and-ai/</id>
    <content type="html">&lt;p&gt;My website had been on autopilot for a while. I&#39;d been keeping up with WordPress core updates, but beyond that? Not much. I&#39;d been heads-down working with a couple of marketing firms, building and maintaining sites for their clients — which meant my own site kept getting pushed to the back burner.&lt;/p&gt;
&lt;p&gt;When I finally took a good look at it, a few things stood out. Some of the portfolio pieces were years old, and several of those projects we had already gone through redesigns since I posted them. The whole thing needed a refresh.&lt;/p&gt;
&lt;h2&gt;Why Not Just Stay on WordPress?&lt;/h2&gt;
&lt;p&gt;My first instinct was to rebuild in WordPress — it&#39;s what I do, it&#39;s my bread and butter, and I know it inside and out. When I ran the idea by Claude, sharing my Upwork history and LinkedIn experience, it came back with the same recommendation: stick with WordPress. Honestly, probably the smarter call for most people.&lt;/p&gt;
&lt;p&gt;But I wanted a project where I could go deep with AI — building a complete website from scratch, end to end, and seeing what the experience was actually like. So I kept going.&lt;/p&gt;
&lt;h2&gt;Why Eleventy Made Sense&lt;/h2&gt;
&lt;p&gt;One thing that&#39;s become clear working with AI tools is where they shine and where they don&#39;t. Page builders like Elementor are a great example of where AI struggles — they&#39;re UI-driven, visual, full of drag-and-drop interactions that don&#39;t translate to text. AI can&#39;t really work in that environment, yet.&lt;/p&gt;
&lt;p&gt;What AI &lt;em&gt;does&lt;/em&gt; handle well is text files. Markdown, HTML templates, config files — that&#39;s its natural habitat. Eleventy works entirely in that world. You write templates and markdown, run a build, and out comes a static site. It&#39;s a perfect match.&lt;/p&gt;
&lt;p&gt;I&#39;d actually built an Eleventy site about a year and a half ago, before AI was anywhere near what it is now. Back then, I&#39;d inherited a flat HTML site — no templating, nothing. Every page was its own standalone HTML file. Updating the header or footer meant touching every single file. It wasn&#39;t a huge project, but it was tedious enough that I converted the whole thing to Eleventy so we could work with real templates. That experience gave me a solid foundation for this one.&lt;/p&gt;
&lt;h2&gt;The Migration&lt;/h2&gt;
&lt;p&gt;This time around, with AI in the mix, things moved fast. Claude scaffolded the basic site structure — layouts, partials, config, everything — and I barely had to touch the code directly. Once the foundation was in place, I exported my WordPress content as a WXR XML file and Claude wrote a migration script to handle the rest.&lt;/p&gt;
&lt;p&gt;The script parsed the XML, converted each post&#39;s HTML to Markdown, downloaded the referenced images, and generated a properly formatted markdown file for every post. I had around 180 posts, some going back almost 20 years — tutorials for software that doesn&#39;t even exist anymore, posts about tools that have long since been replaced.&lt;/p&gt;
&lt;p&gt;Claude flagged this pretty quickly. It went through the post history and marked anything not directly related to WordPress as a draft, keeping those out of the public build while leaving them in the repo. It was a useful reality check — some of that old content probably does more harm than good sitting on a professional site.&lt;/p&gt;
&lt;h2&gt;Solving the Static Site Gaps&lt;/h2&gt;
&lt;p&gt;A fully static site does have some real limitations compared to a dynamic CMS. Two that came up immediately were forms and search.&lt;/p&gt;
&lt;p&gt;For contact forms, we went with &lt;strong&gt;Web3Forms&lt;/strong&gt;. It&#39;s a simple service — you POST to their API, they handle the email delivery. No server-side code required, works perfectly with a static site.&lt;/p&gt;
&lt;p&gt;For search, Claude recommended &lt;strong&gt;Pagefind&lt;/strong&gt;. It runs after the build and indexes all your content, generating a small set of files the browser can use to search locally. No backend, no API calls at runtime — it just works. I was skeptical at first, but it handles my volume of posts without any issues.&lt;/p&gt;
&lt;h2&gt;Was It Worth It?&lt;/h2&gt;
&lt;p&gt;Yeah, I think so. The site is faster, hosting is simpler, and the whole thing is easier to maintain going forward. Adding a new post is just writing a markdown file — no WordPress admin, no database, no plugin conflicts.&lt;/p&gt;
&lt;p&gt;The AI-assisted workflow was the real surprise. What would have taken me several days of setup and wrangling on my own came together in a fraction of the time. We are not talking days here. It was a few hours. The migration script alone would have been a multi-hour task; instead it was a short conversation and a working script.&lt;/p&gt;
&lt;p&gt;It&#39;s not a replacement for WordPress when clients need a full CMS, e-commerce, or complex backend functionality. But for a developer&#39;s personal site? Eleventy with AI assistance is a genuinely good stack.&lt;/p&gt;
&lt;p&gt;I&#39;m also building a wordpress plugin using Claude now.  I&#39;ll write about that soon.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Using Vue.js to Create a UI Component for WordPress</title>
    <link href="https://jhtechservices.com/posts/vuejs-wordpress-ui-component/"/>
    <updated>2024-01-18T00:00:00Z</updated>
    <id>https://jhtechservices.com/posts/vuejs-wordpress-ui-component/</id>
    <content type="html">&lt;p&gt;WordPress and Vue.js might seem like an odd pairing, but there are plenty of situations where you want a reactive UI component — a filterable list, a multi-step form, a dynamic pricing table — without rebuilding the whole site as a headless app.&lt;/p&gt;
&lt;p&gt;Here&#39;s the pragmatic approach: use Vue from a CDN and mount it on a specific element in your page template.&lt;/p&gt;
&lt;h2&gt;The Setup&lt;/h2&gt;
&lt;p&gt;No build step needed for simple components. Add Vue via CDN in your template or via &lt;code&gt;wp_enqueue_scripts&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;enqueue_vue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;wp_enqueue_script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;vue&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https://unpkg.com/vue@3/dist/vue.global.prod.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;3&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;wp_enqueue_script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;my-component&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;get_template_directory_uri&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;/js/service-filter.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;vue&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;1.0.0&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;wp_enqueue_scripts&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;enqueue_vue&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;A Simple Filterable List&lt;/h2&gt;
&lt;p&gt;Say you have a list of services pulled from a custom post type, and you want the user to be able to filter by category without a page reload.&lt;/p&gt;
&lt;p&gt;In your PHP template, render the data as a JSON variable:&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;service-filter-app&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-services&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;esc_attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;json_encode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$services_data&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then in &lt;code&gt;service-filter.js&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; createApp&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ref&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; computed &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Vue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;createApp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; el &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;service-filter-app&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; services &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;services&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; activeFilter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;all&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; filtered &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;computed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;activeFilter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;all&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; services&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; services&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;category &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; activeFilter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; services&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; activeFilter&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filtered &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
        &amp;lt;div&gt;
            &amp;lt;div class=&quot;filters&quot;&gt;
                &amp;lt;button @click=&quot;activeFilter = &#39;all&#39;&quot; :class=&quot;{ active: activeFilter === &#39;all&#39; }&quot;&gt;All&amp;lt;/button&gt;
            &amp;lt;/div&gt;
            &amp;lt;ul&gt;
                &amp;lt;li v-for=&quot;service in filtered&quot; :key=&quot;service.id&quot;&gt;
                    {{ service.title }}
                &amp;lt;/li&gt;
            &amp;lt;/ul&gt;
        &amp;lt;/div&gt;
    &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#service-filter-app&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;When to Use This Pattern&lt;/h2&gt;
&lt;p&gt;This CDN + inline approach works well for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Single interactive components on a mostly static page&lt;/li&gt;
&lt;li&gt;Client projects where you don&#39;t control the build environment&lt;/li&gt;
&lt;li&gt;Adding reactivity to an existing theme without breaking anything&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more complex applications with multiple components, routing, or state management, a proper build step with Vite is worth the setup cost.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This post is a placeholder — full content coming soon.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>ACF Blocks – Gutenberg Blocks the Easy Way</title>
    <link href="https://jhtechservices.com/posts/acf-blocks-gutenberg/"/>
    <updated>2023-11-02T00:00:00Z</updated>
    <id>https://jhtechservices.com/posts/acf-blocks-gutenberg/</id>
    <content type="html">&lt;p&gt;Building custom Gutenberg blocks from scratch means diving into React, the block API, &lt;code&gt;block.json&lt;/code&gt;, and a build process. For most WordPress projects, that&#39;s overkill — especially when you just need a testimonial card, a callout box, or a team member grid.&lt;/p&gt;
&lt;p&gt;ACF Blocks lets you define blocks with PHP and render them with a template file, no JavaScript build step required.&lt;/p&gt;
&lt;h2&gt;What You Need&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ACF Pro (the free version doesn&#39;t include Blocks)&lt;/li&gt;
&lt;li&gt;WordPress 5.0+&lt;/li&gt;
&lt;li&gt;A child theme or custom plugin to house your code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Registering a Block&lt;/h2&gt;
&lt;p&gt;You register ACF Blocks inside &lt;code&gt;acf_init&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;acf/init&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;register_acf_blocks&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;register_acf_blocks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;acf_register_block_type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;name&#39;&lt;/span&gt;              &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;testimonial&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;title&#39;&lt;/span&gt;             &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Testimonial&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;description&#39;&lt;/span&gt;       &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;A customer testimonial block.&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;render_template&#39;&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;blocks/testimonial.php&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;category&#39;&lt;/span&gt;          &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;formatting&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;icon&#39;&lt;/span&gt;              &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;admin-comments&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;keywords&#39;&lt;/span&gt;          &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;testimonial&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;quote&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;supports&#39;&lt;/span&gt;          &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;align&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Creating the Field Group&lt;/h2&gt;
&lt;p&gt;In the ACF UI, create a field group and set the location rule to &lt;strong&gt;Block → is equal to → Testimonial&lt;/strong&gt;. Add whatever fields you need — a quote textarea, author name, author title, star rating.&lt;/p&gt;
&lt;h2&gt;The Render Template&lt;/h2&gt;
&lt;p&gt;Create &lt;code&gt;blocks/testimonial.php&lt;/code&gt; in your theme:&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$quote&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;quote&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$author&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;author_name&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;author_title&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;blockquote&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;testimonial&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;esc_html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$quote&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;strong&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;esc_html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$author&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;strong&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;esc_html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;blockquote&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Preview Mode&lt;/h2&gt;
&lt;p&gt;ACF Blocks support a preview mode that renders your template in the editor. You can detect it with:&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$is_preview&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$is_preview&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Render a static preview image or simplified markup&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Why This Approach Works&lt;/h2&gt;
&lt;p&gt;For agencies and freelancers, ACF Blocks hit a sweet spot: clients get a native Gutenberg editing experience, developers get a familiar PHP template workflow, and you avoid the maintenance overhead of a full JavaScript block plugin.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This post is a placeholder — full content coming soon.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Adding Custom Checkout Fields to WooCommerce Checkout</title>
    <link href="https://jhtechservices.com/posts/woocommerce-custom-checkout-fields/"/>
    <updated>2023-09-15T00:00:00Z</updated>
    <id>https://jhtechservices.com/posts/woocommerce-custom-checkout-fields/</id>
    <content type="html">&lt;p&gt;WooCommerce gives you a powerful checkout experience out of the box, but sooner or later you&#39;ll need a field that isn&#39;t there by default — a delivery note, a company tax ID, or a custom product option that follows the order through to fulfillment.&lt;/p&gt;
&lt;p&gt;The good news: WooCommerce has hooks for exactly this, and you don&#39;t need a plugin to make it happen.&lt;/p&gt;
&lt;h2&gt;The Three Hooks You Need&lt;/h2&gt;
&lt;p&gt;Adding a custom checkout field in WooCommerce involves three steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Display the field&lt;/strong&gt; — &lt;code&gt;woocommerce_after_order_notes&lt;/code&gt; (or another position hook)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validate the field&lt;/strong&gt; — &lt;code&gt;woocommerce_checkout_process&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save the field&lt;/strong&gt; — &lt;code&gt;woocommerce_checkout_update_order_meta&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Displaying the Field&lt;/h2&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;woocommerce_after_order_notes&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;my_custom_checkout_field&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;my_custom_checkout_field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$checkout&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;woocommerce_form_field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;delivery_note&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;type&#39;&lt;/span&gt;        &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;textarea&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;class&#39;&lt;/span&gt;       &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;form-row-wide&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;label&#39;&lt;/span&gt;       &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Delivery Note&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;woocommerce&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;placeholder&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Any special delivery instructions?&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;woocommerce&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;required&#39;&lt;/span&gt;    &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$checkout&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;delivery_note&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Saving the Field&lt;/h2&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;woocommerce_checkout_update_order_meta&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;my_custom_checkout_field_update_order_meta&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;my_custom_checkout_field_update_order_meta&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$order_id&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_POST&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;delivery_note&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;update_post_meta&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$order_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;_delivery_note&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sanitize_textarea_field&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_POST&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;delivery_note&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Displaying It in the Admin Order View&lt;/h2&gt;
&lt;p&gt;Once saved, you&#39;ll want to surface this in the order admin screen:&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;woocommerce_admin_order_data_after_billing_address&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;my_custom_checkout_field_display_admin_order_meta&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;my_custom_checkout_field_display_admin_order_meta&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$order&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$note&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_post_meta&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$order&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;_delivery_note&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$note&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;&amp;lt;p&gt;&amp;lt;strong&gt;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Delivery Note&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;:&amp;lt;/strong&gt; &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;esc_html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$note&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;&amp;lt;/p&gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;This pattern covers the majority of custom checkout field use cases. For more complex scenarios — conditional fields, fields tied to specific products, or fields that affect shipping — the same hooks apply, just with extra conditional logic layered in.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This post is a placeholder — full content coming soon.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Using columns and flex to make a grid in Elementor</title>
    <link href="https://jhtechservices.com/posts/using-columns-and-flex-to-make-a-grid-in-elementor/"/>
    <updated>2022-03-09T00:00:00Z</updated>
    <id>https://jhtechservices.com/posts/using-columns-and-flex-to-make-a-grid-in-elementor/</id>
    <content type="html">&lt;pre&gt;&lt;code&gt;/* add class &#39;pt-service-grid&#39; to elementor section in each column add an inner-section widget to place your other widgets.  If you don&#39;t plan on adding background and such, you could skip the inner-section but these rules&#39; selectors will need to be changed */
/* keep the inner-section widget 100% height */
.pt-service-grid .elementor-inner-section,
.pt-service-grid .elementor-inner-section &amp;gt; .elementor-container {
	height:100%;
}
/* next two rules will make the first child, heading, expand so rest of elements are pushed down.  If a heading in another inner section wraps, then all other headings in the same row will expand as well and center itself*/
.pt-service-grid .elementor-inner-section &amp;gt; .elementor-container .elementor-widget-wrap {
	flex-flow: column nowrap;
}

.pt-service-grid .elementor-inner-section &amp;gt; .elementor-container .elementor-widget-wrap &amp;gt; div:first-child {
	flex:1; /* expand/grow if needed*/
	display: flex;
	justify-content:center;
	align-items: center;
}

/* Add as many columns in the elementor section as needed */
@media screen and (min-width: 416px) {

.pt-service-grid &amp;gt; .elementor-container {
	display: flex;
	justify-content: center;
	align-items: stretch;
	flex-flow: row wrap;
}

.pt-service-grid &amp;gt; .elementor-container &amp;gt; .elementor-column {
	flex: 1;
	width: 406px;
	min-width: 406px;
	max-width: 406px;
}
	
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://jhtechservices.com/images/posts/elementor-grid.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Take over the &#39;submit&#39; event in the Elementor Search form</title>
    <link href="https://jhtechservices.com/posts/take-over-the-submit-event-in-the-elementor-search-form/"/>
    <updated>2021-12-12T00:00:00Z</updated>
    <id>https://jhtechservices.com/posts/take-over-the-submit-event-in-the-elementor-search-form/</id>
    <content type="html">&lt;p&gt;I could not get my javascript code to submit an get request using ajax in Elementor. I figured out that my search form was in a popup and not in the DOM until the popup was active. So when trying to attach and add the submit event, it never worked.&lt;/p&gt;
&lt;p&gt;I&#39;m sure there is another way but the quickest solutions I found was to use the jQuery &#39;on&#39; function with delegation. So instead of attaching to the submit event directly like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(&#39;form.elementor-search-form&#39;).on(&#39;submit&#39;, function {
   //do my stuff here
 });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I did the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(&#39;body&#39;).on(&#39;submit&#39;, &#39;form.elementor-search-form&#39;, function(e) {
     //do my stuff here
  });
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Menu items bold on hover without shifting</title>
    <link href="https://jhtechservices.com/posts/menu-items-bold-on-hover-without-shifting/"/>
    <updated>2021-12-03T00:00:00Z</updated>
    <id>https://jhtechservices.com/posts/menu-items-bold-on-hover-without-shifting/</id>
    <content type="html">&lt;p&gt;When the menu item becomes bold it changes the width of the menu item causing it to shift. This trick makes the menu item already the size of the bolded text so it won&#39;t shift.&lt;/p&gt;
&lt;p&gt;This uses a filter to create an attribute called &#39;gtitle&#39; on each menu item that contains the same text as the menu item. We can then create a pseudo element (::before) on the menu-item that is bold but invisible. This will make the width of the element the size we want.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//* add title attribute to &amp;lt;a&amp;gt; in menu to allow for bold font without changing the size of a

add_filter( &#39;nav_menu_link_attributes&#39;, &#39;gtl_add_title_attrib_to_nav&#39;, 10, 2 );
function gtl_add_title_attrib_to_nav($attr, $item) {
	$attr[&#39;gtitle&#39;] = $item-&amp;gt;title;
	return $attr;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And for styling&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Probably want this selector to be more specific to the menu you want to affect 

.menu-item a:before {
      display: block;
      content: attr(gtitle);
      font-weight: bold;
      height: 1px;
      color: transparent;
      overflow: hidden;
      visibility: hidden;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I was doing this in Elementor which sets the anchor of a menu item with &#39;display: flex;&#39; This causes the ::before pseudo element along with the text in the anchor to go side by side instead of the ::before element right under and increasing the width of the anchor correctly. I didn&#39;t need the submenu icons so this css was also needed for this trick to work&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
// Probably want this selector to be more specific to the menu you want to affect

.menu-item a {
	display: block; 
}
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Adding tooltip to Woocommerce Variant photos</title>
    <link href="https://jhtechservices.com/posts/adding-tooltip-to-woocommerce-variant-photos/"/>
    <updated>2021-01-27T00:00:00Z</updated>
    <id>https://jhtechservices.com/posts/adding-tooltip-to-woocommerce-variant-photos/</id>
    <content type="html">&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
jQuery(window).load(function(){
if( jQuery(&#39;body&#39;).hasClass(&#39;single-product&#39;) ){
var imgtitles = [];
jQuery(&#39;.woocommerce-product-gallery__wrapper&#39;).children(&#39;div&#39;).each(function(){
    var imgTitle = jQuery(this).find(&#39;a img&#39;).attr(&#39;title&#39;);
    imgtitles.push(imgTitle);
});
if( jQuery(&#39;ol.flex-control-nav&#39;).length &amp;amp;&amp;amp; jQuery(&#39;ol.flex-control-nav&#39;).children().length&amp;gt;1 ){
    for(i=0; i&amp;lt;imgtitles.length; ++i){
        jQuery(&#39;ol.flex-control-nav li:nth-child(&#39;+(i+1)+&#39;) img&#39;).attr(&#39;title&#39;, imgtitles[i]);
    }
}
}});

&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Javascript to parse Shopify CSV file and combine line item fields for import into Woocommerce.</title>
    <link href="https://jhtechservices.com/posts/javascript-to-parse-shopify-csv-file-and-combine-line-item-fields-for-import-into-woocommerce/"/>
    <updated>2021-01-09T00:00:00Z</updated>
    <id>https://jhtechservices.com/posts/javascript-to-parse-shopify-csv-file-and-combine-line-item-fields-for-import-into-woocommerce/</id>
    <content type="html">&lt;p&gt;We are moving a client from Shopify to Woocommerce and using the WordPress WP-All-Import plugin to easily move the data to Woocommerce. In this article we are importing the orders. We&#39;ve already imported the customers and products which should be done first so orders can be linked to customers and products. The order export csv file from Shopify puts each line item of an order on a separate line. For importing we want each order on a single line and all line items in a single field separated by a pipe, &#39;|&#39;. So our program will parse in the csv file convert each line to an object and store into an array. We create a newLine holder to hold a line of data to export and orderNum which monitors what order number we are on.&lt;/p&gt;
&lt;p&gt;Here&#39;s the program using node.js&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const csv = require(&#39;csvtojson&#39;);
const csvWriter = require(&#39;csv-write-stream&#39;);
const fs = require(&#39;fs&#39;);



const orders = [];
const weights = [];

    let getProducts = 
    csv()
        .fromFile(&#39;ordersFromShopify.csv&#39;)
        .then((jsonObj) =&amp;gt; {

            jsonObj.forEach(function (item) {
          
                orders.push(item);
              
            })
        });
        
        
Promise.all([getProducts]).then(() =&amp;gt; {
        

    const newOrders = [];
    const writerExport = csvWriter({
    })
        
    writerExport.pipe(fs.createWriteStream(&#39;neworders.csv&#39;))
    let orderNum = &#39;&#39;;
    let newLine = {};
    
    for (const line of orders) {
        if (line[&#39;Name&#39;] !== orderNum) {
            if (typeof (newLine[&#39;Name&#39;]) !== &#39;undefined&#39;) {
                writerExport.write(newLine);
            }
            newLine = Object.assign({}, line)
            orderNum = line[&#39;Name&#39;];
        } else {
            newLine[&#39;Lineitem price&#39;] = newLine[&#39;Lineitem price&#39;] + &#39;|&#39; + line[&#39;Lineitem price&#39;]
            newLine[&#39;Lineitem name&#39;] = newLine[&#39;Lineitem name&#39;] + &#39;|&#39; + line[&#39;Lineitem name&#39;]
            newLine[&#39;Lineitem quantity&#39;] = newLine[&#39;Lineitem quantity&#39;] + &#39;|&#39; + line[&#39;Lineitem quantity&#39;]
            newLine[&#39;Lineitem sku&#39;] = newLine[&#39;Lineitem sku&#39;] + &#39;|&#39; + line[&#39;Lineitem sku&#39;]
            newLine[&#39;Lineitem fulfillment status&#39;] = newLine[&#39;Lineitem fulfillment status&#39;] + &#39;|&#39; + line[&#39;Lineitem fulfillment status&#39;]

        }
    }
    writerExport.write(newLine);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first line of the shopify order export csv file are the field names:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Name,Email,Financial Status,Paid at,Fulfillment Status,Fulfilled at,Accepts Marketing,Currency,Subtotal,Shipping,Taxes,Total,Discount Code,Discount Amount,Shipping Method,Created at,Lineitem quantity,Lineitem name,Lineitem price,Lineitem compare at price,Lineitem sku,Lineitem requires shipping,Lineitem taxable,Lineitem fulfillment status,Billing Name,Billing Street,Billing Address1,Billing Address2,Billing Company,Billing City,Billing Zip,Billing Province,Billing Country,Billing Phone,Shipping Name,Shipping Street,Shipping Address1,Shipping Address2,Shipping Company,Shipping City,Shipping Zip,Shipping Province,Shipping Country,Shipping Phone,Notes,Note Attributes,Cancelled at,Payment Method,Payment Reference,Refunded Amount,Vendor,Id,Tags,Risk Level,Source,Lineitem discount,Tax 1 Name,Tax 1 Value,Tax 2 Name,Tax 2 Value,Tax 3 Name,Tax 3 Value,Tax 4 Name,Tax 4 Value,Tax 5 Name,Tax 5 Value,Phone,Receipt Number,Duties
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>ACF Blocks - Gutenberg blocks the easy way</title>
    <link href="https://jhtechservices.com/posts/acf-blocks-gutenberg-blocks-the-easy-way/"/>
    <updated>2019-11-14T00:00:00Z</updated>
    <id>https://jhtechservices.com/posts/acf-blocks-gutenberg-blocks-the-easy-way/</id>
    <content type="html">&lt;p&gt;Just a quick posting that is long overdue. We&#39;ve successfully used the Advanced Custom Field plugin to create Gutenberg blocks for a project to a client. This has made it so much easier for the client to customize their pages with the design elements they wanted. Each design element becomes a block.&lt;/p&gt;
&lt;p&gt;The client was extremely happy with the results.&lt;/p&gt;
&lt;p&gt;We created a git repo with a bare bones version to use when we start the next project. You can view it &lt;a href=&quot;https://github.com/jer0dh/generic-acf-block-plugin&quot;&gt;here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We kept all the css and styling in the theme files for the blocks.&lt;/p&gt;
</content>
  </entry>
  
</feed>
