---
title: SureCart/ Hoster Licencing Update
date: 2025-03-19T13:30:31Z
modified: 2025-03-25T18:13:40Z
permalink: "https://techarticles.co.uk/surecart-hoster-licencing-update/"
type: post
status: publish
excerpt: ""
wpid: 4673
categories:
  - Automation
  - Coding
  - Plugins
  - Reallyusefulplugins.com
  - SureCart
  - Wordpress
timestamp: 2025-03-25T18:13:40Z
tags:
  - Automation
  - Coding
  - Plugins
  - Reallyusefulplugins.com
  - SureCart
  - Wordpress
---

So, I use two licence managers for my plugins and three methods of updating plugins:

**Updates:** 1. [SureCart](https://ta0.uk/surecart) 2. [Hoster ](https://dplugins.com/downloads/hoster/)3. [WP Update Server](https://github.com/YahnisElsts/wp-update-server)

**Licencing:**  1. SureCart 2. Hoster, I also have [this, ](https://wpsoftwarelicense.com/,)but I tend not to use it any more as most of my “sales” are through my Surecart instance, and the ones that aren’t are through Hoster. I do also have Quadlayers Licence Manager for WooCommerce but it’s useless, and the documentation and support are pretty lacking

So, the WP Update Server handles my plugin updates. This includes the ones that would traditionally come from WordPress. Why? Because it lets me work with my update server and test plugins before they roll out to my critical sites, it’s just one step in my update progress.

I achieved this twofold in the first instance by running my own update server and my own update class, which is expandable to almost any plugin In fact, in the original version of this, the only plugin that caused me issues was WPcodeBox I had to modify the zip file to stop its inbuilt update check as they clash its all to do with slugs and WordPress requiring them to be unique. I have, though, been testing for quite some time some modifications and tweaks to the wp update server, which can be viewed [here](https://github.com/stingray82/wp-update-server-modifications). The Updater is bundled with my Ninja Updater plugin and so far I haven’t found a reason to chang a system that works well.

I then disable updates from anything but me with a snippet similar to this one, again run as a snippet by Ninja Updater, so if it’s installed and activated, updates will come from Ninja Updater

```
<span class="line"><span style="color: #B392F0">add_filter</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">'pre_set_site_transient_update_plugins'</span><span style="color: #E1E4E8">, </span><span style="color: #F97583">function</span><span style="color: #E1E4E8"> ($transient) {</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> (</span><span style="color: #79B8FF">empty</span><span style="color: #E1E4E8">($transient</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">response) </span><span style="color: #F97583">||</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">!</span><span style="color: #79B8FF">is_object</span><span style="color: #E1E4E8">($transient)) {</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> $transient;</span></span>
<span class="line"><span style="color: #E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #6A737D">// Allowed domains</span></span>
<span class="line"><span style="color: #E1E4E8">    $allowed_domains </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> [</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #9ECBFF">'downloads.wordpress.org'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #9ECBFF">'your-update-server.com'</span><span style="color: #E1E4E8">, </span><span style="color: #6A737D">// Replace with your actual update server domain</span></span>
<span class="line"><span style="color: #E1E4E8">    ];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">foreach</span><span style="color: #E1E4E8"> ($transient</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">response </span><span style="color: #F97583">as</span><span style="color: #E1E4E8"> $plugin_slug </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $plugin_data) {</span></span>
<span class="line"><span style="color: #E1E4E8">        $update_url </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">isset</span><span style="color: #E1E4E8">($plugin_data</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">package) </span><span style="color: #F97583">?</span><span style="color: #E1E4E8"> $plugin_data</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">package </span><span style="color: #F97583">:</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #6A737D">// Check if the update URL is from an allowed domain</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">!</span><span style="color: #79B8FF">empty</span><span style="color: #E1E4E8">($update_url)) {</span></span>
<span class="line"><span style="color: #E1E4E8">            $parsed_url </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">parse_url</span><span style="color: #E1E4E8">($update_url);</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">!</span><span style="color: #79B8FF">isset</span><span style="color: #E1E4E8">($parsed_url[</span><span style="color: #9ECBFF">'host'</span><span style="color: #E1E4E8">]) </span><span style="color: #F97583">||</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">!</span><span style="color: #79B8FF">in_array</span><span style="color: #E1E4E8">($parsed_url[</span><span style="color: #9ECBFF">'host'</span><span style="color: #E1E4E8">], $allowed_domains)) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #79B8FF">unset</span><span style="color: #E1E4E8">($transient</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">response[$plugin_slug]); </span><span style="color: #6A737D">// Remove unauthorized updates</span></span>
<span class="line"><span style="color: #E1E4E8">            }</span></span>
<span class="line"><span style="color: #E1E4E8">        }</span></span>
<span class="line"><span style="color: #E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> $transient;</span></span>
<span class="line"><span style="color: #E1E4E8">});</span></span>
<span class="line"></span>
```PHP

I can write a more in-depth article on this if there is interest, but the purpose of today’s article was about preparing releases for my “commercial plugins” I put it in speech marks because I still don’t consider myself a developer, and I still don’t consider it a business.

Hoster, I have written previously about my hoster workflow and even updated it recently, but in my last few days cleaning up code bases and making my workflows slicker,I’ve made some additional change and this is fast and efficient, and it all ties into my new documentation methodology

I can now keep a single text file-based update log in a repo for each plugin, call that log when updating hoster or sure cart release.json and upload the same text file to the website to generate the change log, I wanted to do additional work because I noticed some of my maintenance plugins need there “tested version” updated and I hadn’t done this for my hoster files for a longtime.

So I ran PHP on the Windows path, so I wrote an updated bat script, updated the [flowmattic](https://ta0.uk/flowmattic) flow and threw in a few PHP files to convert the text base change long into HTML ready to upload to Hoster and also can be imported into a SureCart json which accepts the same sort of data.

Another, called scan extracts scans for the WordPress headers and extracts them for me for the update, asking me if I want to update the version number, as well as this in each repo I now have a set of tools to allow me to quickly update the tested version by checking the WordPress API

A version of the updated plugin headers is below

```
<span class="line"><span style="color: #F97583"><?</span><span style="color: #79B8FF">php</span></span>
<span class="line"><span style="color: #6A737D">// Get plugin file from arguments</span></span>
<span class="line"><span style="color: #F97583">if</span><span style="color: #E1E4E8"> ($argc </span><span style="color: #F97583"><</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">2</span><span style="color: #E1E4E8">) {</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">die</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">"Usage: php update_plugin_headers.php <plugin_file></span><span style="color: #79B8FF">\n</span><span style="color: #9ECBFF">"</span><span style="color: #E1E4E8">);</span></span>
<span class="line"><span style="color: #E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">$plugin_file </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> $argv[</span><span style="color: #79B8FF">1</span><span style="color: #E1E4E8">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// Ensure the file exists</span></span>
<span class="line"><span style="color: #F97583">if</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">!</span><span style="color: #79B8FF">file_exists</span><span style="color: #E1E4E8">($plugin_file)) {</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">die</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">"Error: Plugin file not found.</span><span style="color: #79B8FF">\n</span><span style="color: #9ECBFF">"</span><span style="color: #E1E4E8">);</span></span>
<span class="line"><span style="color: #E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// Read the plugin file</span></span>
<span class="line"><span style="color: #E1E4E8">$plugin_content </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">file_get_contents</span><span style="color: #E1E4E8">($plugin_file);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// Detect comment style (supports both `/*` and `/**`)</span></span>
<span class="line"><span style="color: #E1E4E8">$comment_start </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">preg_match</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">"/</span><span style="color: #F97583">^</span><span style="color: #DBEDFF">\s</span><span style="color: #F97583">*</span><span style="color: #DBEDFF">\/\</span><span style="color: #F97583">*</span><span style="color: #DBEDFF">{1,2}</span><span style="color: #9ECBFF">/m"</span><span style="color: #E1E4E8">, $plugin_content) </span><span style="color: #F97583">?</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"/**"</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">:</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"/**"</span><span style="color: #E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// Define standard headers & defaults</span></span>
<span class="line"><span style="color: #E1E4E8">$headers </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> [</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'Plugin Name'</span><span style="color: #E1E4E8">       </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'Tested up to'</span><span style="color: #E1E4E8">      </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'6.7.2'</span><span style="color: #E1E4E8">,  </span><span style="color: #6A737D">// Always updated</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'Description'</span><span style="color: #E1E4E8">       </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'No description provided.'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'Requires at least'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'6.5'</span><span style="color: #E1E4E8">,    </span><span style="color: #6A737D">// Always updated</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'Requires PHP'</span><span style="color: #E1E4E8">      </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'7.4'</span><span style="color: #E1E4E8">,    </span><span style="color: #6A737D">// Always updated</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'Version'</span><span style="color: #E1E4E8">           </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8">,       </span><span style="color: #6A737D">// Always updated</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'Author'</span><span style="color: #E1E4E8">            </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'reallyusefulplugins.com'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'Author URI'</span><span style="color: #E1E4E8">        </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'https://reallyusefulplugins.com'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'License'</span><span style="color: #E1E4E8">           </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'GPL-2.0-or-later'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'License URI'</span><span style="color: #E1E4E8">       </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'https://www.gnu.org/licenses/gpl-2.0.html'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'Text Domain'</span><span style="color: #E1E4E8">       </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #9ECBFF">'Website'</span><span style="color: #E1E4E8">           </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'https://reallyusefulplugins.com'</span></span>
<span class="line"><span style="color: #E1E4E8">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">$plugin_info </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> [];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// Extract existing values, allowing flexible input formats</span></span>
<span class="line"><span style="color: #F97583">foreach</span><span style="color: #E1E4E8"> ($headers </span><span style="color: #F97583">as</span><span style="color: #E1E4E8"> $key </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $default) {</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> (</span><span style="color: #79B8FF">preg_match</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">"/</span><span style="color: #F97583">^</span><span style="color: #DBEDFF"> \</span><span style="color: #F97583">*</span><span style="color: #DBEDFF">? </span><span style="color: #E1E4E8">$key</span><span style="color: #DBEDFF">:\s</span><span style="color: #F97583">*</span><span style="color: #DBEDFF">(.</span><span style="color: #F97583">+</span><span style="color: #DBEDFF">)</span><span style="color: #F97583">$</span><span style="color: #9ECBFF">/mi"</span><span style="color: #E1E4E8">, $plugin_content, $matches)) {</span></span>
<span class="line"><span style="color: #E1E4E8">        $plugin_info[$key] </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">trim</span><span style="color: #E1E4E8">($matches[</span><span style="color: #79B8FF">1</span><span style="color: #E1E4E8">]);</span></span>
<span class="line"><span style="color: #E1E4E8">    } </span><span style="color: #F97583">else</span><span style="color: #E1E4E8"> {</span></span>
<span class="line"><span style="color: #E1E4E8">        $plugin_info[$key] </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">null</span><span style="color: #E1E4E8">; </span><span style="color: #6A737D">// Mark as missing</span></span>
<span class="line"><span style="color: #E1E4E8">    }</span></span>
<span class="line"><span style="color: #E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// Fetch latest WordPress version for "Tested up to"</span></span>
<span class="line"><span style="color: #E1E4E8">$latest_wp_version </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">file_get_contents</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">'https://api.wordpress.org/core/version-check/1.7/'</span><span style="color: #E1E4E8">);</span></span>
<span class="line"><span style="color: #E1E4E8">$latest_wp_version </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">json_decode</span><span style="color: #E1E4E8">($latest_wp_version, </span><span style="color: #79B8FF">true</span><span style="color: #E1E4E8">)[</span><span style="color: #9ECBFF">'offers'</span><span style="color: #E1E4E8">][</span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8">][</span><span style="color: #9ECBFF">'current'</span><span style="color: #E1E4E8">] </span><span style="color: #F97583">??</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'6.7.2'</span><span style="color: #E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// **Ask for version-related fields every time**</span></span>
<span class="line"><span style="color: #F97583">function</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">prompt</span><span style="color: #E1E4E8">($message, $default) {</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #79B8FF">echo</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"</span><span style="color: #E1E4E8">$message</span><span style="color: #9ECBFF"> [</span><span style="color: #E1E4E8">$default</span><span style="color: #9ECBFF">]: "</span><span style="color: #E1E4E8">;</span></span>
<span class="line"><span style="color: #E1E4E8">    $input </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">trim</span><span style="color: #E1E4E8">(</span><span style="color: #79B8FF">fgets</span><span style="color: #E1E4E8">(</span><span style="color: #79B8FF">STDIN</span><span style="color: #E1E4E8">));</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> $input </span><span style="color: #F97583">!==</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">""</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">?</span><span style="color: #E1E4E8"> $input </span><span style="color: #F97583">:</span><span style="color: #E1E4E8"> $default;</span></span>
<span class="line"><span style="color: #E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">$plugin_info[</span><span style="color: #9ECBFF">'Version'</span><span style="color: #E1E4E8">] </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">prompt</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">"Enter new Version"</span><span style="color: #E1E4E8">, $plugin_info[</span><span style="color: #9ECBFF">'Version'</span><span style="color: #E1E4E8">] </span><span style="color: #F97583">??</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8">);</span></span>
<span class="line"><span style="color: #E1E4E8">$plugin_info[</span><span style="color: #9ECBFF">'Requires at least'</span><span style="color: #E1E4E8">] </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">prompt</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">"Enter Requires at least"</span><span style="color: #E1E4E8">, $plugin_info[</span><span style="color: #9ECBFF">'Requires at least'</span><span style="color: #E1E4E8">] </span><span style="color: #F97583">??</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'6.5'</span><span style="color: #E1E4E8">);</span></span>
<span class="line"><span style="color: #E1E4E8">$plugin_info[</span><span style="color: #9ECBFF">'Tested up to'</span><span style="color: #E1E4E8">] </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">prompt</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">"Enter Tested up to (latest: </span><span style="color: #E1E4E8">$latest_wp_version</span><span style="color: #9ECBFF">)"</span><span style="color: #E1E4E8">, $latest_wp_version);</span></span>
<span class="line"><span style="color: #E1E4E8">$plugin_info[</span><span style="color: #9ECBFF">'Requires PHP'</span><span style="color: #E1E4E8">] </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">prompt</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">"Enter Requires PHP"</span><span style="color: #E1E4E8">, $plugin_info[</span><span style="color: #9ECBFF">'Requires PHP'</span><span style="color: #E1E4E8">] </span><span style="color: #F97583">??</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'7.4'</span><span style="color: #E1E4E8">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// **Only ask for missing fields**</span></span>
<span class="line"><span style="color: #F97583">foreach</span><span style="color: #E1E4E8"> ($headers </span><span style="color: #F97583">as</span><span style="color: #E1E4E8"> $key </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $default) {</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> ($plugin_info[$key] </span><span style="color: #F97583">===</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">null</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">||</span><span style="color: #E1E4E8"> $plugin_info[$key] </span><span style="color: #F97583">===</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8">) {</span></span>
<span class="line"><span style="color: #E1E4E8">        $plugin_info[$key] </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">prompt</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">"Enter </span><span style="color: #E1E4E8">$key</span><span style="color: #9ECBFF">"</span><span style="color: #E1E4E8">, $default);</span></span>
<span class="line"><span style="color: #E1E4E8">    }</span></span>
<span class="line"><span style="color: #E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// **Standardize Output**</span></span>
<span class="line"><span style="color: #E1E4E8">$max_length </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">max</span><span style="color: #E1E4E8">(</span><span style="color: #79B8FF">array_map</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">'strlen'</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">array_keys</span><span style="color: #E1E4E8">($headers))) </span><span style="color: #F97583">+</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">1</span><span style="color: #E1E4E8">;</span></span>
<span class="line"><span style="color: #E1E4E8">$spacing_format </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">" * %-{</span><span style="color: #E1E4E8">$max_length</span><span style="color: #9ECBFF">}s %s"</span><span style="color: #E1E4E8">; </span><span style="color: #6A737D">// **Proper spacing for alignment**</span></span>
<span class="line"><span style="color: #E1E4E8">$formatted_header </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"</span><span style="color: #E1E4E8">$comment_start</span><span style="color: #79B8FF">\n</span><span style="color: #9ECBFF">"</span><span style="color: #E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// **Ensure fields are in the correct order and properly formatted**</span></span>
<span class="line"><span style="color: #F97583">foreach</span><span style="color: #E1E4E8"> ($headers </span><span style="color: #F97583">as</span><span style="color: #E1E4E8"> $key </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $default) {</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">!</span><span style="color: #79B8FF">empty</span><span style="color: #E1E4E8">($plugin_info[$key])) {</span></span>
<span class="line"><span style="color: #E1E4E8">        $formatted_header </span><span style="color: #F97583">.=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">sprintf</span><span style="color: #E1E4E8">($spacing_format, $key </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">":"</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">trim</span><span style="color: #E1E4E8">($plugin_info[$key])) </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"</span><span style="color: #79B8FF">\n</span><span style="color: #9ECBFF">"</span><span style="color: #E1E4E8">;</span></span>
<span class="line"><span style="color: #E1E4E8">    }</span></span>
<span class="line"><span style="color: #E1E4E8">}</span></span>
<span class="line"><span style="color: #E1E4E8">$formatted_header </span><span style="color: #F97583">.=</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">" * */</span><span style="color: #79B8FF">\n</span><span style="color: #9ECBFF">"</span><span style="color: #E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// **Replace existing header block with the standardized version**</span></span>
<span class="line"><span style="color: #E1E4E8">$plugin_content </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">preg_replace</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">"/</span><span style="color: #DBEDFF">\/\</span><span style="color: #F97583">*</span><span style="color: #DBEDFF">{1,2}.</span><span style="color: #F97583">*</span><span style="color: #DBEDFF">?\</span><span style="color: #F97583">*</span><span style="color: #DBEDFF">\/</span><span style="color: #9ECBFF">/s"</span><span style="color: #E1E4E8">, $formatted_header, $plugin_content, </span><span style="color: #79B8FF">1</span><span style="color: #E1E4E8">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">// Save the updated plugin file</span></span>
<span class="line"><span style="color: #79B8FF">file_put_contents</span><span style="color: #E1E4E8">($plugin_file, $plugin_content);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #79B8FF">echo</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"✅ Plugin headers standardized successfully!</span><span style="color: #79B8FF">\n</span><span style="color: #9ECBFF">"</span><span style="color: #E1E4E8">;</span></span>
<span class="line"><span style="color: #F97583">?></span></span>
```PHP

Below is the output it asks me for information and lets me update them Enter means keep what suggested it now takes seconds to update and prepare a release for zipping

![Command prompt showing plugin headers updated successfully with version and PHP requirements.](https://techarticles.co.uk/wp-content/uploads/2025/03/plugin-header-standadised.png)

Once its headers are updated, I’ve nailed Hoster; it will generate an HTML file, which is uploaded and pulled by flowmattic on triggering along with new plugin data from the new standardised headers, this allows all this meta data to be updated in hoster with no issues what so ever and keeps my hoster plugins totally uptodate.

So once I am ready for a release, two commands and my plugin is updated, key information is updated as needed, and the release is auto-uploaded and available in hoster within about 30 seconds thanks to the bat scripts, PHP code and [sync back](https://ta0.uk/syncbackpro) pro. I don’t need to log to the website at all to make the update, its all done from my Windows development machine.

So that works for all the hoster plugins with no issues at all.

**SureCart**

My SureCart workflow is a little different, I don’t have direct access to products to add and update downloads and can’t do what I am doing here it also relies on release.json files in the plugin for updates which makes sense.

So I now needed to find a way to make these slicker and use the same changelog text file I will cover this once I have worked out my methodology.