Enable automatic updates for WordPress plugins sold as Woocommerce downloadable products
Find a file
David Stone 0eeed4ef50 fix: assign Release_Notifier to global to prevent premature garbage collection
The instance was assigned to a local variable inside the woocommerce_loaded closure,
making its lifetime implicit. Assigning to a global makes the object lifetime explicit
and ensures it is not destroyed when the closure returns.
2026-04-02 23:27:36 -06:00
assets feat: dashboard overhaul with Chart.js charts, KPI cards, and unified analytics view (#15) 2026-03-27 20:00:33 -06:00
inc bugfix/20: fix(paypal): change partner referral products from EXPRESS_CHECKOUT to PPCP (#23) 2026-04-01 11:40:27 -06:00
templates update 2026-02-02 09:17:58 -07:00
vendor update autoloader 2026-01-23 10:57:23 -07:00
.gitignore chore: add .agents/loop-state/ to .gitignore 2026-03-25 23:57:01 -06:00
AGENTS.md Add AGENTS.md with project conventions for AI coding agents (#16) 2026-03-28 17:27:43 -06:00
composer.json chore: rename composer package from devstone/wp-update-server-plugin to ultimate-multisite/ultimate-update-server-plugin 2026-03-23 17:14:20 -06:00
composer.lock update autoloader 2026-01-23 10:57:23 -07:00
LICENSE Initial Commit 2025-05-25 16:31:44 -06:00
README.md feat: add site discovery to scrape subsites and network health from discovered domains (#10) 2026-03-27 13:16:53 -06:00
wp-update-server-plugin.php fix: assign Release_Notifier to global to prevent premature garbage collection 2026-04-02 23:27:36 -06:00

WP Update Server Plugin

This project creates an update server to enable automatic updates for WordPress plugins which are Woocommerce downloadable products.

Requires

Features

Telemetry Dashboard

Opt-in telemetry from Ultimate Multisite installations. Tracks PHP/WP/plugin versions, network types, active addons, and error reports.

Site Discovery (Network Health)

Background scraper that discovers network health signals from domains found via passive install tracking. Runs daily via WP-Cron and processes up to 20 domains per batch.

What it detects:

  • Whether the site is live (HTTP 2xx)
  • Whether it is a production domain (not staging/dev/local)
  • SSL/HTTPS availability
  • Presence of a checkout or registration page (UM shortcodes/blocks)
  • Estimated subsite count (subdirectory path probing + HTML signals)
  • Network type: subdomain vs subdirectory
  • Ultimate Multisite version (from asset URLs or meta tags)

Health score (0100):

Signal Points
Site is live +20
Production domain +15
Has SSL +10
Has checkout page +15
Detected subsites > 5 +20
Detected subsites > 50 +10
UM version fingerprinted +10

Privacy and ethics:

  • Only scrapes publicly accessible pages (homepage, /register/)
  • Respects robots.txt — skips sites that disallow UltimateMultisiteBot
  • User-Agent: UltimateMultisiteBot/1.0 (+https://ultimatemultisite.com/bot)
  • 10-second timeout per request; unresponsive sites are marked failed and retried next run
  • Stores only aggregate signals, not page content

Dashboard answers:

  • How many production networks have 10+ subsites?
  • How many networks have a checkout page (are selling to customers)?
  • Distribution of health scores across all discovered domains