2025-06-17 21:09:54 +01:00
|
|
|
|
UUPD: Universal Updater Drop-In for WordPress Plugins & Themes
|
|
|
|
|
|
==============================================================
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**UUPD** is a lightweight and flexible update manager for WordPress plugins and
|
|
|
|
|
|
themes. It supports both GitHub-hosted projects and private update servers, with
|
|
|
|
|
|
optional metadata caching and update debugging. The system is designed to work
|
|
|
|
|
|
seamlessly for plugin developers who want to manage updates outside of
|
|
|
|
|
|
WordPress.org.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
✨ Key Features
|
|
|
|
|
|
--------------
|
|
|
|
|
|
|
|
|
|
|
|
- Works with both **GitHub Releases** and **custom/private update servers**
|
|
|
|
|
|
|
|
|
|
|
|
- Uses native WordPress update hooks for seamless integration
|
|
|
|
|
|
|
|
|
|
|
|
- Caches metadata with transients to reduce API usage
|
|
|
|
|
|
|
|
|
|
|
|
- Manual "Check for updates" link added under plugin row
|
|
|
|
|
|
|
|
|
|
|
|
- Lightweight and dependency-free
|
|
|
|
|
|
|
|
|
|
|
|
- Optional GitHub token override for authenticated API calls
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-26 23:52:13 +01:00
|
|
|
|
📚 Additional Documentation
|
|
|
|
|
|
--------------------------
|
|
|
|
|
|
|
|
|
|
|
|
Looking for advanced usage, examples, or integration guides?
|
|
|
|
|
|
|
|
|
|
|
|
We've moved detailed and optional developer information into the [docs/](./docs)
|
|
|
|
|
|
folder for clarity.
|
|
|
|
|
|
|
|
|
|
|
|
Here you'll find:
|
|
|
|
|
|
|
|
|
|
|
|
These documents are optional but helpful if you're customizing UUPD for staging
|
|
|
|
|
|
sites, beta testers, private update servers, or power-user workflows.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
⚙️ Setup
|
|
|
|
|
|
-------
|
2025-06-17 21:09:54 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 1. **Add the Updater File**
|
|
|
|
|
|
|
|
|
|
|
|
Copy `includes/updater.php` into your plugin or theme directory.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 2. **Plugin Integration**
|
|
|
|
|
|
|
|
|
|
|
|
In your main plugin file (e.g. `my-plugin.php`):
|
|
|
|
|
|
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
add_action( 'plugins_loaded', function() {
|
|
|
|
|
|
require_once __DIR__ . '/includes/updater.php';
|
|
|
|
|
|
|
|
|
|
|
|
\UUPD\V1\UUPD_Updater_V1::register([
|
2025-07-26 23:24:01 +01:00
|
|
|
|
'plugin_file' => plugin_basename( __FILE__ ), // Required: "my-plugin/my-plugin.php"
|
|
|
|
|
|
'slug' => 'example-plugin', // Required: must match plugin slug or folder
|
|
|
|
|
|
'name' => 'Example Plugin', // Required: shown in update UI
|
|
|
|
|
|
'version' => '1.0.0', // Required: current plugin version
|
|
|
|
|
|
'server' => 'https://raw.githubusercontent.com/your-user/example-plugin/main/uupd/',
|
|
|
|
|
|
|
|
|
|
|
|
// Optional keys:
|
|
|
|
|
|
'github_token' => 'ghp_YourTokenHere', // GitHub token (for private repos or rate limits)
|
|
|
|
|
|
'key' => 'YourSecretKeyHere', // Optional secret for private servers
|
|
|
|
|
|
'textdomain' => 'example-plugin', // Optional, defaults to slug
|
|
|
|
|
|
'allow_prerelease'=> false, // Optional: allow beta/rc versions (default: false)
|
2025-06-17 21:09:54 +01:00
|
|
|
|
]);
|
2025-07-27 17:01:42 +01:00
|
|
|
|
}, 20); // You may increase this priority to allow filter overrides earlier
|
2025-06-17 21:09:54 +01:00
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 3. **Theme Integration**
|
|
|
|
|
|
|
|
|
|
|
|
In your theme's `functions.php`:
|
|
|
|
|
|
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
add_action( 'after_setup_theme', function() {
|
|
|
|
|
|
require_once get_stylesheet_directory() . '/includes/updater.php';
|
|
|
|
|
|
|
2025-07-26 23:24:01 +01:00
|
|
|
|
$updater_config = [
|
|
|
|
|
|
'slug' => 'example-theme', // Required: theme folder name
|
|
|
|
|
|
'name' => 'Example Theme', // Required: shown in update UI
|
|
|
|
|
|
'version' => '1.0.0', // Required: should match style.css Version
|
|
|
|
|
|
'server' => 'https://raw.githubusercontent.com/your-user/example-theme/main/uupd/',
|
|
|
|
|
|
|
|
|
|
|
|
// Optional keys:
|
|
|
|
|
|
'github_token' => 'ghp_YourTokenHere', // GitHub token (for private or rate-limited repos)
|
|
|
|
|
|
'key' => 'YourSecretKeyHere', // Optional secret key for private update servers
|
|
|
|
|
|
'textdomain' => 'example-theme', // Optional, defaults to slug
|
|
|
|
|
|
'allow_prerelease'=> false, // Optional: enable beta/rc updates (default: false)
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
add_action( 'admin_init', function() use ( $updater_config ) {
|
|
|
|
|
|
\UUPD\V1\UUPD_Updater_V1::register( $updater_config );
|
2025-07-27 17:01:42 +01:00
|
|
|
|
} 20); // Feel free to raise this priority for more override control
|
2025-06-17 21:09:54 +01:00
|
|
|
|
});
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
2025-07-26 23:52:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
2025-06-17 21:09:54 +01:00
|
|
|
|
📁 Hosting Your Update Metadata
|
|
|
|
|
|
------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
You can generate the required `index.json` using the `generate_index.php`
|
|
|
|
|
|
script:
|
|
|
|
|
|
|
|
|
|
|
|
### Inputs Required:
|
|
|
|
|
|
|
|
|
|
|
|
- `plugin.php` file
|
|
|
|
|
|
|
|
|
|
|
|
- `changelog.txt`
|
|
|
|
|
|
|
|
|
|
|
|
- GitHub username
|
|
|
|
|
|
|
|
|
|
|
|
- Repo name
|
|
|
|
|
|
|
|
|
|
|
|
### Output:
|
|
|
|
|
|
|
|
|
|
|
|
- `index.json` with plugin metadata
|
|
|
|
|
|
|
|
|
|
|
|
- Optional: `info.txt` for direct integration URL
|
|
|
|
|
|
|
|
|
|
|
|
This can be hosted anywhere:
|
|
|
|
|
|
|
|
|
|
|
|
- GitHub (via `raw.githubusercontent.com`)
|
|
|
|
|
|
|
|
|
|
|
|
- Static sites (e.g. Cloudflare Pages)
|
|
|
|
|
|
|
|
|
|
|
|
- PHP endpoint (compatible with WP Update Server or similar)
|
|
|
|
|
|
|
2025-07-09 07:06:36 +01:00
|
|
|
|
- Wordpress Site using the simple-update-server
|
2025-06-17 21:09:54 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
🚀 Example JSON URL
|
|
|
|
|
|
------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
https://raw.githubusercontent.com/your-user/your-plugin/main/uupd/index.json
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
|
|
Include this as the `server` in your UUPD config to allow automatic updates.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
📈 Debugging
|
|
|
|
|
|
-----------
|
|
|
|
|
|
|
|
|
|
|
|
Enable debug logging:
|
|
|
|
|
|
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
add_filter( 'updater_enable_debug', fn( $e ) => true );
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
|
|
Also in `wp-config.php`:
|
|
|
|
|
|
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
define( 'WP_DEBUG', true );
|
|
|
|
|
|
define( 'WP_DEBUG_LOG', true );
|
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
🔗 Compatibility
|
|
|
|
|
|
---------------
|
|
|
|
|
|
|
|
|
|
|
|
- WordPress 5.8+
|
|
|
|
|
|
|
|
|
|
|
|
- PHP 7.4+
|
|
|
|
|
|
|
|
|
|
|
|
- Compatible with WP-Cron, `wp_update_plugins()` and most deployment workflows
|
|
|
|
|
|
|
2025-07-26 23:34:36 +01:00
|
|
|
|
|
2025-07-26 23:24:01 +01:00
|
|
|
|
|
2025-06-17 21:09:54 +01:00
|
|
|
|
✨ Credits
|
|
|
|
|
|
---------
|
|
|
|
|
|
|
|
|
|
|
|
Created by [Really Useful Plugins](https://reallyusefulplugins.com). Inspired by
|
|
|
|
|
|
simplicity and the desire to empower developers with GitHub or private
|
2025-07-09 07:06:36 +01:00
|
|
|
|
updates—without lock-in.
|
|
|
|
|
|
|
2025-06-17 21:09:54 +01:00
|
|
|
|
**You can view a dummy plugin using this exact updater and its used for testing
|
|
|
|
|
|
new versions here:**
|
|
|
|
|
|
|
2025-07-09 07:06:36 +01:00
|
|
|
|
Plugin: <https://github.com/stingray82/example-plugin/>
|
2025-06-17 21:09:54 +01:00
|
|
|
|
Updates:
|
2025-07-09 07:06:36 +01:00
|
|
|
|
<https://raw.githubusercontent.com/stingray82/example-plugin/main/uupd/index.json>
|
2025-06-17 21:09:54 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-09 07:06:36 +01:00
|
|
|
|
Please if your editing the main update scope it read this [article
|
|
|
|
|
|
here](https://techarticles.co.uk/why-rescoping-is-important-uupd/) for
|
|
|
|
|
|
information and details on why you should scope if your not using standard
|
2025-06-17 21:09:54 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
🎉 Happy Updating!
|
|
|
|
|
|
-----------------
|