---
title: Custom Updater - Work In Progress
date: 2025-04-17T19:33:58Z
modified: 2025-04-27T10:36:37Z
permalink: "https://techarticles.co.uk/custom-updater-work-in-progress/"
type: post
status: publish
excerpt: ""
wpid: 4774
categories:
  - Blog
  - Coding
  - Plugins
  - Wordpress
timestamp: 2025-04-27T10:36:37Z
tags:
  - Blog
  - Coding
  - Plugins
  - Wordpress
---

In the last few weeks, I’ve made some good progress with SDKS for Hoster, WP Software License & WooCommerce API Manager, which gives me a pretty universal setup for future development if I don’t want to use [SureCart](https://ta0.uk/surecart). In fact,, using these custom SDK’S, I can deploy a “woocommerce site” and have it serving a license and updates in a matter of minutes to a new plugin. My work on a Quadmenus version has stalled due to support times and a worrying ability to “generate orders” using the secret key.

My free plugins update using a slightly modified version of Yahnis Elsts plugin-update-checker and connect to a server running a reasonably heavily modified wp-update-server from the same author, a version of which can be found [here ](https://github.com/stingray82/wp-update-server-modifications)with added API authentication so each plugin has its own “key” and will only serve that plugin as an update.

I have begun working on a custom integration for the plugins to reduce the updater size from , and this is the initial version of that updater.

```
<span class="line"><span style="color: #F97583"><?</span><span style="color: #79B8FF">php</span></span>
<span class="line"><span style="color: #6A737D">/**</span></span>
<span class="line"><span style="color: #6A737D"> * Universal Updater Drop‑In for Plugins & Themes</span></span>
<span class="line"><span style="color: #6A737D"> * Encapsulated in UUPD_Updater – safe to include multiple times.</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> * Usage:</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> *   1) Copy this file to `inc/updater.php` inside your plugin or theme.</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> *   2) In a **plugin**, in your main plugin file (e.g. `rup-changelogger.php`), hard‑code your version</span></span>
<span class="line"><span style="color: #6A737D"> *      and bootstrap on `plugins_loaded` + `admin_init` to avoid text‑domain warnings:</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> *        // Define your plugin version</span></span>
<span class="line"><span style="color: #6A737D"> *        define( 'RUP_PLUGIN_VERSION', '1.0' );</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> *      // Register updater early enough for the Updates screen</span></span>
<span class="line"><span style="color: #6A737D"> *        add_action( 'plugins_loaded', function() {</span></span>
<span class="line"><span style="color: #FDAEB7; font-style: italic">            $updater_config = [</span></span>
<span class="line"><span style="color: #FDAEB7; font-style: italic">                'plugin_file' => plugin_basename( __FILE__ ),</span></span>
<span class="line"><span style="color: #FDAEB7; font-style: italic">                'slug'        => 'rup-changelogger',  // "rup-changelogger"</span></span>
<span class="line"><span style="color: #FDAEB7; font-style: italic">                'name'        => 'Changelogger',        // "Changelogger"</span></span>
<span class="line"><span style="color: #FDAEB7; font-style: italic">                'version'     => RUP_PLUGIN_VERSION,     // "1.01"</span></span>
<span class="line"><span style="color: #FDAEB7; font-style: italic">                'key'         => 'YourSecretKeyHere',</span></span>
<span class="line"><span style="color: #FDAEB7; font-style: italic">                'server'      => 'https://updater.reallyusefulplugins.com/u/',</span></span>
<span class="line"><span style="color: #FDAEB7; font-style: italic">            ];</span></span>
<span class="line"><span style="color: #6A737D"> *            require_once __DIR__ . '/inc/updater.php';</span></span>
<span class="line"><span style="color: #6A737D"> *            new UUPD_Updater( $updater_config );</span></span>
<span class="line"><span style="color: #6A737D"> *        } );</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> *   3) In a **theme**, in your theme’s `functions.php`, bootstrap on `after_setup_theme` + `admin_init`:</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> *        add_action( 'after_setup_theme', function() {</span></span>
<span class="line"><span style="color: #6A737D"> *            $updater_config = [</span></span>
<span class="line"><span style="color: #6A737D"> *                'slug'    => 'test-updater-theme',    // match your theme folder & Text Domain</span></span>
<span class="line"><span style="color: #6A737D"> *                'name'    => 'Test Updater Theme',    // your theme’s human name</span></span>
<span class="line"><span style="color: #6A737D"> *                'version' => '1.0.0',                 // match your style.css Version header</span></span>
<span class="line"><span style="color: #6A737D"> *                'key'     => 'YourSecretKeyHere',</span></span>
<span class="line"><span style="color: #6A737D"> *                'server'  => 'https://updater.reallyusefulplugins.com/u/',</span></span>
<span class="line"><span style="color: #6A737D"> *            ];</span></span>
<span class="line"><span style="color: #6A737D"> *            require get_stylesheet_directory() . '/inc/updater.php';</span></span>
<span class="line"><span style="color: #6A737D"> *            // register update‐checker in time for WP Admin Updates</span></span>
<span class="line"><span style="color: #6A737D"> *            add_action( 'admin_init', function() use ( $updater_config ) {</span></span>
<span class="line"><span style="color: #6A737D"> *                new UUPD_Updater( $updater_config );</span></span>
<span class="line"><span style="color: #6A737D"> *            } );</span></span>
<span class="line"><span style="color: #6A737D"> *        } );</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> *   4) To enable logging of every HTTP call and injection step, add anywhere:</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> *        add_filter( 'updater_enable_debug', fn( $e ) => true );</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> *   5) In your `wp-config.php`, be sure to turn on WP_DEBUG_LOG:</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> *        define( 'WP_DEBUG',     true );</span></span>
<span class="line"><span style="color: #6A737D"> *        define( 'WP_DEBUG_LOG', true );</span></span>
<span class="line"><span style="color: #6A737D"> *</span></span>
<span class="line"><span style="color: #6A737D"> * Now your updater will:</span></span>
<span class="line"><span style="color: #6A737D"> *  - Fetch `/u/?action=get_metadata&slug={slug}&key={key}` on‐demand</span></span>
<span class="line"><span style="color: #6A737D"> *  - Cache the JSON for 1 hour</span></span>
<span class="line"><span style="color: #6A737D"> *  - Inject plugin updates if `plugin_file` is present</span></span>
<span class="line"><span style="color: #6A737D"> *  - Inject theme updates otherwise</span></span>
<span class="line"><span style="color: #6A737D"> *  - Populate the “View details” dialogs with your changelog</span></span>
<span class="line"><span style="color: #6A737D"> */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F97583">if</span><span style="color: #E1E4E8"> ( </span><span style="color: #F97583">!</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">class_exists</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'UUPD_Updater'</span><span style="color: #E1E4E8"> ) ) {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">class</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">UUPD_Updater</span><span style="color: #E1E4E8"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #6A737D">/** </span><span style="color: #F97583">@var</span><span style="color: #6A737D"> </span><span style="color: #F97583">array</span><span style="color: #6A737D"> */</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">private</span><span style="color: #E1E4E8"> $config;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #6A737D">/**</span></span>
<span class="line"><span style="color: #6A737D">         * </span><span style="color: #F97583">@param</span><span style="color: #6A737D"> </span><span style="color: #F97583">array</span><span style="color: #6A737D"> $config {</span></span>
<span class="line"><span style="color: #6A737D">         *   string 'slug'        Plugin or theme slug.</span></span>
<span class="line"><span style="color: #6A737D">         *   string 'name'        Human‐readable name.</span></span>
<span class="line"><span style="color: #6A737D">         *   string 'version'     Current version.</span></span>
<span class="line"><span style="color: #6A737D">         *   string 'key'         Your secret key.</span></span>
<span class="line"><span style="color: #6A737D">         *   string 'server'      Base URL of your updater endpoint.</span></span>
<span class="line"><span style="color: #6A737D">         *   string 'plugin_file' Only for plugins: plugin_basename(__FILE__).</span></span>
<span class="line"><span style="color: #6A737D">         * }</span></span>
<span class="line"><span style="color: #6A737D">         */</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">public</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">function</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">__construct</span><span style="color: #E1E4E8">( </span><span style="color: #F97583">array</span><span style="color: #E1E4E8"> $config ) {</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">config </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> $config;</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">register_hooks</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">        </span><span style="color: #6A737D">/** Attach only the appropriate hooks. */</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">private</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">function</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">register_hooks</span><span style="color: #E1E4E8">() {</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: #E1E4E8"> </span><span style="color: #79B8FF">empty</span><span style="color: #E1E4E8">( </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">config[</span><span style="color: #9ECBFF">'plugin_file'</span><span style="color: #E1E4E8">] ) ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><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: #79B8FF">$this</span><span style="color: #E1E4E8">, </span><span style="color: #9ECBFF">'plugin_update'</span><span style="color: #E1E4E8"> ], </span><span style="color: #79B8FF">10</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">                </span><span style="color: #B392F0">add_filter</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'plugins_api'</span><span style="color: #E1E4E8">,                          [ </span><span style="color: #79B8FF">$this</span><span style="color: #E1E4E8">, </span><span style="color: #9ECBFF">'plugin_info'</span><span style="color: #E1E4E8"> ],   </span><span style="color: #79B8FF">10</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">3</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">                </span><span style="color: #B392F0">add_filter</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'pre_set_site_transient_update_themes'</span><span style="color: #E1E4E8">, [ </span><span style="color: #79B8FF">$this</span><span style="color: #E1E4E8">, </span><span style="color: #9ECBFF">'theme_update'</span><span style="color: #E1E4E8"> ],  </span><span style="color: #79B8FF">10</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">                </span><span style="color: #B392F0">add_filter</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'themes_api'</span><span style="color: #E1E4E8">,                           [ </span><span style="color: #79B8FF">$this</span><span style="color: #E1E4E8">, </span><span style="color: #9ECBFF">'theme_info'</span><span style="color: #E1E4E8"> ],     </span><span style="color: #79B8FF">10</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">3</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>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #6A737D">/** Perform the HTTP request and cache the JSON for 6 hours. */</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">private</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">function</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">fetch_remote</span><span style="color: #E1E4E8">() {</span></span>
<span class="line"><span style="color: #E1E4E8">            $c    </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">config;</span></span>
<span class="line"><span style="color: #E1E4E8">            $slug </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">rawurlencode</span><span style="color: #E1E4E8">( $c[</span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">] );</span></span>
<span class="line"><span style="color: #E1E4E8">            $key  </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">rawurlencode</span><span style="color: #E1E4E8">( $c[</span><span style="color: #9ECBFF">'key'</span><span style="color: #E1E4E8">] );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #6A737D">// get the current site’s host (e.g. “example.com”)</span></span>
<span class="line"><span style="color: #E1E4E8">            $home </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">untrailingslashit</span><span style="color: #E1E4E8">( </span><span style="color: #B392F0">home_url</span><span style="color: #E1E4E8">() );</span></span>
<span class="line"><span style="color: #E1E4E8">            $host </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">rawurlencode</span><span style="color: #E1E4E8">( </span><span style="color: #B392F0">wp_parse_url</span><span style="color: #E1E4E8">( $home, </span><span style="color: #79B8FF">PHP_URL_HOST</span><span style="color: #E1E4E8"> ) );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #6A737D">// build URL with domain= query-param</span></span>
<span class="line"><span style="color: #E1E4E8">            $url </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">untrailingslashit</span><span style="color: #E1E4E8">( $c[</span><span style="color: #9ECBFF">'server'</span><span style="color: #E1E4E8">] ) </span></span>
<span class="line"><span style="color: #E1E4E8">                 </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">"/?action=get_metadata&slug={</span><span style="color: #E1E4E8">$slug</span><span style="color: #9ECBFF">}&key={</span><span style="color: #E1E4E8">$key</span><span style="color: #9ECBFF">}&domain={</span><span style="color: #E1E4E8">$host</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: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"→ Fetching metadata: {</span><span style="color: #E1E4E8">$url</span><span style="color: #9ECBFF">}"</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">            $resp </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">wp_remote_get</span><span style="color: #E1E4E8">( $url, [</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'timeout'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">15</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'headers'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> [</span></span>
<span class="line"><span style="color: #E1E4E8">                    </span><span style="color: #9ECBFF">'Accept'</span><span style="color: #E1E4E8">     </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'application/json'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">                    </span><span style="color: #9ECBFF">'User-Agent'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'WordPress/'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">get_bloginfo</span><span style="color: #E1E4E8">(</span><span style="color: #9ECBFF">'version'</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>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> ( </span><span style="color: #B392F0">is_wp_error</span><span style="color: #E1E4E8">( $resp ) ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'✗ HTTP error: '</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> $resp</span><span style="color: #F97583">-></span><span style="color: #B392F0">get_error_message</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">            $code </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">wp_remote_retrieve_response_code</span><span style="color: #E1E4E8">( $resp );</span></span>
<span class="line"><span style="color: #E1E4E8">            $body </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">wp_remote_retrieve_body</span><span style="color: #E1E4E8">( $resp );</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"← HTTP {</span><span style="color: #E1E4E8">$code</span><span style="color: #9ECBFF">}: "</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">trim</span><span style="color: #E1E4E8">( $body ) );</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">200</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">!==</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">int</span><span style="color: #E1E4E8">) $code ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #F97583">return</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">            $meta </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">json_decode</span><span style="color: #E1E4E8">( $body );</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: #E1E4E8"> $meta ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'✗ JSON decode failed: '</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">var_export</span><span style="color: #E1E4E8">( $body, </span><span style="color: #79B8FF">true</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">            </span><span style="color: #6A737D">// Ensure expected properties exist</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #F97583">foreach</span><span style="color: #E1E4E8"> ( [ </span><span style="color: #9ECBFF">'version'</span><span style="color: #E1E4E8">,</span><span style="color: #9ECBFF">'tested'</span><span style="color: #E1E4E8">,</span><span style="color: #9ECBFF">'requires'</span><span style="color: #E1E4E8">,</span><span style="color: #9ECBFF">'changelog_html'</span><span style="color: #E1E4E8">,</span><span style="color: #9ECBFF">'homepage'</span><span style="color: #E1E4E8">,</span><span style="color: #9ECBFF">'download_url'</span><span style="color: #E1E4E8"> ] </span><span style="color: #F97583">as</span><span style="color: #E1E4E8"> $f ) {</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: #E1E4E8"> </span><span style="color: #79B8FF">isset</span><span style="color: #E1E4E8">( $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">$f ) ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                    $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">$f </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>
<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">// Cache for 6 hours</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #B392F0">set_transient</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'upd_'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">], $meta, </span><span style="color: #79B8FF">6</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">*</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">HOUR_IN_SECONDS</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"✓ Cached metadata for '{</span><span style="color: #E1E4E8">$c</span><span style="color: #9ECBFF">['slug']}' → v{</span><span style="color: #E1E4E8">$meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version</span><span style="color: #9ECBFF">} (6h)"</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">        }</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #6A737D">/** Plugin: inject update when remote > current */</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">public</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">function</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">plugin_update</span><span style="color: #E1E4E8">( $trans ) {</span></span>
<span class="line"><span style="color: #E1E4E8">            $c    </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">config;</span></span>
<span class="line"><span style="color: #E1E4E8">            $slug </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">];</span></span>
<span class="line"><span style="color: #E1E4E8">            $file </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'plugin_file'</span><span style="color: #E1E4E8">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"→ Plugin-update hook for '{</span><span style="color: #E1E4E8">$slug</span><span style="color: #9ECBFF">}'"</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">            $current </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> $trans</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">checked[ $file ] </span><span style="color: #F97583">??</span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'version'</span><span style="color: #E1E4E8">];</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"    Current plugin v{</span><span style="color: #E1E4E8">$current</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">// On-demand fetch if missing</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">false</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">===</span><span style="color: #E1E4E8"> ( $meta </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">get_transient</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'upd_'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> $slug ) ) ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">fetch_remote</span><span style="color: #E1E4E8">();</span></span>
<span class="line"><span style="color: #E1E4E8">                $meta </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">get_transient</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'upd_'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> $slug );</span></span>
<span class="line"><span style="color: #E1E4E8">            }</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: #E1E4E8"> $meta ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> $trans;</span></span>
<span class="line"><span style="color: #E1E4E8">            }</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"    Remote plugin v{</span><span style="color: #E1E4E8">$meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version</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: #F97583">if</span><span style="color: #E1E4E8"> ( </span><span style="color: #79B8FF">version_compare</span><span style="color: #E1E4E8">( $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version, $current, </span><span style="color: #9ECBFF">'<='</span><span style="color: #E1E4E8"> ) ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"    ✗ No newer version"</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"> $trans;</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: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"    ✓ Injecting plugin update → v{</span><span style="color: #E1E4E8">$meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version</span><span style="color: #9ECBFF">}"</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">            $trans</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">response[ $file ] </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">object</span><span style="color: #E1E4E8">) [</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">        </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $slug,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'new_version'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'package'</span><span style="color: #E1E4E8">     </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">download_url,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'tested'</span><span style="color: #E1E4E8">      </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">tested,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'requires'</span><span style="color: #E1E4E8">    </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">requires,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'sections'</span><span style="color: #E1E4E8">    </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> [ </span><span style="color: #9ECBFF">'changelog'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">changelog_html ],</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"> $trans;</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">/** Plugin: details popup */</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">public</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">function</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">plugin_info</span><span style="color: #E1E4E8">( $res, $action, $args ) {</span></span>
<span class="line"><span style="color: #E1E4E8">            $c </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">config;</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> ( </span><span style="color: #9ECBFF">'plugin_information'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">!==</span><span style="color: #E1E4E8"> $action </span><span style="color: #F97583">||</span><span style="color: #E1E4E8"> $args</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">slug </span><span style="color: #F97583">!==</span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'slug'</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"> $res;</span></span>
<span class="line"><span style="color: #E1E4E8">            }</span></span>
<span class="line"><span style="color: #E1E4E8">            $meta </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">get_transient</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'upd_'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">] );</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: #E1E4E8"> $meta ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> $res;</span></span>
<span class="line"><span style="color: #E1E4E8">            }</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">object</span><span style="color: #E1E4E8">) [</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'name'</span><span style="color: #E1E4E8">          </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'name'</span><span style="color: #E1E4E8">],</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">          </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">],</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"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'tested'</span><span style="color: #E1E4E8">        </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">tested,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'requires'</span><span style="color: #E1E4E8">      </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">requires,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'sections'</span><span style="color: #E1E4E8">      </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> [ </span><span style="color: #9ECBFF">'changelog'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">changelog_html ],</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'download_link'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">download_url,</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: #6A737D">/** Theme: inject update when remote > current */</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">public</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">function</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">theme_update</span><span style="color: #E1E4E8">( $trans ) {</span></span>
<span class="line"><span style="color: #E1E4E8">            $c    </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">config;</span></span>
<span class="line"><span style="color: #E1E4E8">            $slug </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"→ Theme-update hook for '{</span><span style="color: #E1E4E8">$slug</span><span style="color: #9ECBFF">}'"</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">            $current </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> $trans</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">checked[ $slug ] </span><span style="color: #F97583">??</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">wp_get_theme</span><span style="color: #E1E4E8">( $slug )</span><span style="color: #F97583">-></span><span style="color: #B392F0">get</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'Version'</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"    Current theme v{</span><span style="color: #E1E4E8">$current</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">// On-demand fetch if missing</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">false</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">===</span><span style="color: #E1E4E8"> ( $meta </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">get_transient</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'upd_'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> $slug ) ) ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">fetch_remote</span><span style="color: #E1E4E8">();</span></span>
<span class="line"><span style="color: #E1E4E8">                $meta </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">get_transient</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'upd_'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> $slug );</span></span>
<span class="line"><span style="color: #E1E4E8">            }</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: #E1E4E8"> $meta ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> $trans;</span></span>
<span class="line"><span style="color: #E1E4E8">            }</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"    Remote theme v{</span><span style="color: #E1E4E8">$meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version</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: #F97583">if</span><span style="color: #E1E4E8"> ( </span><span style="color: #79B8FF">version_compare</span><span style="color: #E1E4E8">( $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version, $current, </span><span style="color: #9ECBFF">'<='</span><span style="color: #E1E4E8"> ) ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"    ✗ No newer version"</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"> $trans;</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: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"    ✓ Injecting theme update → v{</span><span style="color: #E1E4E8">$meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version</span><span style="color: #9ECBFF">}"</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">            $trans</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">response[ $slug ] </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> [</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'theme'</span><span style="color: #E1E4E8">       </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $slug,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'new_version'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'package'</span><span style="color: #E1E4E8">     </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">download_url,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'url'</span><span style="color: #E1E4E8">         </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">homepage,</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"> $trans;</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">/** Theme: details popup */</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">public</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">function</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">theme_info</span><span style="color: #E1E4E8">( $res, $action, $args ) {</span></span>
<span class="line"><span style="color: #E1E4E8">            $c </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">$this</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">config;</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> ( </span><span style="color: #9ECBFF">'theme_information'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">!==</span><span style="color: #E1E4E8"> $action </span><span style="color: #F97583">||</span><span style="color: #E1E4E8"> $args</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">slug </span><span style="color: #F97583">!==</span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'slug'</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"> $res;</span></span>
<span class="line"><span style="color: #E1E4E8">            }</span></span>
<span class="line"><span style="color: #E1E4E8">            $meta </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">get_transient</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'upd_'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">.</span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">] );</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: #E1E4E8"> $meta ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> $res;</span></span>
<span class="line"><span style="color: #E1E4E8">            }</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">object</span><span style="color: #E1E4E8">) [</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'name'</span><span style="color: #E1E4E8">          </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'name'</span><span style="color: #E1E4E8">],</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">          </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $c[</span><span style="color: #9ECBFF">'slug'</span><span style="color: #E1E4E8">],</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"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">version,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'tested'</span><span style="color: #E1E4E8">        </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">tested,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'requires'</span><span style="color: #E1E4E8">      </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">requires,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'sections'</span><span style="color: #E1E4E8">      </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> [ </span><span style="color: #9ECBFF">'changelog'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">changelog_html ],</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'download_link'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">download_url,</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #9ECBFF">'homepage'</span><span style="color: #E1E4E8">      </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> $meta</span><span style="color: #F97583">-></span><span style="color: #E1E4E8">homepage,</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: #6A737D">/** Optional debug logger */</span></span>
<span class="line"><span style="color: #E1E4E8">        </span><span style="color: #F97583">private</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">function</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">log</span><span style="color: #E1E4E8">( $msg ) {</span></span>
<span class="line"><span style="color: #E1E4E8">            </span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> ( </span><span style="color: #B392F0">apply_filters</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'updater_enable_debug'</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">false</span><span style="color: #E1E4E8"> ) ) {</span></span>
<span class="line"><span style="color: #E1E4E8">                </span><span style="color: #79B8FF">error_log</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">"[Updater] {</span><span style="color: #E1E4E8">$msg</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">    }</span></span>
<span class="line"><span style="color: #E1E4E8">}</span></span>
```PHP

My plan with this is simple: to have a much lighter integration with the free plugins. This means some of the smaller ones will be much smaller in size and will fully auto-update using my custom endpoint and the set license keys. What’s more, it’s designed to work with WP Update Server

The Good News is I am very nearly done with the boring dev prep and can get back to creating something again

27th April 2025 – Small Update to send domain details with the update