Git Updater

Plugin Banner

Git Updater

by Andy Fragen

Download
Description

This plugin was originally designed to simply update any GitHub hosted WordPress plugin or theme. Currently, plugins or themes hosted on Bitbucket, GitLab, Gitea, or Gist are also supported via additional API plugins. Additionally, self-hosted git servers are supported.

Your plugin or theme must contain a header in the style.css header or in the plugin's header denoting the location on GitHub. The format is as follows.

GitHub Plugin URI: https://github.com/afragen/git-updater

or

GitHub Theme URI: https://github.com/afragen/test-child

...where the above URI leads to the owner/repository of your theme or plugin. The URI format is https://github.com/<owner>/<repo>. You must not include any extensions like .git.

API Plugins

API plugins for Bitbucket, GitLab, Gitea, and Gist are available. API plugins are available for a one-click install from the Add-Ons tab.

Sponsor

Purchase a license at the Git Updater Store. An unlimited yearly license is very reasonable and allows for authenticated API requests. There is an initial free trial period. After the trial period Git Updater will not be able to make authenticated API requests.

You can sponsor me on GitHub to help with continued development and support.

Headers

The following headers are available for use depending upon your hosting source.

GitHub

  • GitHub Plugin URI
  • GitHub Theme URI
  • GitHub Languages

Go to git-updater.com to download and install the latest version.

Knowledge Base

Comprehensive information regarding Git Updater is available in the Knowledge Base.

Slack

We now have a Slack team for Git Updater. Please click here for an invite. You will be automatically added to the #general and #support channels. Please take a look at other channels too.

Translations

If you are a polyglot I would greatly appreciate translation contributions to GlotPress for Git Updater.

[unreleased]

14.4.0 / 2026-08-27

  • don't use newest_tag as a proxy in use_release_asset() — release assets are always resolved for release_asset repos on the primary branch (or a switch to it); a missing release asset now fails the update with an empty download link instead of falling back to unbuilt branch/tag source (GitHub, Gitea)
  • fix construct_download_link() reading stale tag data — it now reads tags and newest_tag from the repo cache (get_repo_cache()) in place of $this->type values, so non-fetch callers (rollback, branch switch, REST update, branch listings) resolve the correct zipball endpoint and release-asset gate even when the repo object has not been hydrated by a fetch
  • compute the download link on the fly in plugins_api(), themes_api(), and update_site_transient() via construct_download_link() instead of reading the repo object's download_link — the object property could be empty or stale (tag-specific/non-release-asset), while the cache-backed computation always serves the canonical package URL without persisting anything
  • refactor tag-specific release asset logic — tags only get release asset download links when release_asset is true and the tag matches the newest release asset version (stable or dev based on gu_dev_release_asset filter); non-matching tags and all branches get zipball download links; release asset lookups use cached data instead of API calls; release_asset cache column is now a boolean and release_asset_download is set to the newest release asset URL
  • fix dev release asset newest_tag mismatch — when the newest dev release asset key does not match remote_version (e.g., dev asset key is 1.3.0-beta1 but remote_version is 1.3.0, or dev asset key is 28.3-nightly but remote_version is 28.3.20260824), newest_tag is set to remote_version to ensure consumers receive accurate download_link data
  • fix download-link decision in non-fetch callers — use_release_asset() now decides from the explicit target branch/tag instead of the stale $this->type->branch, so branch switches, tag rollbacks, and branch listings get the correct release asset or zipball even when the repo object reflects a previously tracked branch
  • fix tag rollback downloads the latest release asset — construct_download_link() now fetches the release asset for the specific tag being rolled back to instead of always returning the latest release; tag-specific assets are not cached as the primary release_asset_download
  • remove ensure_download_data() — the cache-only hydration bridge is no longer needed: get_remote_repo_meta() sets the correct branch-or-tag download_link on the config, and the consumers (plugins_api(), themes_api(), update_site_transient()) skip waiting repos or only serve repos with a completed fetch, so the fallback's branch/tag logic was dead weight
  • fix non-dev release asset download link preferring branch over tag — construct_download_link() keeps the newest-tag URL when the repo is on its primary branch with tags, and the branch URL only when on a non-primary branch; a resolved release asset (stable or dev) still wins over either
  • fix gu_dev_release_asset one-sided asset maps — construct_download_link() no longer requires both stable and dev asset maps to be populated; a dev-only repo (empty assets) now resolves the dev asset instead of falling through to the zipball, and a stable-only repo still resolves the stable asset
  • fix gu_dev_release_asset download overriding an existing link — construct_download_link() now evaluates the dev release asset even when the repo object already carries a zipball or stable download_link, so the dev asset URL wins when newer instead of the consumer listing the stale zipball; a non-dev or older-dev link is left untouched
  • fix gu_dev_release_asset handling in cache-only consumers — the dev-release-asset filter is honored in construct_download_link() at fetch time (picking the dev asset URL when newer), and newest_tag is set to the dev version when the filter is active; update_site_transient() / plugins_api() / themes_api() serve the persisted values on cache-only requests; also guard against a non-scalar release_asset_download
  • fix stale newest_tag/download_link in update_site_transient(), plugins_api(), and themes_api() for release-asset repos — persist newest_tag as a named cache entry at fetch time and set download_link on the config via construct_download_link(), so cache-only requests serve the persisted values and no longer see the '0.0.0' sentinel or an empty package; themes_api() now also returns download_link
  • fix recurring "Cron unschedule event error for hook: gu_get_remote_plugin/gu_get_remote_theme" — merge_and_reschedule_cron_batch() now skips re-scheduling when a due event for the hook already exists (the wp-cron runner is executing it), so the plugin's wp-cron-init no longer re-adds the event at a future timestamp, which kept repos perpetually pending and raced core's post-run unschedule (the WP core could_not_set false-positive, Trac #57271); the fallback re-checks wp_next_scheduled() before re-scheduling so a concurrent write that succeeded is not duplicated
  • fix intermittent "Cron unschedule event error for hook: gu_get_remote_plugin/gu_get_remote_theme" — merge_and_reschedule_cron_batch() now performs the unschedule + reschedule in a single cron option write instead of wp_unschedule_hook() + wp_schedule_single_event(), so a transient DB write failure or a concurrent request can no longer trigger the core could_not_set error or leave duplicate cron events
  • add filter git_updater_skip_oauth_reminder to skip the OAuth email reminder and change the admin notice on a per-provider basis — when the filter returns true for a provider, the email reminder is skipped and the admin notice shows "OAuth reminder suppressed by filter" instead of the standard "access was revoked, please reconnect" message
  • fix release-asset download links on first run — run sort_tags() in get_remote_api_tag() so newest_tag is set before construct_download_link(), reorder get_remote_repo_meta() to build the download link before populate_api_data() merges cache data, and drop the now-redundant sort_tags() call from populate_api_data(); the first request now resolves the release-asset URL instead of falling back to the zipball
  • fix stale release-asset cache after a remote version change — when the fetched remote version differs from the cached version, maybe_extend_repo_cache() now drops the cached release_assets, release_asset, and release_asset_download entries so the lazy release-asset fetch rebuilds them from the new remote during the same cycle instead of serving the previous version's asset list and download URL
  • fix repeated /releases API calls in a fetch cycle — parse_branch_response() now seeds type->branches before resolving per-branch download links so use_release_asset()/is_tag_target() classify branch targets (not tags) during the loop; without the seeding every branch of a release-asset repo was treated as a tag and each construct_download_link() re-fetched /releases (GitHub, Gitea, GitLab, Bitbucket)
  • fix within-cycle release-asset refetch — get_api_release_assets() and get_api_release_asset() now read the repo cache without TTL gating (freshness is enforced by maybe_extend_repo_cache() dropping the entries on version change), so repeated construct_download_link() calls in one cycle reuse the freshly fetched asset data instead of re-fetching per call
  • extend the version-change release-asset cache invalidation to interrupted prior cycles — the release_assets/release_asset/release_asset_download unset now fires whenever the cached version differs from the freshly fetched one, no longer requiring a complete ran bookkeeping, since the non-gated reads make that unset the only invalidation
  • fix tests for WordPress 7.1's duplicated "Icon collection is already registered" / "Icon is already registered" _doing_it_wrong notices — unhook _wp_register_default_icon_collections (priority 0) and _wp_register_default_icons before the do_action('init') in the Additions settings test, mirroring core's _unhook_font_registration()

14.3.0 / 2026-08-08

  • fix use_release_asset() first-run gating — restore the newest_tag proxy instead of gating on the cached release_assets list, which is only populated after the decision; when no release asset is found the update fails with an empty download link rather than falling back to unbuilt tag source (GitHub and Gitea)
  • update coverage-exclude.json multisite exclusion for OAuth_Connect.php from stale line 343 to the current multisite-only branch at line 362
  • guard all remaining ReflectionMethod::setAccessible()/ReflectionProperty::setAccessible() calls in tests with PHP_VERSION_ID < 80100 to avoid deprecation on PHP 8.5
  • email the site admin when a provider's OAuth token refresh fails and the token is deleted, with a 36-hour reminder cron while the token remains empty; a "token is empty" variant of the reminder email is sent only to premium license holders
  • show the OAuth revocation notice on the settings page whenever the Connect button is displayed (no token stored), not only when the revoked flag is set

14.2.3 / 2026-08-05

  • remove filter gu_dev_release_asset_version
  • for dev release assets use actual remote version number if different from release asset version

14.2.1 / 2026-08-04

  • add filter gu_dev_release_asset_version for devs who do it differently

14.2.0 / 2026-07-29

  • delete a provider's OAuth token automatically when a token refresh returns an empty access_token — the Connect button reappears and a "access was revoked, please reconnect" notice is shown (via a persistent per-provider option flag) so the user knows to re-authorize on the provider site
  • switch OAuth revocation notice from a 15-minute transient to a persistent site option flag (gu_oauth_revoked_{provider}) so the notice survives until the admin reconnects
  • clear the local stale credential in add_auth_header() when a proactive refresh fails and deletes the token, avoiding a wasted 401 round-trip with the now-deleted token

14.1.0 / 2026-07-24

  • add body-based "Bad Credentials" detection to API error handling — when a response (200 or 4xx) contains this message, Git Updater now automatically attempts a token refresh and retries the request, improving recovery from invalid/expired tokens that aren't signaled by 401/403 status codes
  • refactor API::api() method — extracted token refresh retry logic into maybe_refresh_token_and_retry(), should_attempt_token_refresh(), and has_bad_credentials_message() for improved readability and testability
  • add comprehensive tests for new token refresh scenarios including 200/4xx with "Bad Credentials", ensuring correct behavior with and without refresh tokens
  • fix GitHub_API::construct_download_link() clobbering a valid cached release_asset_download with false when no release assets are returned — only cache a resolved asset URL
  • fix REST_API::build_download_metadata() to build auth headers after the final download link is resolved, so release asset and redirect overrides get correct headers
  • add : bool return type declaration to GU_Trait::use_release_asset()
  • fix Repo_List_Table::column_default() to return false for empty release_asset/private_package/uses_lite columns
  • implement two-step download flow for git-updater-lite to resolve cache mismatch between signed URL TTL and 6-hour client cache
  • add REST endpoint for generating fresh 60-second signed URLs for lite updates
  • isolate token URL generation strictly to the update-api route; main plugin continues to receive 12-hour signed URLs
  • add server-centric domain validation for private packages (optional, filterable via git_updater_lite_authorized_domains)
  • new Lite_Domains settings class and UI for managing authorized domains per slug with automatic subdomain matching
  • new "Uses Git Updater Lite" checkbox in Additions settings to manually flag packages for domain configuration
  • auto-detect private packages with Update URI header for domain configuration recommendations
  • client-side interception in git-updater-lite to fetch fresh download tokens via upgrader_pre_download hook
  • add domain header (X-GU-Site-Domain) to download token requests for server-side validation
  • add comprehensive documentation in docs/lite-update-flow.md explaining the new download flow and security features
  • add 100% test coverage for new Lite_Domains class, get_download_token endpoint, and uses_lite UI elements

14.0.2 / 2026-07-22

  • always show API errors in error log
  • flush cache on update to 14.0.2

14.0.0 / 2026-07-21

  • fix Additions/Repo_List_Table security — remove blanket WordPress.Security.ValidatedSanitizedInput suppression; add capability check (manage_options/manage_network_options) and proper nonce verification on the delete path; sanitize bulk slug array so checkbox deletions actually work; fix wp_slashwp_unslash on page/tab reads; remove orphaned unverified _wpnonce_list field
  • fix test isolation: clear the WordPress theme cache in GU_Test_Case::tear_down() so each test re-scans installed themes; otherwise a stale wp_get_themes() cache from a prior test hid the test-gu-theme fixture from Git Updater's get_theme_meta(), causing Test_Theme_Get_Theme_Meta and Test_Rest_Update_Full_Path failures in the full suite (they passed in isolation)
  • add index.php to the test-gu-theme fixture so it is a valid standalone WordPress theme
  • new easter egg: the repo dashicon is now a button that flushes the cache of that specific repository via the flush-repo-cache REST endpoint (no page navigation); the broken dashicon is revealed on a successful flush
  • fix Rest_Update::update_plugin() inverted activation check — activate_plugin() returns null on success and WP_Error on failure; old code if ( ! $activate ) silently swallowed failures; now reports error message from WP_Error
  • fix API::api() missing WP_Error check after OAuth retry — retry response now validated like the initial request
  • fix API::get_release_asset_redirect() AWS cache age calculation to use $this->hours instead of hardcoded -12 hours
  • fix OAuth_Connect::refresh_token() race condition — use site transient lock and result coordination so concurrent requests reuse a successful refresh instead of re-posting the (potentially rotated) refresh token
  • fix switch statements in GU_Upgrade::run(), Rest_Update::get_webhook_source(), and CLI_Integration::process_args() to use switch ( true ) so boolean/isset cases actually match
  • fix Base::set_options_filter() to use get_site_option( 'git_updater', [] ) preventing TypeError on PHP 8+ when option absent
  • fix Messages::get_license() dismissible notice ID mismatch — data-dismissible now matches is_admin_notice_active() check
  • fix Additions/Settings::callback_field() missing echo on esc_attr() for input id attribute
  • fix Theme::get_theme_meta() bitwise & changed to logical && in URI header filter
  • fix Plugin::get_plugin_meta() misplaced parenthesis in empty() call for URI header filter
  • fix GU_Trait::parse_header_uri() to return early for malformed URLs where parse_url() returns false
  • fix Plugin::get_plugin_meta() and Theme::get_theme_meta() — check file_get_contents() return before processing .git/HEAD; compute array_keys( self::$extra_headers ) once before loop; call update_site_option() once after loop instead of per-iteration
  • fix API::api() — store json_decode() result in variable to avoid double decode; use shorter error cache timeout (5 min) for transient HTTP errors (503, 429) vs 60 min for permanent (404, 410)
  • fix GU_Trait::get_class_vars() to cache ReflectionObject and Property objects (not values) reducing reflection overhead
  • fix Basic_Auth_Loader::get_credentials() to cache merged repo configs as static property instead of rebuilding on every API call
  • fix GU_Trait::waiting_for_background_update() to batch-load all ghu-* cache options in single query instead of N+1
  • fix GU_Trait::delete_all_cached_data() to remove redundant bulk DELETE query — delete_site_option() already handles both DB and cache invalidation
  • fix Base::set_defaults() to use update_site_option() instead of add_site_option() which silently fails if option exists; remove dead $this->$type->requires = '' assignment
  • fix Rest_Update::update_plugin() and update_theme() to use direct array key lookup instead of foreach loop
  • fix Bootstrap::remove_cron_events() to include gu_delete_access_tokens in cleanup list
  • fix GU_Trait::merge_and_reschedule_cron_batch() to return early if hook already scheduled
  • fix Remote_Management::reset_api_key() to atomically replace API key instead of delete-then-recreate
  • fix Branch::plugin_branch_switcher() to check cache before triggering full API metadata fetch cycle
  • fix Add_Ons::get_addon_api_results() to cache partial results with selective retry — only missing addons are fetched on cache hit, full results cached 7 days, partial 8 hours
  • fix REST_API::get_remote_repo_data() to return cached update data instead of forcing wp_update_plugins() and wp_update_themes() full update cycle
  • add fallback cache timeout in set_repo_cache_timeout() to prevent infinite re-fetching when API sub-calls fail (partial ran)
  • added support for OAuth tokens
  • add "Remove Token" button to settings — visible for manual API tokens (PATs) only, not OAuth tokens
  • updated for Claude Opus 4.7 security review
  • remove release asset redirect from GitHub_API, no longer used
  • add tests for get_release_asset_redirect() AWS expiration and REST key paths, achieving 100% line coverage on API.php
  • fix pre-existing test failure test_get_api_data_covers_release_asset_download_path by seeding release_assets cache entry
  • update Freemius/wordpress-sdk

13.0.1 / 2026-06-04

  • remove all Authorization headers from REST endpoints, under specific circumstances this could have leaked access tokens. Thanks to Simon Tiplady, Timo Klemm, and Thomas Johannessen for disclosure.
  • Updating private repositories using Git Updater Lite will not work with this version

13.0.0 / 2026-05-31 🎂

  • use afragen/wp-readme-parser drop-in replacement for afragen/wordpress-plugin-readme-parser
  • update requirements to PHP 8.0 for new parser due to testing
  • add maybe_extend_repo_cache() to update the timeout if the remote and cached version numbers are same, should avoid API calls for current data
  • update (get|set)_repo_cache()
  • fix wp-cron and multisite
  • more efficient use of cache
  • decrease data stored with API request response
  • fix Release Asset header to save as boolean
  • add populate_api_data() to populate even when API requests are skipped
  • set error_cache to its own cached state outside the main repo cache
  • fix Add_Ons cache to use dedicated repo key with proper timeout handling
  • fix GitHub_API::get_remote_readme() missing return statement
  • fix GU_Trait::use_release_asset() undefined property PHP 8.x warnings via null coalescing
  • fix Basic_Auth_Loader::get_slug_for_credentials() array slug check order — is_array() must precede sanitize_text_field() so TGMPA array slugs are not silently discarded
  • borrow function from FAIR Connect to sort plugins_api modal tabs in correct order
  • add PHPStan level 6 testing and a whole mess of phpunit tests with load of help from Claude
  • consolidate cron task to eliminate potential duplication of API requests
  • update instructions for CLI installation

12.24.2 / 2026-03-25

  • update freemius/wordpress-sdk
  • fix delete_all_cached_data() for multisite thanks Eileen Mack

12.24.1 / 2026-03-18

  • fix flush-repo-cache REST endpoint, was getting caught in $existing_cache
  • added should_run_on_current_page() and check pages for loading certain parts of plugin
  • update $slug initialization in Base::upgrader_source_selection() as get_repo_slugs() now with type checking
  • fix language pack GitHub download URI
  • remove type hint for $source in Base::upgrader_source_selection() as it can be WP_Error

12.24.0 / 2026-03-11

  • update erusev/parsedown to 1.8
  • remove soft match in get_repo_slugs()
  • add guard to set_readme_info()
  • add function to check timeout validity
  • re-use valid cache timeout
  • refactor getting cache key to get_cache_key()
  • ensure newest tag present in release assets array
  • check to see $existing_cache timeout is valid
  • update Language_API to correctly get credentials
  • add missing API values for packages as Additions

12.23.1 / 2026-02-12

  • add guard to release asset development download link in REST API
  • fix potential race condition when saving cache to multi-server/clustered environments #1133, thanks @Ipstenu

12.23.0 / 2026-02-11

  • guard on ReflectionProptery::setAccessible() deprecated for PHP 8.5 and included in PHP 8.1+
  • case-insensitive matching for alpha|beta|RC
  • make Language_Pack::update_site_transient() a static
  • fix REST API to return correct download link depending upon development channel

12.22.0 / 2026-01-13

  • added gu_dev_release_asset filter for dev release assets
  • added channel query arg for dev release assets when using update-api REST endpoint
  • send a saved access token with update-api REST API if one exists
  • omit non-shared packages from REST API

12.21.0 / 2025-12-31 🎆

  • remove git_updater_plugin_updates and git_updater_theme_updates options, see #1119
  • add gu_plugin_name() to return plugin name, slug or slug-didhash
  • change can_update() check to manage_options for DISALLOW_FILE_MODS constant
  • MIT to GPL-3.0-or-later because of distributed components, etc
  • cast $response elements to object in parse_contents_response()

12.20.2 / 2025-12-08

  • harden REST API data for versions if relesase_assets and tags are empty -- this can happen if too many tags are created that aren't semver format
  • limit REST API to return last 20 versions
  • update REST API conditional logic for setting release asset download link
  • add guard for missing/empty assets in Readme_Parser
  • move some phpcs:disable to package header
  • update to erusev/parsedown": "dev-master#0b274ac959624e6c6d647e9c9b6c2d20da242004" for PHP 8.5 compliance, thanks @thefrosty
  • standardize to composer lint and composer format

12.20.1 / 2025-11-26

  • initialize $created_at variable, possibly fixes PHP Error
  • update actions/checkout
  • update mu-loader.php

12.20.0 / 2025-11-24

  • move tag sort outside of loop
  • use auth key for REST endpoint to flush repository cache for possible abuse
  • added Screenshots section to plugin modal
  • get created_at per release asset
  • update freemius/wordpress-sdk
  • Cache Add-Ons for 7 days

12.19.0 / 2025-09-29

  • setup for Gitea release assets
  • use mcaskill/composer-exclude-files to exclude autoload of freemius/wordpress-sdk/start.php
  • harden parse_meta_response()
  • modify dot org check for package added to mirror like AspireCloud
  • don't overwrite requires and requires_php data from readme.txt if already exists
  • correctly parse for multiple release assets per release
  • update POT GitHub Action
  • refactor add_accept_header()
  • set release_assets and release_asset_download for latest release asset

12.18.1 / 2025-08-06

  • data check on release assets

12.18.0 / 2025-08-04

  • update cache delete and don't use wp_cache_flush
  • always show download link in REST endpoint
  • improved reverse sort for branch/tag versions
  • get all release assets from GitHub API and pick release asset download from release assets array, other APIs get latest release asset only
  • update parse_tag() and sort_tags()
  • update branch switching tags

12.17.3 / 2025-07-31

  • add new Security header with value of email or URI

12.17.2 / 2025-07-26

  • update GU_Freemius for FAIR installation

12.17.1 / 2025-07-20

  • add remote data for did, slug_hash if added via Additions
  • use Bearer for token with GitHub API

12.17.0 / 2025-07-14

  • un-escape stuff, more uses of use
  • add License header info
  • add Update URI header info
  • add get_did_hash() to get hash of DID
  • add get_file_without_did_hash()
  • simplify check for rename_on_activation()
  • update freemius/wordpress-sdk

12.16.1 / 2025-06-12

  • add DID
  • update rollback sort
  • update banner image

12.16.0 / 2025-06-09

  • change callback from new REST_API() to $this
  • collect Author URI from headers.
  • add action hook to Base::get_remote_repo_meta
  • get all versions of release assets, similar to tags/rollbacks
  • add compatibility check for AspireUpdate and FAIR Package Manager

12.15.1 / 2025-05-20

  • update stability of composer requirements

12.15.0 / 2025-05-20

  • update to correct format of readme tags
  • add correctly formated date/time for update-api REST endpoint
  • remove deprecated hooks from v10 and earlier
  • add error checking to parse_contents_response()
  • update Freemius/wordpress-sdk
  • add support for Plugin ID and Theme ID headers for FAIR
  • update composer.json

12.14.0 / 2025-02-26

  • make sure proper release asset headers are added even if access token not set
  • ensure short description is 150 characters or less

12.13.0 / 2025-02-21

  • update caching
  • add versions to REST endpoint for {plugins|themes|update}-api
  • update generate POT workflow

12.12.1 / 2025-02-12

  • revert uninstall back to Freemius

12.12.0 / 2025-02-10

  • save source with Additions
  • update Additions::deduplicate()
  • update Base::upgrader_source_selection() rename to allow for AJAX installation, thanks @costdev
  • add git-updater-collectionsto Add-Ons
  • make list table show all elements
  • add Private Package option for Additions, these private packages are not to be shared with aggregators
  • switch to standard uninstall.php as issue with calling Freemius during their after_uninstall hook
  • add early exit in get_repo_slugs() during AJAX installation for Add-Ons
  • remove soft match in get_repo_slugs()
  • removed Add_Ons::upgrader_source_selection no longer needed
  • save/export tags from readme.txt for REST endpoint

12.11.0 / 2025-02-02

  • update Additions to add additional listings
  • more updates for possibly passing null
  • update REST_API::get_api_data
  • update Theme to add theme_uri to update transient
  • update to pass complete data for multiple uses of gu_additions hook

12.10.1 / 2025-01-30

  • fix issue with release asset
  • add guard to Add-Ons
  • remove git-updater-federation from Add-Ons

12.10.0 / 2025-01-29

  • refactor Add_Ons to use plugins-api REST endpoint and standard plugin card
  • added features by @costdev for AJAXifying
  • added parsing of Update URI and Requires Plugins headers
  • increase requirements to PHP 8+
  • added REST endpoint to export data from Additions
  • added REST endpoint to export Update API data from Additions
  • update Freemius/wordpress-sdk
  • change 'API Add-Ons' to 'Add-Ons'

12.9.0 / 2025-01-07

  • add API get for repo root contents for efficiency
  • add feature to virtually add repos via Additions tab to server REST update-api endpoint
  • switch to getting most data via API calls and not from locally installed files
  • add REST endpoint to individually flush repo cache
  • fix Basic_Auth_Loader::get_slug_for_credentials() to get slug for gist
  • update $release_asset_parts in Basic_Auth_Loader::unset_release_asset_auth() for AWS download link
  • improved release asset handling

12.8.0 / 2024-12-21

  • update GitHub release asset parsing
  • update REST_API for Bitbucket update link
  • update REST_API for update-api route

12.7.2 / 2024-12-18

  • update freemius/wordpress-sdk
  • use mcaskill/composer-exclude-files to exclude autoloading start.php from Freemius, issues arise
  • update REST_API::get_api_data() to always get current release asset redirect as appropriate

12.7.1 / 2024-12-02

  • use get_file_date() to return plugin version
  • fix API::get_dot_org_data() to work with WPE mirror

12.7.0 / 2024-11-30

  • fix missing/incorrect textdomains
  • look for __() functions loading in hooks before init
  • remove load_plugin_textdomain()
  • add git host icon to single site theme description
  • don't save to GitHub.com access token from single repo remote install
  • fix PHP 8.1 creation dynamic variable from class REST_API
  • update REST API response to return plugins_api() or themes_api() style response

12.6.0 / 2024-10-13

  • check existence of FS__RESOLVE_CLONE_AS before setting
  • add filter hook gu_api_domain to set domain for default API updating
  • add filter hook gu_ignore_dot_org to completely ignore updates from dot org. Works as if every plugin/theme is in the gu_override_dot_org hook

12.5.0 / 2024-08-16

  • update class-parser.php
  • update Requires PHP to 7.4 for class-parser.php
  • update Requires WP to 5.9
  • update freemius/wordpress-sdk
  • update printf() in class Branches
  • fix old git-updater-pro and git-updater-additions textdomains
  • update Base::upgrader_source_selection() when trying to update $source and $new_source when destination directories are identical
  • remove unused parameters in certain functions

12.4.0 / 2024-03-04

  • update freemius/wordpress-sdk
  • update class-parser.php
  • use is_wp_version_compatible() and is_php_version_compatible() in GU_Trait::can_update_repo()
  • update gu-loader.php with generic loader
  • update Readme_Parser::trim_length

12.3.1 / 2023-10-19

  • update freemius/wordpress-sdk
  • WPCS 3.0.0 linting
  • popup on icon for "Updates via Git Updater", thanks @BrianHenryIE

12.3.0 / 2023-08-10

  • update Bitbucket Add-on message for consistency
  • ensure Shim available during register_activation_hook()
  • add conditional to get_remote_api_branches() to ensure $response is not a scalar
  • use null coalescing operator
  • update for PHP 8.2

12.2.3 / 2023-06-27

  • composer update
  • get gu_disable_cron hook result once per repository
  • ensure git class is instantiated when checking waiting_for_background_update()
  • add check for $response->error to API::validate_response()
  • update freemius/wordpress-sdk to 2.5.10

12.2.2 /2023-05-22

  • add back Network only activate for multisite, may cause issue where post-license activation Freemius doesn't re-direct to network admin
  • update anonymous functions as static functions for better performance
  • composer update

12.2.1 / 2023-04-21

  • ensure $wp_filesystem set for Bootstrap::rename_on_activation()
  • uninstall tested to function correctly

12.2.0 / 2023-04-20

  • update freemius/wordpress-sdk
  • update afragen/wp-dismiss-notice
  • don't save unused data from API_Common::parse_release_asset()
  • don't use Freemius uninstall, use previous uninstall.php
  • more PHP 8.2 compatibility
  • composer update
  • update REST_API::get_plugins_api_data() to return response without download link using boolean value in download query arg
  • hide Freemius menus with gu_hide_settings filter
  • more specific hiding of Git Updater settings

12.1.3 / 2023-03-20

  • improved setting/default of $options['bypass_background_processing']
  • improved setting/default of $options['branch_switch']
  • display upgrade notice on update-core.php
  • composer update afragen/singleton for PHP 8.2 compat

12.1.2 / 2023-02-08

  • fix for webhook updating issue if $branches not defined, thanks @awunsch

12.1.1 / 2023-02-07

  • remove force of Network activation, messes up Freemius license activation on multisite
  • composer update

12.1.0 / 2023-02-06

  • further limit log of HTTP errors, trying for only once per plugin
  • eliminate Freemius clone resolution popup
  • update Shim:move_dir() for improved error messaging
  • update comparison in Base::upgrader_source_selection of $source and $new_source

12.0.4 / 2023-01-27

  • update to use str_contains()
  • log HTTP errors only hourly
  • update Shim::move_dir() to exit early if source and destination differ only by case or trailing slash

12.0.3 / 2023-01-19

  • update Shim for move_dir() and wp_opcache_invalidate_directory()
  • composer update

12.0.2 / 2023-01-12

  • PHP 8.1 compatibility fix, thanks @chesio
  • other PHP 8.1 fixes
  • declare class API variable $type, avoid future PHP issues, thanks @chesio

12.0.1 / 2023-01-02

  • cleanup parsing of GitHub release assets
  • composer update to fix dependency conflict

12.0.0 / 2022-12-12

  • ensure $wp_filesystem is available
  • re-integrate Git Updater PRO
  • integrate Git Updater Additions
  • add git logo to subtab, hide for now
  • load API tabs of installed/active API plugins
  • set Git Updater to auto-update with new $db_version
  • replace Appsero SDK with Freemius SDK
  • suspend Freemius plugin updating for Git Updater
  • fix uninstall.php for Freemius
Back to top