Commit Graph

66 Commits

Author SHA1 Message Date
Yahnis Elsts dbe109557b Add a Composer manifest 2014-09-10 18:41:18 +03:00
Yahnis Elsts c43301056e Minor: Fix typo. 2014-05-17 11:29:33 +03:00
Yahnis Elsts 102a7b2e05 Added limited support for mu-plugins.
You can explicitly specify the MU-plugin basename (relative to "/wp-content/mu-plugins") as the last argument to PucFactory:buildUpdateChecker(). If you do, the "Check for updates" link and update notifications will show up in "Plugins -> Installed -> Must-Use". However, automatic update installation still won't  work because WordPress does not support it for mu-plugins.
2014-03-10 20:49:35 +02:00
Yahnis Elsts 8f1b7006ba Merge pull request #17 from YahnisElsts/pull_15
Pull 15
2014-02-15 13:37:19 +02:00
Yahnis Elsts b40ad4eb0b Replace isset() with property_exists() 2014-02-14 17:12:43 +02:00
David Anderson ebdf86863a Prevent PHP warnings
Edit with both changes, and braces, as requested.

Apologies for my limited understanding of Git + Github.
2014-02-14 09:54:09 +00:00
Yahnis Elsts 88ddc53b3b Minor: Update file header with the current year and the correct version number. 2014-02-05 14:40:30 -08:00
Yahnis Elsts 6d0a1ef2e5 Merge pull request #11 from DavidAnderson684/patch-1
Allow the consumer to receive customised information from the server.
2014-02-04 03:39:45 -08:00
David Anderson c873f4c53d Add a filter to allow the consumer to receive customised information from the server
I have a need to receive extra information back from the server. In particular, I want to receive information that says "updates entitlement soon expires" or "updates entitlement already expired".

Currently, the functions in the class PluginUpdate_1_3 strip out anything not in the private $fields.

This change adds a filter to allow the consumer to retain any extra fields they wish.
2014-01-14 19:28:32 +00:00
Yahnis Elsts 6d4372feaf Add a "puc_check_now-$slug" filter that lets plugin authors to override the automatic check behaviour. 2013-12-03 02:23:48 -08:00
Yahnis Elsts 89da7ab52d Enforce update frequency settings ($checkPeriod) even when triggered by a cron event.
The WordPress cron implementation does not guarantee that a cron hook will only be run once, or run exactly on schedule. For example, it's possible for an event to be triggered two or three times in quick succession due to race conditions. If we check for updates each time our hook is run, we could end up sending redundant update requests that waste bandwidth and server resources.

Instead, make sure at least $checkPeriod hours have elapsed since the last check before checking again. Allow for a small fuzz-factor (currently 20 minutes) to account for the inherent inaccuracy of WP cron.
2013-12-03 01:40:44 -08:00
Yahnis Elsts d921ed91e8 Added an option to check updates less frequently if there's an update already available.
This feature is disabled by default. Turn it on by setting `$checker->throttleRedundantChecks` to `true` and use `$checker->throttledCheckPeriod` to set the alternate check period (default = every 72 hours).
2013-11-29 04:13:32 -08:00
Yahnis Elsts 3adbcdeee9 Slightly improved performance by reading the current version number directly from the plugin file instead of asking WordPress to fetch all installed plugins. The version number is cached for the current page load.
Caution: There might be some issues in how/when the cache is cleared. It looks fine in theory, but I may have missed something (bulk upgrades? Multisite side-effects?).

Also removed two unused parameters from addCheckForUpdatesLink(). We can always add them back later if needed.

Version bump: 1.3.2
2013-10-29 03:16:02 -07:00
Yahnis Elsts c3a8325c2d Check for updates once per minute when the user visits Dashboard -> Updates.
This was suggested in #8 as a way to make the custom update checker more consistent with how WP handles plugin updates. Arguably, visiting "Dashboard -> Updates" means that the user wants to check for updates, so it's okay to ignore the configured check interval in this case.

You can still disable automatic checks by setting $checkPeriod to 0, which will also disable this additional check.
2013-09-27 04:24:14 -07:00
Yahnis Elsts 2edd17e0a5 Fix a conflict with WordPress' "quick edit" feature.
Explanation:
WordPress includes a "quick edit" function that lets users edit certain post properties (title, categories, etc) from the "All Posts" list. WP calculates the width (colspan attribute) of the inline editor based on the number of <th>'s in the header of the first .widefat table on the page. When PUC and Debug Bar are both active, that first table happens to be the debug info table in our Debug Bar panel. This table does not have a <thead>. As a result, WordPress sets the colspan to zero, making the inline editor unusable.

Fixed by removing the "widefat" class from our debug info tables and adding a bunch of new CSS to emulate WordPress table style.
2013-09-27 03:08:51 -07:00
Yahnis Elsts 9f7c8f74ba Fix: Display the Debug Bar panel even if the update checker is loaded during or after the "plugins_loaded" action.
Bumped version to 1.3.1.
2013-07-18 02:34:54 -07:00
Yahnis Elsts f757517434 Use default cron schedules when possible.
This makes the library more resilient and less likely to break due to cron-related bugs in other plugins. See this commit for an analysis of one such bug: YahnisElsts/plugin-update-checker@5aee0d7b8b
2013-06-26 06:07:48 -07:00
Yahnis Elsts 5aee0d7b8b Add a workaround for a bug in BackupBuddy that would cause this library to run a new update check every few seconds. This affects BackupBuddy 3.2.0.2 and possibly multiple other versions.
Analysis:
- PluginUpdateChecker creates a custom cron schedule by using the cron_schedules filter. This schedule is used to run periodic update checks.
- BackupBuddy also creates a number of custom schedules using the same filter. However, its filter callback throws away any schedules defined by other filters/plugins and re-initializes $schedules with an empty array().
- As a result, if the filter that was added by BackupBuddy runs *after* the filter added by PluginUpdateChecker, our custom schedule is destroyed.
- When WordPress tries to re-schedule our event after a successful Cron run, it discovers that the required schedule no longer exists, and fails. On the next page load, the library detects that the event is not scheduled and schedules it again. Hence infinite loop.
- Fixed by moving our cron_schedules filter to a later priority.

Notes:
This is the *second* time I have to add a workaround for some arrogant oversight perpetrated by BackupBuddy developers. (The first one was the "plugins_api" thing, IIRC).
2013-02-22 09:40:15 -08:00
Yahnis Elsts 1fa27700a8 Fix: Make the "Check for updates" link work properly in Multisite.
Essentially, the library just switches to using /wp-admin/network/plugins.php instead of /wp-admin/plugins.php as necessary. Also, the "all_admin_notices" action runs in both normal and Network admin, so it's a better choice for displaying the update check result than either "admin_notices" or "network_admin_notices".
2013-01-07 03:04:16 -08:00
Yahnis Elsts e2ddd78cce Prevent the update checker from throwing a warning if the update state is not an object, yet is non-empty.
Technically it shouldn't be possible for this to happen, but at least one user has reported that it does.
2012-11-21 11:16:05 -08:00
Yahnis Elsts 93601c897d Fix the update check status message showing up twice when two plugins are using the library.
Pass the plugin slug in a separate "puc_slug" query parameter when doing a manual update check. This way displayManualCheckResult() can verify that the current "puc_update_check_result" value applies to the right plugin.
2012-11-08 02:33:29 -08:00
Yahnis Elsts 0132961c42 Add a readme for GitHub. This is just a stub; people who want to use the library should read the relevant blog post. 2012-11-06 00:42:20 -08:00
Yahnis Elsts bbd128d0e1 Add a factory class that should be used when creating instances of PluginUpdateChecker.
If several active plugins include the update checker library we might end up with a bunch of different versions being loaded. In the previous implementation, whichever version was loaded first would take precedence. This is obviously a problem if an old version gets loaded and one of the plugins relies on features that are only available in the latest version. 
   
The best way to fix this would be to delay library loading until all plugins have been loaded, then only load the latest available version. Unfortunately this approach would not be backwards-compatible  with previous versions that just load the library right away. Another good way to fix the problem would be to put the entire library in a versioned namespace. Alas, namespaces are only available in PHP 5.3 and WordPress only requires PHP 5.2.
 
 So what I've done is to put the version number in the class name and create a factory that will keep track of available versions and let you instantiate the latest one. Note that internal classes like PluginUpdate and PluginInfo still refer to specific implementations for internal consistency and backwards-compatibility.
2012-11-04 12:40:44 +00:00
Yahnis Elsts a0c1dfa732 Add the update checker class name to the Debug Bar output. Useful when trying to figure out which library version was loaded. 2012-11-04 11:46:55 +00:00
Yahnis Elsts 0c5f9863f0 Ensure the internal WP update structure is initialized before trying to modify it. For example, it can be `false` if WordPress has just cleared its update cache. 2012-10-31 14:57:14 +00:00
Yahnis Elsts a793bb1906 * get_submit_button() is only available in the WP admin, so make sure it exists before trying to output a button.
* HOUR_IN_SECONDS is only defined in WP 3.5+. Use the literal value instead.
2012-10-31 14:34:24 +00:00
Yahnis Elsts dd309a7310 Rename debug-bar-support.php to debug-bar-plugin.php 2012-10-29 09:13:23 +00:00
Yahnis Elsts 4a24752fce Encode special HTML characters when dumping plugin or update info to the debug bar. 2012-10-27 12:39:30 +00:00
Yahnis Elsts ae084bd3be Actually, lets prefix our custom Debug Bar IDs with "puc" to be completely sure we'll avoid name collisions. 2012-10-27 12:30:35 +00:00
Yahnis Elsts 5a3c214836 Fix duplicate IDs in the Debug Bar.
When multiple instances of the update checker are active at the same time, each will have its own PluginUpdateCheckerPanel instance and its own entry in the Debug Bar. However, since all instances have the same class name, and Debug Bar uses this name to generate link and wrapper IDs, we will end up with duplicate IDs and a semi-broken debug bar. 
 
 I've added a bit of JS that will find update checker panels and replace the relevant IDs with new ones based on the plugin slug, not class.
2012-10-27 12:26:24 +00:00
Yahnis Elsts 8260c0e712 Add explicit access modifiers to methods that didn't have them. 2012-10-27 11:48:25 +00:00
Yahnis Elsts c42810ab70 Add a Debug Bar panel that displays all kinds of debugging information about each update checker instance. You can also trigger an update check and request info/metadata through the panel. 2012-10-26 18:15:09 +00:00
Yahnis Elsts 9f1e52f6d4 This shall be the upcoming version 1.2 2012-10-26 07:42:36 +00:00
Yahnis Elsts d715f0d1d6 Minor: whitespace 2012-10-26 07:40:29 +00:00
Yahnis Elsts fa4896e7ea Automatically enable debug mode if WP_DEBUG is on. 2012-10-26 07:34:18 +00:00
Yahnis Elsts 912bac1d4b * Update copyright year and version number where necessary.
* Add "public" to functions that didn't have an explicit access modifier.
2012-10-26 07:32:09 +00:00
Yahnis Elsts 76019713e8 If there's no external update to display, remove any cached update info WordPress might have about the plugin.
This is a significant change from previous behaviour where the library would leave the value of the "update_transients" unmodified if there were no updates available. That worked fine at the time because WP wouldn't re-save the injected update to the DB. So when no updates were available, old cached updates wouldn't show up either. However, this appears to have changed - in some cases, the injected update sticks around even if the plugin is no longer injecting it. This patch counters that.

Drawback: If you use this library in a plugin that's hosted on wordpress.org, it will overwrite any update data from wordpress.org with its own and effectively disable wordpress.org updates for your plugin (doesn't affect other plugins).
2012-10-23 16:35:35 +00:00
Yahnis Elsts 850a0f18be Ensure the update (if there is one) shows up right away when the user clicks "Check for updates". Prior to this change they would need to reload the page to see the update.
Cause: Originally the update check routine was attached to the admin_notices hook. However, the plugin list is populated long before that action. 

Fixed by running the update check earlier in the request process and redirecting back to plugins.php to display the success message. As a side-effect, this will also prevent unwanted extra checks when the user reloads the page.
2012-10-20 16:54:32 +00:00
Yahnis Elsts 80a644e329 Store update state in a site option, instead of a normal, per-site field. WordPress itself stores updates in a site transient, and there's really no point in maintaining separate update states for each site in a network. 2012-10-20 15:19:47 +00:00
Yahnis Elsts aceb9e62a5 Add a resetUpdateState() method for clearing update cache, last check timestamp and last checked version. 2012-10-20 14:24:04 +00:00
Yahnis Elsts 9a9c6c2b53 Minor: Stop IDE complaining about "unknown method toStdClass()" because it doesn't realize that $state->update is a PluginUpdate. 2012-10-20 11:54:40 +00:00
Yahnis Elsts c8f04ce4d7 "callback" => "callable" (new PHP 5.3 convention) 2012-10-20 11:52:30 +00:00
Yahnis Elsts ea25c4366a * Add a "Check for updates" link to the plugin row.
* checkForUpdates() now returns the update or null.
* Added a new getUpdate() method. Use it to retrieve update details (if there is an update available). It uses the internal cache, so use checkForUpdates() instead if you want the most recent info. Also, if no update is available, or if its older than the installed version, it will return null.
* Changed our plugins_api filter priority to 20 to fix a compatibility problem caused by a bug in the WooThemes plugin updater. In short, the WooThemes updater also has a plugins_api filter, and their implementation will throw away the response returned by other filters.
2012-10-20 11:32:19 +00:00
Yahnis Elsts 242622214d Make it possible to filter update/plugin info just before it's passed to WordPress.
Also adds another convenience method for registering filter callbacks.
2012-10-19 18:10:46 +00:00
Yahnis Elsts c085ce28e8 Check if an update actually exists before converting to StdClass (what if $state was null?). 2012-10-19 17:01:16 +00:00
Yahnis Elsts 6206797e75 Add a lot more error logging - for debugging purposes. Enable by setting $debugMode to TRUE. 2012-07-19 07:47:31 +00:00
Yahnis Elsts 655b93a3bb Fail silently if we can't find the plugin in /wp-content/plugins/ or can't read its header. Note that this will also fail if the plugin is installed in mu-plugins.
This could be improved.
2012-07-11 12:12:51 +00:00
Yahnis Elsts b440d1662a * Fix stupid copy & paste errors. 2012-05-29 09:41:10 +00:00
Yahnis Elsts fa9172b477 Can't use $this in a static method, you fool. 2012-05-27 12:14:24 +00:00
Yahnis Elsts 14fcf30366 Hopefully prevent problems with caching plugins 2012-05-25 14:28:23 +00:00