I wrote a plugin for our local U3A group, but I didn’t want to add it to the official WordPress.org repository as it had no relevance to the general WordPress user base. However, I still wanted to make it as easy as possible for people to install and update but WordPress won’t know how to check for updates on its own. That’s where Plugin Update Checker comes in.
Plugin Update Checker is a lightweight PHP library that adds WordPress-style update notifications to custom or private plugins. Once configured, your plugin behaves just like an official WordPress.org hosted plugin: WordPress checks for updates, shows the familiar “Update now” prompt, and installs the new version automatically (see below).

The library is maintained by Yahnis Elsts and supports multiple update sources, including GitHub, GitLab, Bitbucket, and custom update URLs.
Why Use Plugin Update Checker?
Using Plugin Update Checker gives you most of the benefits of wordpress.org updates without having to publish your plugin there:
- Updates appear directly in the WordPress admin dashboard
- Users don’t need to download ZIP files or upload anything manually
- You stay in control of where the plugin is hosted
- Works well for private, commercial, or bespoke plugins.
For site owners managing their own plugins, this removes the “I’ll update it later” problem. For developers, it provides a professional update experience with very little code.
How It Works (At a High Level)
At its simplest, Plugin Update Checker does three things:
- It tells WordPress where to look for update information
- It compares the installed plugin version with the latest available version
- It hands off the update process to WordPress itself
I have self-hosted my plugin but you can also have the update source as a GitHub repository. Doing so brings additional benefits as when you tag a new release, Plugin Update Checker detects the new version and WordPress does the rest.
Adding to Your Code (GitHub)
If you go the Github route then all you need to do is to download Plugin Update Checker and put it somewhere with your code and then add this to the top of your plugin’s code:
<?php
// Include the Plugin Update Checker library.
require_once __DIR__ . '/plugin-update-checker/plugin-update-checker.php';
use YahnisElsts\PluginUpdateChecker\v5\PucFactory;
// Create the update checker instance.
$updateChecker = PucFactory::buildUpdateChecker(
'https://github.com/yourusername/your-plugin-repo/',
__FILE__,
'your-plugin-slug'
);
// Optional: If you want to use only tagged releases.
$updateChecker->getVcsApi()->enableReleaseAssets();
What You Need to Change
- Repository URL
Replacehttps://github.com/yourusername/your-plugin-repo/with your actual repository URL. - Plugin file reference
Leave__FILE__as-is — this tells WordPress which plugin the updater belongs to. - Plugin slug
Use the same slug as your plugin folder name.
How Updates Are Triggered
Once this is in place:
- Tag a new release in GitHub (e.g.
v1.2.0) - Make sure the plugin’s version number in the header comment is updated
- WordPress will automatically detect and offer the update
No ZIP uploads, no FTP, no extra steps.
Adding to Your Code (Self-Hosted)
As I said previously I have gone the self-hosted route but the steps are still fairly straightfoward. Download Plugin Update Checker and put it somewhere with your code and then add this to the top of your plugin’s code:
<?php
// Include the Plugin Update Checker library.
require_once __DIR__ . '/plugin-update-checker/plugin-update-checker.php';
use YahnisElsts\PluginUpdateChecker\v5\PucFactory;
// Create the update checker using a custom metadata URL.
$updateChecker = PucFactory::buildUpdateChecker(
'https://example.com/updates/my-plugin.json',
__FILE__,
'my-plugin-slug'
);
You will also need to create a data file that holds the details about the plugin, such as where to find it, and any changes. It is the details from this file that are shown on the plugin’s update page, such as follows:

Create your JSON file (my-plugin.json) and put in the following, changing to match the details of your plugin:
{
"name": "My Custom Plugin",
"slug": "my-plugin-slug",
"version": "1.2.0",
"download_url": "https://example.com/updates/my-plugin-1.2.0.zip",
"requires": "6.0",
"tested": "6.5",
"last_updated": "2025-02-01",
"homepage": "https://example.com/my-plugin",
"sections": {
"description": "A custom WordPress plugin with self-hosted updates.",
"changelog": "<ul><li>Fixed something important</li><li>Improved performance</li></ul>"
}
}
How This Works
- WordPress checks the JSON file periodically
- Plugin Update Checker compares the installed version with
"version" - If a newer version is available:
- WordPress shows the update notice
- The ZIP from
download_urlis installed automatically
No GitHub, no repository access, and no user interaction beyond clicking Update.
Why This Approach Is Useful
- Works with private or commercial plugins
- No dependency on GitHub or third-party services
- Full control over:
- When updates appear
- What users see in the changelog
- Where files are hosted
This is also ideal if you’re already generating ZIPs as part of a build or release process.
When This Approach Makes Sense
Plugin Update Checker is a good fit when:
- You’re maintaining one or more custom plugins
- Your plugin isn’t suitable for wordpress.org’s plugin repository
- You want updates to “just work” for non-technical users
- You’re already using GitHub (or similar) for version control
If you only update a plugin once in a blue moon, manual updates may be fine. But if you’re releasing fixes or improvements regularly, automated updates quickly pay for themselves.