Compare commits

..

No commits in common. "master" and "v5.1" have entirely different histories.
master ... v5.1

55 changed files with 186 additions and 681 deletions

7
.gitattributes vendored
View File

@ -1,6 +1 @@
/.editorconfig export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/build/ export-ignore
/examples/ export-ignore
/phpcs.xml export-ignore
/build export-ignore

View File

@ -4,7 +4,7 @@ namespace YahnisElsts\PluginUpdateChecker\v5;
if ( !class_exists(PucFactory::class, false) ):
class PucFactory extends \YahnisElsts\PluginUpdateChecker\v5p6\PucFactory {
class PucFactory extends \YahnisElsts\PluginUpdateChecker\v5p1\PucFactory {
}
endif;

View File

@ -1,6 +1,6 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
if ( !class_exists(Autoloader::class, false) ):

View File

@ -1,8 +1,8 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\DebugBar;
namespace YahnisElsts\PluginUpdateChecker\v5p1\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p6\PucFactory;
use YahnisElsts\PluginUpdateChecker\v5p6\UpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p1\PucFactory;
use YahnisElsts\PluginUpdateChecker\v5p1\UpdateChecker;
if ( !class_exists(Extension::class, false) ):

View File

@ -1,7 +1,7 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\DebugBar;
namespace YahnisElsts\PluginUpdateChecker\v5p1\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p6\UpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p1\UpdateChecker;
if ( !class_exists(Panel::class, false) && class_exists('Debug_Bar_Panel', false) ):
@ -41,11 +41,11 @@ if ( !class_exists(Panel::class, false) && class_exists('Debug_Bar_Panel', false
echo '<h3>Configuration</h3>';
echo '<table class="puc-debug-data">';
$this->displayConfigHeader();
$this->row('Slug', esc_html($this->updateChecker->slug));
$this->row('DB option', esc_html($this->updateChecker->optionName));
$this->row('Slug', htmlentities($this->updateChecker->slug));
$this->row('DB option', htmlentities($this->updateChecker->optionName));
$requestInfoButton = $this->getMetadataButton();
$this->row('Metadata URL', esc_html($this->updateChecker->metadataUrl) . ' ' . $requestInfoButton . $this->responseBox);
$this->row('Metadata URL', htmlentities($this->updateChecker->metadataUrl) . ' ' . $requestInfoButton . $this->responseBox);
$scheduler = $this->updateChecker->scheduler;
if ( $scheduler->checkPeriod > 0 ) {
@ -86,22 +86,14 @@ if ( !class_exists(Panel::class, false) && class_exists('Debug_Bar_Panel', false
echo '<h3>Status</h3>';
echo '<table class="puc-debug-data">';
$state = $this->updateChecker->getUpdateState();
$checkButtonId = $this->updateChecker->getUniqueName('check-now-button');
$checkNowButton = '';
if ( function_exists('get_submit_button') ) {
$checkNowButton = get_submit_button(
'Check Now',
'secondary',
'puc-check-now-button',
false,
array('id' => $checkButtonId)
);
} else {
//get_submit_button() is not available in the frontend. Make a button directly.
//It won't look the same without admin styles, but it should still work.
$checkNowButton = sprintf(
'<input type="button" id="%1$s" name="puc-check-now-button" value="%2$s" class="button button-secondary" />',
esc_attr($checkButtonId),
esc_attr('Check Now')
array('id' => $this->updateChecker->getUniqueName('check-now-button'))
);
}
@ -115,10 +107,10 @@ if ( !class_exists(Panel::class, false) && class_exists('Debug_Bar_Panel', false
$this->row('Next automatic check', $this->formatTimeWithDelta($nextCheck));
if ( $state->getCheckedVersion() !== '' ) {
$this->row('Checked version', esc_html($state->getCheckedVersion()));
$this->row('Checked version', htmlentities($state->getCheckedVersion()));
$this->row('Cached update', $state->getUpdate());
}
$this->row('Update checker class', esc_html(get_class($this->updateChecker)));
$this->row('Update checker class', htmlentities(get_class($this->updateChecker)));
echo '</table>';
}
@ -132,7 +124,7 @@ if ( !class_exists(Panel::class, false) && class_exists('Debug_Bar_Panel', false
if ( property_exists($update, $field) ) {
$this->row(
ucwords(str_replace('_', ' ', $field)),
isset($update->$field) ? esc_html($update->$field) : null
isset($update->$field) ? htmlentities($update->$field) : null
);
}
}
@ -170,7 +162,7 @@ if ( !class_exists(Panel::class, false) && class_exists('Debug_Bar_Panel', false
if ( is_object($value) || is_array($value) ) {
//This is specifically for debugging, so print_r() is fine.
//phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r
$value = '<pre>' . esc_html(print_r($value, true)) . '</pre>';
$value = '<pre>' . htmlentities(print_r($value, true)) . '</pre>';
} else if ($value === null) {
$value = '<code>null</code>';
}

View File

@ -1,8 +1,8 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\DebugBar;
namespace YahnisElsts\PluginUpdateChecker\v5p1\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p6\Plugin\UpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p1\Plugin\UpdateChecker;
if ( !class_exists(PluginExtension::class, false) ):

View File

@ -1,7 +1,7 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\DebugBar;
namespace YahnisElsts\PluginUpdateChecker\v5p1\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p6\Plugin\UpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p1\Plugin\UpdateChecker;
if ( !class_exists(PluginPanel::class, false) ):
@ -12,25 +12,19 @@ if ( !class_exists(PluginPanel::class, false) ):
protected $updateChecker;
protected function displayConfigHeader() {
$this->row('Plugin file', esc_html($this->updateChecker->pluginFile));
$this->row('Plugin file', htmlentities($this->updateChecker->pluginFile));
parent::displayConfigHeader();
}
protected function getMetadataButton() {
$buttonId = $this->updateChecker->getUniqueName('request-info-button');
$requestInfoButton = '';
if ( function_exists('get_submit_button') ) {
$requestInfoButton = get_submit_button(
'Request Info',
'secondary',
'puc-request-info-button',
false,
array('id' => $buttonId)
);
} else {
$requestInfoButton = sprintf(
'<input type="button" name="puc-request-info-button" id="%1$s" value="%2$s" class="button button-secondary" />',
esc_attr($buttonId),
esc_attr('Request Info')
array('id' => $this->updateChecker->getUniqueName('request-info-button'))
);
}
return $requestInfoButton;

View File

@ -1,8 +1,8 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\DebugBar;
namespace YahnisElsts\PluginUpdateChecker\v5p1\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p6\Theme\UpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p1\Theme\UpdateChecker;
if ( !class_exists(ThemePanel::class, false) ):
@ -13,7 +13,7 @@ if ( !class_exists(ThemePanel::class, false) ):
protected $updateChecker;
protected function displayConfigHeader() {
$this->row('Theme directory', esc_html($this->updateChecker->directoryName));
$this->row('Theme directory', htmlentities($this->updateChecker->directoryName));
parent::displayConfigHeader();
}

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
if ( !class_exists(InstalledPackage::class, false) ):

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
use LogicException;
use stdClass;
@ -15,12 +15,6 @@ if ( !class_exists(Metadata::class, false) ):
* @access public
*/
abstract class Metadata {
/**
* Additional dynamic properties, usually copied from the API response.
*
* @var array<string,mixed>
*/
protected $extraProperties = array();
/**
* Create an instance of this class from a JSON document.
@ -141,22 +135,6 @@ if ( !class_exists(Metadata::class, false) ):
protected function getPrefixedFilter($tag) {
return 'puc_' . $tag;
}
public function __set($name, $value) {
$this->extraProperties[$name] = $value;
}
public function __get($name) {
return isset($this->extraProperties[$name]) ? $this->extraProperties[$name] : null;
}
public function __isset($name) {
return isset($this->extraProperties[$name]);
}
public function __unset($name) {
unset($this->extraProperties[$name]);
}
}
endif;

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
if ( !class_exists(OAuthSignature::class, false) ):

View File

@ -1,8 +1,8 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Plugin;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p6\InstalledPackage;
use YahnisElsts\PluginUpdateChecker\v5p6\PucFactory;
use YahnisElsts\PluginUpdateChecker\v5p1\InstalledPackage;
use YahnisElsts\PluginUpdateChecker\v5p1\PucFactory;
if ( !class_exists(Package::class, false) ):

View File

@ -1,7 +1,7 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Plugin;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p6\Metadata;
use YahnisElsts\PluginUpdateChecker\v5p1\Metadata;
if ( !class_exists(PluginInfo::class, false) ):
@ -39,7 +39,6 @@ if ( !class_exists(PluginInfo::class, false) ):
public $downloaded;
public $active_installs;
public $last_updated;
public $autoupdate = false;
public $id = 0; //The native WP.org API returns numeric plugin IDs, but they're not used for anything.

View File

@ -1,7 +1,7 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Plugin;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Plugin;
if ( !class_exists(Ui::class, false) ):
if ( !class_exists('Ui', false) ):
/**
* Additional UI elements for plugins.
*/
@ -187,7 +187,7 @@ if ( !class_exists(Ui::class, false) ):
}
}
wp_safe_redirect(add_query_arg(
wp_redirect(add_query_arg(
array(
'puc_update_check_result' => $status,
'puc_slug' => $this->updateChecker->slug,

View File

@ -1,7 +1,7 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Plugin;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p6\Update as BaseUpdate;
use YahnisElsts\PluginUpdateChecker\v5p1\Update as BaseUpdate;
if ( !class_exists(Update::class, false) ):
@ -20,10 +20,9 @@ if ( !class_exists(Update::class, false) ):
public $requires_php = false;
public $icons = array();
public $filename; //Plugin filename relative to the plugins directory.
public $autoupdate = false;
protected static $extraFields = array(
'id', 'homepage', 'tested', 'requires_php', 'upgrade_notice', 'icons', 'filename', 'autoupdate',
'id', 'homepage', 'tested', 'requires_php', 'upgrade_notice', 'icons', 'filename',
);
/**
@ -87,7 +86,6 @@ if ( !class_exists(Update::class, false) ):
$update->tested = $this->tested;
$update->requires_php = $this->requires_php;
$update->plugin = $this->filename;
$update->autoupdate = $this->autoupdate;
if ( !empty($this->upgrade_notice) ) {
$update->upgrade_notice = $this->upgrade_notice;

View File

@ -1,10 +1,10 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Plugin;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p6\InstalledPackage;
use YahnisElsts\PluginUpdateChecker\v5p6\UpdateChecker as BaseUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p6\Scheduler;
use YahnisElsts\PluginUpdateChecker\v5p6\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p1\InstalledPackage;
use YahnisElsts\PluginUpdateChecker\v5p1\UpdateChecker as BaseUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p1\Scheduler;
use YahnisElsts\PluginUpdateChecker\v5p1\DebugBar;
if ( !class_exists(UpdateChecker::class, false) ):
@ -17,7 +17,7 @@ if ( !class_exists(UpdateChecker::class, false) ):
*/
class UpdateChecker extends BaseUpdateChecker {
protected $updateTransient = 'update_plugins';
protected $componentType = 'plugin';
protected $translationType = 'plugin';
public $pluginAbsolutePath = ''; //Full path of the main plugin file.
public $pluginFile = ''; //Plugin filename relative to the plugins directory. Many WP APIs use this to identify plugins.

View File

@ -1,10 +1,10 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
use YahnisElsts\PluginUpdateChecker\v5p6\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p6\Theme;
use YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
use YahnisElsts\PluginUpdateChecker\v5p1\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p1\Theme;
use YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
if ( !class_exists(PucFactory::class, false) ):
@ -86,7 +86,7 @@ if ( !class_exists(PucFactory::class, false) ):
throw new \RuntimeException(sprintf(
'The update checker cannot determine if "%s" is a plugin or a theme. ' .
'This is a bug. Please contact the PUC developer.',
esc_html($fullPath)
htmlentities($fullPath)
));
}
@ -147,7 +147,7 @@ if ( !class_exists(PucFactory::class, false) ):
*
* Normalize a filesystem path. Introduced in WP 3.9.
* Copying here allows use of the class on earlier versions.
* This version adapted from WP 4.8.2 (unchanged since 4.5.6)
* This version adapted from WP 4.8.2 (unchanged since 4.5.1)
*
* @param string $path Path to normalize.
* @return string Normalized path.
@ -239,7 +239,7 @@ if ( !class_exists(PucFactory::class, false) ):
//URI was not found so throw an error.
throw new \RuntimeException(
sprintf('Unable to locate URI in header of "%s"', esc_html($fullPath))
sprintf('Unable to locate URI in header of "%s"', htmlentities($fullPath))
);
}

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
if ( !class_exists(Scheduler::class, false) ):
@ -87,7 +87,6 @@ if ( !class_exists(Scheduler::class, false) ):
add_action($hook, array($this, 'maybeCheckForUpdates'));
}
//This hook fires after a bulk update is complete.
add_action('upgrader_process_complete', array($this, 'removeHooksIfLibraryGone'), 1, 0);
add_action('upgrader_process_complete', array($this, 'upgraderProcessComplete'), 11, 2);
} else {
@ -96,22 +95,6 @@ if ( !class_exists(Scheduler::class, false) ):
}
}
/**
* Remove all hooks if this version of PUC has been deleted or overwritten.
*
* Callback for the "upgrader_process_complete" action.
*/
public function removeHooksIfLibraryGone() {
//Cancel all further actions if the current version of PUC has been deleted or overwritten
//by a different version during the upgrade. If we try to do anything more in that situation,
//we could trigger a fatal error by trying to autoload a deleted class.
clearstatcache();
if ( !file_exists(__FILE__) ) {
$this->removeHooks();
$this->updateChecker->removeHooks();
}
}
/**
* Runs upon the WP action upgrader_process_complete.
*
@ -125,6 +108,16 @@ if ( !class_exists(Scheduler::class, false) ):
/** @noinspection PhpUnusedParameterInspection */
$upgrader, $upgradeInfo
) {
//Cancel all further actions if the current version of PUC has been deleted or overwritten
//by a different version during the upgrade. If we try to do anything more in that situation,
//we could trigger a fatal error by trying to autoload a deleted class.
clearstatcache();
if ( !file_exists(__FILE__) ) {
$this->removeHooks();
$this->updateChecker->removeHooks();
return;
}
//Sanity check and limitation to relevant types.
if (
!is_array($upgradeInfo) || !isset($upgradeInfo['type'], $upgradeInfo['action'])
@ -187,21 +180,6 @@ if ( !class_exists(Scheduler::class, false) ):
$state = $this->updateChecker->getUpdateState();
$shouldCheck = ($state->timeSinceLastCheck() >= $this->getEffectiveCheckPeriod());
if ( $shouldCheck ) {
//Sanity check: Do not proceed if one of the critical classes is missing.
//That can happen - theoretically and extremely rarely - if maybeCheckForUpdates()
//is called before the old version of our plugin has been fully deleted, or
//called from an independent AJAX request during deletion.
if ( !(
class_exists(Utils::class)
&& class_exists(Metadata::class)
&& class_exists(Plugin\Update::class)
&& class_exists(Theme\Update::class)
) ) {
return;
}
}
//Let plugin authors substitute their own algorithm.
$shouldCheck = apply_filters(
$this->updateChecker->getUniqueName('check_now'),
@ -232,7 +210,7 @@ if ( !class_exists(Scheduler::class, false) ):
//Check less frequently if it's already known that an update is available.
$period = $this->throttledCheckPeriod * 3600;
} else if ( defined('DOING_CRON') && constant('DOING_CRON') ) {
//WordPress cron schedules are not exact, so let's do an update check even
//WordPress cron schedules are not exact, so lets do an update check even
//if slightly less than $checkPeriod hours have elapsed since the last check.
$cronFuzziness = 20 * 60;
$period = $this->checkPeriod * 3600 - $cronFuzziness;

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
if ( !class_exists(StateStore::class, false) ):
@ -77,7 +77,7 @@ if ( !class_exists(StateStore::class, false) ):
* @param Update|null $update
* @return $this
*/
public function setUpdate($update = null) {
public function setUpdate(Update $update = null) {
$this->lazyLoad();
$this->update = $update;
return $this;
@ -163,12 +163,7 @@ if ( !class_exists(StateStore::class, false) ):
$state = get_site_option($this->optionName, null);
if (
!is_object($state)
//Sanity check: If the Utils class is missing, the plugin is probably in the process
//of being deleted (e.g. the old version gets deleted during an update).
|| !class_exists(Utils::class)
) {
if ( !is_object($state) ) {
$this->lastCheck = 0;
$this->checkedVersion = '';
$this->update = null;

View File

@ -1,7 +1,7 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Theme;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Theme;
use YahnisElsts\PluginUpdateChecker\v5p6\InstalledPackage;
use YahnisElsts\PluginUpdateChecker\v5p1\InstalledPackage;
if ( !class_exists(Package::class, false) ):

View File

@ -1,8 +1,8 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Theme;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Theme;
use YahnisElsts\PluginUpdateChecker\v5p6\Update as BaseUpdate;
use YahnisElsts\PluginUpdateChecker\v5p1\Update as BaseUpdate;
if ( !class_exists(Update::class, false) ):

View File

@ -1,18 +1,18 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Theme;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Theme;
use YahnisElsts\PluginUpdateChecker\v5p6\UpdateChecker as BaseUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p6\InstalledPackage;
use YahnisElsts\PluginUpdateChecker\v5p6\Scheduler;
use YahnisElsts\PluginUpdateChecker\v5p6\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p1\UpdateChecker as BaseUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p1\InstalledPackage;
use YahnisElsts\PluginUpdateChecker\v5p1\Scheduler;
use YahnisElsts\PluginUpdateChecker\v5p1\DebugBar;
if ( !class_exists(UpdateChecker::class, false) ):
class UpdateChecker extends BaseUpdateChecker {
protected $filterSuffix = 'theme';
protected $updateTransient = 'update_themes';
protected $componentType = 'theme';
protected $translationType = 'theme';
/**
* @var string Theme directory name.

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
use stdClass;

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
use stdClass;
use WP_Error;
@ -9,16 +9,7 @@ if ( !class_exists(UpdateChecker::class, false) ):
abstract class UpdateChecker {
protected $filterSuffix = '';
protected $updateTransient = '';
/**
* @var string This can be "plugin" or "theme".
*/
protected $componentType = '';
/**
* @var string Currently the same as $componentType, but this is an implementation detail that
* depends on how WP works internally, and could therefore change.
*/
protected $translationType = '';
protected $translationType = ''; //This can be "plugin" or "theme".
/**
* Set to TRUE to enable error reporting. Errors are raised using trigger_error()
@ -83,11 +74,6 @@ if ( !class_exists(UpdateChecker::class, false) ):
*/
protected $debugBarExtension = null;
/**
* @var WpCliCheckTrigger|null
*/
protected $wpCliCheckTrigger = null;
public function __construct($metadataUrl, $directoryName, $slug = null, $checkPeriod = 12, $optionName = '') {
$this->debugMode = (bool)(constant('WP_DEBUG'));
$this->metadataUrl = $metadataUrl;
@ -105,10 +91,6 @@ if ( !class_exists(UpdateChecker::class, false) ):
}
}
if ( empty($this->translationType) ) {
$this->translationType = $this->componentType;
}
$this->package = $this->createInstalledPackage();
$this->scheduler = $this->createScheduler($checkPeriod);
$this->upgraderStatus = new UpgraderStatus();
@ -121,10 +103,6 @@ if ( !class_exists(UpdateChecker::class, false) ):
}
$this->installHooks();
if ( ($this->wpCliCheckTrigger === null) && defined('WP_CLI') ) {
$this->wpCliCheckTrigger = new WpCliCheckTrigger($this->componentType, $this->scheduler);
}
}
/**
@ -171,10 +149,6 @@ if ( !class_exists(UpdateChecker::class, false) ):
//Allow HTTP requests to the metadata URL even if it's on a local host.
add_filter('http_request_host_is_external', array($this, 'allowMetadataHost'), 10, 2);
//Potentially exclude information about this entity from core update check requests to api.wordpress.org.
//phpcs:ignore WordPressVIPMinimum.Hooks.RestrictedHooks.http_request_args -- Doesn't modify timeouts.
add_filter('http_request_args', array($this, 'excludeEntityFromWordPressAPI'), 10, 2);
//DebugBar integration.
if ( did_action('plugins_loaded') ) {
$this->maybeInitDebugBar();
@ -196,7 +170,6 @@ if ( !class_exists(UpdateChecker::class, false) ):
remove_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10);
remove_filter('http_request_host_is_external', array($this, 'allowMetadataHost'), 10);
remove_filter('http_request_args', array($this, 'excludeEntityFromWordPressAPI'));
remove_action('plugins_loaded', array($this, 'maybeInitDebugBar'));
remove_action('init', array($this, 'loadTextDomain'));
@ -271,76 +244,6 @@ if ( !class_exists(UpdateChecker::class, false) ):
*/
abstract protected function createScheduler($checkPeriod);
/**
* Remove information about this plugin or theme from the requests that WordPress core sends
* to api.wordpress.org when checking for updates.
*
* @param array $args
* @param string $url
* @return array
*/
public function excludeEntityFromWordPressAPI($args, $url) {
//Is this an api.wordpress.org update check request?
$parsedUrl = wp_parse_url($url);
if ( !isset($parsedUrl['host']) || (strtolower($parsedUrl['host']) !== 'api.wordpress.org') ) {
return $args;
}
$typePluralised = $this->componentType . 's';
$expectedPathPrefix = '/' . $typePluralised . '/update-check/1.'; //e.g. "/plugins/update-check/1.1/"
if ( !isset($parsedUrl['path']) || !Utils::startsWith($parsedUrl['path'], $expectedPathPrefix) ) {
return $args;
}
//Plugins and themes can disable this feature by using the filter below.
if ( !apply_filters(
$this->getUniqueName('remove_from_default_update_checks'),
true, $this, $args, $url
) ) {
return $args;
}
if ( empty($args['body'][$typePluralised]) ) {
return $args;
}
$reportingItems = json_decode($args['body'][$typePluralised], true);
if ( $reportingItems === null ) {
return $args;
}
//The list of installed items uses different key formats for plugins and themes.
//Luckily, we can reuse the getUpdateListKey() method here.
$updateListKey = $this->getUpdateListKey();
if ( isset($reportingItems[$typePluralised][$updateListKey]) ) {
unset($reportingItems[$typePluralised][$updateListKey]);
}
if ( !empty($reportingItems['active']) ) {
if ( is_array($reportingItems['active']) ) {
foreach ($reportingItems['active'] as $index => $relativePath) {
if ( $relativePath === $updateListKey ) {
unset($reportingItems['active'][$index]);
}
}
//Re-index the array.
$reportingItems['active'] = array_values($reportingItems['active']);
} else if ( $reportingItems['active'] === $updateListKey ) {
//For themes, the "active" field is a string that contains the theme's directory name.
//Pretend that the default theme is active so that we don't reveal the actual theme.
if ( defined('WP_DEFAULT_THEME') ) {
$reportingItems['active'] = WP_DEFAULT_THEME;
}
//Unfortunately, it doesn't seem to be documented if we can safely remove the "active"
//key. So when we don't know the default theme, we'll just leave it as is.
}
}
$args['body'][$typePluralised] = wp_json_encode($reportingItems);
return $args;
}
/**
* Check for updates. The results are stored in the DB option specified in $optionName.
*
@ -459,7 +362,7 @@ if ( !class_exists(UpdateChecker::class, false) ):
*
* @param Metadata|null $update
*/
protected function fixSupportedWordpressVersion($update = null) {
protected function fixSupportedWordpressVersion(Metadata $update = null) {
if ( !isset($update->tested) || !preg_match('/^\d++\.\d++$/', $update->tested) ) {
return;
}
@ -773,7 +676,7 @@ if ( !class_exists(UpdateChecker::class, false) ):
$result = wp_remote_get($url, $options);
$result = apply_filters($this->getUniqueName('request_metadata_http_result'), $result, $url, $options);
//Try to parse the response
$status = $this->validateApiResponse($result);
$metadata = null;
@ -999,62 +902,25 @@ if ( !class_exists(UpdateChecker::class, false) ):
return $source;
}
//Fix the remote source structure if necessary.
//The update archive should contain a single directory that contains the rest of plugin/theme files.
//Otherwise, WordPress will try to copy the entire working directory ($source == $remoteSource).
//We can't rename $remoteSource because that would break WordPress code that cleans up temporary files
//after update.
if ( $this->isBadDirectoryStructure($remoteSource) ) {
//Create a new directory using the plugin slug.
$newDirectory = trailingslashit($remoteSource) . $this->slug . '/';
if ( !$wp_filesystem->is_dir($newDirectory) ) {
$wp_filesystem->mkdir($newDirectory);
//Move all files to the newly created directory.
$sourceFiles = $wp_filesystem->dirlist($remoteSource);
if ( is_array($sourceFiles) ) {
$sourceFiles = array_keys($sourceFiles);
$allMoved = true;
foreach ($sourceFiles as $filename) {
//Skip our newly created folder.
if ( $filename === $this->slug ) {
continue;
}
$previousSource = trailingslashit($remoteSource) . $filename;
$newSource = trailingslashit($newDirectory) . $filename;
if ( !$wp_filesystem->move($previousSource, $newSource, true) ) {
$allMoved = false;
break;
}
}
if ( $allMoved ) {
//Rename source.
$source = $newDirectory;
} else {
//Delete our newly created folder including all files in it.
$wp_filesystem->rmdir($newDirectory, true);
//And return a relevant error.
return new WP_Error(
'puc-incorrect-directory-structure',
sprintf(
'The directory structure of the update was incorrect. All files should be inside ' .
'a directory named <span class="code">%s</span>, not at the root of the ZIP archive. Plugin Update Checker tried to fix the directory structure, but failed.',
esc_html($this->slug)
)
);
}
}
}
}
//Rename the source to match the existing directory.
$correctedSource = trailingslashit($remoteSource) . $this->directoryName . '/';
if ( $source !== $correctedSource ) {
//The update archive should contain a single directory that contains the rest of plugin/theme files.
//Otherwise, WordPress will try to copy the entire working directory ($source == $remoteSource).
//We can't rename $remoteSource because that would break WordPress code that cleans up temporary files
//after update.
if ( $this->isBadDirectoryStructure($remoteSource) ) {
return new WP_Error(
'puc-incorrect-directory-structure',
sprintf(
'The directory structure of the update is incorrect. All files should be inside ' .
'a directory named <span class="code">%s</span>, not at the root of the ZIP archive.',
htmlentities($this->slug)
)
);
}
/** @var \WP_Upgrader_Skin $upgrader ->skin */
$upgrader->skin->feedback(sprintf(
'Renaming %s to %s&#8230;',
'<span class="code">' . basename($source) . '</span>',
@ -1114,11 +980,7 @@ if ( !class_exists(UpdateChecker::class, false) ):
* Initialize the update checker Debug Bar plugin/add-on thingy.
*/
public function maybeInitDebugBar() {
if (
class_exists('Debug_Bar', false)
&& class_exists('Debug_Bar_Panel', false)
&& file_exists(dirname(__FILE__) . '/DebugBar')
) {
if ( class_exists('Debug_Bar', false) && file_exists(dirname(__FILE__) . '/DebugBar') ) {
$this->debugBarExtension = $this->createDebugBarExtension();
}
}

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
if ( !class_exists(UpgraderStatus::class, false) ):

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
if ( !class_exists(Utils::class, false) ):

View File

@ -1,6 +1,6 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
use Parsedown;
use PucReadmeParser;

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
if ( !interface_exists(BaseChecker::class, false) ):

View File

@ -1,9 +1,9 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
use YahnisElsts\PluginUpdateChecker\v5p6\OAuthSignature;
use YahnisElsts\PluginUpdateChecker\v5p6\Utils;
use YahnisElsts\PluginUpdateChecker\v5p1\OAuthSignature;
use YahnisElsts\PluginUpdateChecker\v5p1\Utils;
if ( !class_exists(BitBucketApi::class, false) ):

View File

@ -1,6 +1,6 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
use Parsedown;

View File

@ -1,6 +1,6 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
if ( !class_exists(GitLabApi::class, false) ):

View File

@ -1,8 +1,8 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
use YahnisElsts\PluginUpdateChecker\v5p6\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p1\Plugin;
if ( !class_exists(PluginUpdateChecker::class, false) ):
@ -85,21 +85,6 @@ if ( !class_exists(PluginUpdateChecker::class, false) ):
$this->setInfoFromHeader($remoteHeader, $info);
}
//Sanity check: Reject updates that don't have a version number.
//This can happen when we're using a branch, and we either fail to retrieve the main plugin
//file or the file doesn't have a "Version" header.
if ( empty($info->version) ) {
do_action(
'puc_api_error',
new \WP_Error(
'puc-no-plugin-version',
'Could not find the version number in the repository.'
),
null, null, $this->slug
);
return null;
}
//Try parsing readme.txt. If it's formatted according to WordPress.org standards, it will contain
//a lot of useful information like the required/tested WP version, changelog, and so on.
if ( $this->readmeTxtExistsLocally() ) {

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
if ( !class_exists(Reference::class, false) ):

View File

@ -1,6 +1,6 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
if ( !trait_exists(ReleaseAssetSupport::class, false) ) :

View File

@ -1,6 +1,6 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
if ( !trait_exists(ReleaseFilteringFeature::class, false) ) :

View File

@ -1,9 +1,9 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
use YahnisElsts\PluginUpdateChecker\v5p6\Theme;
use YahnisElsts\PluginUpdateChecker\v5p6\Utils;
use YahnisElsts\PluginUpdateChecker\v5p1\Theme;
use YahnisElsts\PluginUpdateChecker\v5p1\Utils;
if ( !class_exists(ThemeUpdateChecker::class, false) ):

View File

@ -1,6 +1,6 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p1\Vcs;
if ( !trait_exists(VcsCheckerMethods::class, false) ) :

View File

@ -1,84 +0,0 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
use WP_CLI;
/**
* Triggers an update check when relevant WP-CLI commands are executed.
*
* When WP-CLI runs certain commands like "wp plugin status" or "wp theme list", it calls
* wp_update_plugins() and wp_update_themes() to refresh update information. This class hooks into
* the same commands and triggers an update check when they are executed.
*
* Note that wp_update_plugins() and wp_update_themes() do not perform an update check *every* time
* they are called. They use a context-dependent delay between update checks. Similarly, this class
* calls Scheduler::maybeCheckForUpdates(), which also dynamically decides whether to actually
* run a check. If you want to force an update check, call UpdateChecker::checkForUpdates() instead.
*/
class WpCliCheckTrigger {
/**
* @var Scheduler
*/
private $scheduler;
/**
* @var string 'plugin' or 'theme'
*/
private $componentType;
/**
* @var bool Whether an update check was already triggered during the current request
* or script execution.
*/
private $wasCheckTriggered = false;
public function __construct($componentType, Scheduler $scheduler) {
if ( !in_array($componentType, ['plugin', 'theme']) ) {
throw new \InvalidArgumentException('Invalid component type. Must be "plugin" or "theme".');
}
$this->componentType = $componentType;
$this->scheduler = $scheduler;
if ( !defined('WP_CLI') || !class_exists(WP_CLI::class, false) ) {
return; //Nothing to do if WP-CLI is not available.
}
/*
* We can't hook directly into wp_update_plugins(), but we can hook into the WP-CLI
* commands that call it. We'll use the "before_invoke:xyz" hook to trigger update checks.
*/
foreach ($this->getRelevantCommands() as $command) {
WP_CLI::add_hook('before_invoke:' . $command, [$this, 'triggerUpdateCheckOnce']);
}
}
private function getRelevantCommands() {
$result = [];
foreach (['status', 'list', 'update'] as $subcommand) {
$result[] = $this->componentType . ' ' . $subcommand;
}
return $result;
}
/**
* Trigger a potential update check once.
*
* @param mixed $input
* @return mixed The input value, unchanged.
* @internal This method is public so that it can be used as a WP-CLI hook callback.
* It should not be called directly.
*
*/
public function triggerUpdateCheckOnce($input = null) {
if ( $this->wasCheckTriggered ) {
return $input;
}
$this->wasCheckTriggered = true;
$this->scheduler->maybeCheckForUpdates();
return $input;
}
}

View File

@ -29,7 +29,7 @@ From the users' perspective, it works just like with plugins and themes hosted o
Getting Started
---------------
*Note:* In each of the below examples, part of the instructions is to create an instance of the update checker class. It's recommended to do this either during the `plugins_loaded` action or outside of any hooks. If you do it only during an `admin_*` action, then updates will not be visible to a wide variety of WordPress management tools; they will only be visible to logged-in users on dashboard pages.
*Note:* In each of the below examples, part of the instructions are to create an instance of the update checker class. It's recommended to do this either during the `plugins_loaded` action or outside of any hooks. If you do it only during an `admin_*` action, then updates will not be visible to a wide variety of WordPress maanagement tools; they will only be visible to logged-in users on dashboard pages.
### Self-hosted Plugins and Themes
@ -252,8 +252,8 @@ BitBucket doesn't have an equivalent to GitHub's releases, so the process is sli
Alternatively, if you're using a self-hosted GitLab instance, initialize the update checker like this:
```php
use YahnisElsts\PluginUpdateChecker\v5p6\Vcs\PluginUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p6\Vcs\GitLabApi;
use YahnisElsts\PluginUpdateChecker\v5p1\Vcs\PluginUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p1\Vcs\GitLabApi;
$myUpdateChecker = new PluginUpdateChecker(
new GitLabApi('https://myserver.com/user-name/repo-name/'),
@ -264,8 +264,8 @@ BitBucket doesn't have an equivalent to GitHub's releases, so the process is sli
```
If you're using a self-hosted GitLab instance and [subgroups or nested groups](https://docs.gitlab.com/ce/user/group/subgroups/index.html), you have to tell the update checker which parts of the URL are subgroups:
```php
use YahnisElsts\PluginUpdateChecker\v5p6\Vcs\PluginUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p6\Vcs\GitLabApi;
use YahnisElsts\PluginUpdateChecker\v5p1\Vcs\PluginUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p1\Vcs\GitLabApi;
$myUpdateChecker = new PluginUpdateChecker(
new GitLabApi(
@ -347,14 +347,14 @@ Other classes have also been renamed, usually by simply removing the `Puc_vXpY_`
| Old class name | New class name |
|-------------------------------------|----------------------------------------------------------------|
| `Puc_v4_Factory` | `YahnisElsts\PluginUpdateChecker\v5\PucFactory` |
| `Puc_v4p13_Factory` | `YahnisElsts\PluginUpdateChecker\v5p6\PucFactory` |
| `Puc_v4p13_Plugin_UpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p6\Plugin\UpdateChecker` |
| `Puc_v4p13_Theme_UpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p6\Theme\UpdateChecker` |
| `Puc_v4p13_Vcs_PluginUpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p6\Vcs\PluginUpdateChecker` |
| `Puc_v4p13_Vcs_ThemeUpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p6\Vcs\ThemeUpdateChecker` |
| `Puc_v4p13_Vcs_GitHubApi` | `YahnisElsts\PluginUpdateChecker\v5p6\Vcs\GitHubApi` |
| `Puc_v4p13_Vcs_GitLabApi` | `YahnisElsts\PluginUpdateChecker\v5p6\Vcs\GitLabApi` |
| `Puc_v4p13_Vcs_BitBucketApi` | `YahnisElsts\PluginUpdateChecker\v5p6\Vcs\BitBucketApi` |
| `Puc_v4p13_Factory` | `YahnisElsts\PluginUpdateChecker\v5p1\PucFactory` |
| `Puc_v4p13_Plugin_UpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p1\Plugin\UpdateChecker` |
| `Puc_v4p13_Theme_UpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p1\Theme\UpdateChecker` |
| `Puc_v4p13_Vcs_PluginUpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p1\Vcs\PluginUpdateChecker` |
| `Puc_v4p13_Vcs_ThemeUpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p1\Vcs\ThemeUpdateChecker` |
| `Puc_v4p13_Vcs_GitHubApi` | `YahnisElsts\PluginUpdateChecker\v5p1\Vcs\GitHubApi` |
| `Puc_v4p13_Vcs_GitLabApi` | `YahnisElsts\PluginUpdateChecker\v5p1\Vcs\GitLabApi` |
| `Puc_v4p13_Vcs_BitBucketApi` | `YahnisElsts\PluginUpdateChecker\v5p1\Vcs\BitBucketApi` |
License Management
------------------

View File

@ -18,6 +18,6 @@
"ext-json": "*"
},
"autoload": {
"files": ["load-v5p6.php"]
"files": ["load-v5p1.php"]
}
}

View File

@ -1,52 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: plugin-update-checker\n"
"POT-Creation-Date: 2022-07-29 15:34+0300\n"
"PO-Revision-Date: 2024-05-09 22:22+0000\n"
"Last-Translator: theogk\n"
"Language-Team: Ελληνικά\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Loco https://localise.biz/\n"
"X-Poedit-Basepath: ..\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n"
"X-Poedit-SearchPath-0: .\n"
"Report-Msgid-Bugs-To: \n"
"X-Loco-Version: 2.6.9; wp-6.5.3"
#: Puc/v5p4/Plugin/Ui.php:128
msgid "Check for updates"
msgstr "Έλεγχος για ενημερώσεις"
#: Puc/v5p4/Plugin/Ui.php:214
#, php-format
msgctxt "the plugin title"
msgid "The %s plugin is up to date."
msgstr "Το πρόσθετο %s είναι ενημερωμένο."
#: Puc/v5p4/Plugin/Ui.php:216
#, php-format
msgctxt "the plugin title"
msgid "A new version of the %s plugin is available."
msgstr "Μία νέα έκδοση είναι διαθέσιμη για το πρόσθετο %s."
#: Puc/v5p4/Plugin/Ui.php:218
#, php-format
msgctxt "the plugin title"
msgid "Could not determine if updates are available for %s."
msgstr ""
"Δεν ήταν εφικτό να εκτελεστεί ο έλεγχος για νέες ενημερώσεις για το πρόσθετο "
"%s."
#: Puc/v5p4/Plugin/Ui.php:224
#, php-format
msgid "Unknown update checker status \"%s\""
msgstr "Άγνωστο πρόβλημα του ενημερωτή προσθέτων \"%s\""
#: Puc/v5p4/Vcs/PluginUpdateChecker.php:100
msgid "There is no changelog available."
msgstr "Δεν υπάρχει διαθέσιμο αρχείο αλλαγών."

View File

@ -1,50 +1,38 @@
msgid ""
msgstr ""
"Project-Id-Version: plugin-update-checker\n"
"POT-Creation-Date: 2025-06-12 23:40+0100\n"
"PO-Revision-Date: 2025-06-12 23:49+0100\n"
"Last-Translator: Pro Style <info@prostyle.ir>\n"
"Language-Team: Alex Javadi <alex@aljm.org>\n"
"POT-Creation-Date: 2016-02-17 14:21+0100\n"
"PO-Revision-Date: 2016-10-28 14:30+0330\n"
"Last-Translator: studio RVOLA <hello@rvola.com>\n"
"Language-Team: Pro Style <info@prostyle.ir>\n"
"Language: fa_IR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 3.6\n"
"X-Generator: Poedit 1.8.8\n"
"X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e\n"
"X-Poedit-SearchPath-0: .\n"
#: Puc/v5p6/Plugin/Ui.php:56
msgid "View details"
msgstr "مشاهده جزئیات"
#: github-checker.php:120
msgid "There is no changelog available."
msgstr "شرحی برای تغییرات یافت نشد"
#: Puc/v5p6/Plugin/Ui.php:79
#, php-format
msgid "More information about %s"
msgstr "اطلاعات بیشتر درباره %s"
# It had some “potential” grammar issues and also didnt sound native.
# P.S. I know the current translation is literally “Checking for new updates”, however, I thought it might sound more natural and known to others.
#: Puc/v5p6/Plugin/Ui.php:130
#: plugin-update-checker.php:637
msgid "Check for updates"
msgstr "بررسی بروزرسانی جدید"
msgstr "بررسی برای بروزرسانی "
# The word “ناشناخته” is seems to be translated directly from the word (Un-known), rather than checking for the context.
# I think “نامشخص” (unknown) might be a suitable version in this scenario.
#: Puc/v5p6/Plugin/Ui.php:227
#: plugin-update-checker.php:681
msgid "This plugin is up to date."
msgstr "شما از آخرین نسخه استفاده میکنید . به‌روز باشید"
#: plugin-update-checker.php:683
msgid "A new version of this plugin is available."
msgstr "نسخه جدیدی برای افزونه ارائه شده است ."
#: plugin-update-checker.php:685
#, php-format
msgid "Unknown update checker status \"%s\""
msgstr "وضعیت نامشخص برای بروزرسانی \"%s\""
# The previous translation was okay, however, it didnt sound native to me.
#: Puc/v5p6/Vcs/PluginUpdateChecker.php:113
msgid "There is no changelog available."
msgstr "آخرین تغییراتی یافت نشد."
#~ msgid "This plugin is up to date."
#~ msgstr "شما از آخرین نسخه استفاده میکنید . به‌روز باشید"
#~ msgid "A new version of this plugin is available."
#~ msgstr "نسخه جدیدی برای افزونه ارائه شده است ."
msgstr "وضعیت ناشناخته برای بروزرسانی \"%s\""

View File

@ -1,57 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: plugin-update-checker\n"
"POT-Creation-Date: 2024-12-09 11:45+0100\n"
"PO-Revision-Date: 2024-12-09 12:20+0100\n"
"Last-Translator: Aleksandar Urošević <urke.kg@gmail.com>\n"
"Language-Team: \n"
"Language: sr_RS\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-Basepath: ..\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n"
"X-Poedit-SearchPath-0: .\n"
#: Puc/v5p5/Plugin/Ui.php:56
msgid "View details"
msgstr "Види детаље"
#: Puc/v5p5/Plugin/Ui.php:79
#, php-format
msgid "More information about %s"
msgstr "Више информација о %s"
#: Puc/v5p5/Plugin/Ui.php:130
msgid "Check for updates"
msgstr "Провера ажурирања"
#: Puc/v5p5/Plugin/Ui.php:217
#, php-format
msgctxt "the plugin title"
msgid "The %s plugin is up to date."
msgstr "Додатак %s је у најновијем издању."
#: Puc/v5p5/Plugin/Ui.php:219
#, php-format
msgctxt "the plugin title"
msgid "A new version of the %s plugin is available."
msgstr "Доступно је ново издање за %s."
#: Puc/v5p5/Plugin/Ui.php:221
#, php-format
msgctxt "the plugin title"
msgid "Could not determine if updates are available for %s."
msgstr "Није могуће утврдити да ли су доступне исправке за %s."
#: Puc/v5p5/Plugin/Ui.php:227
#, php-format
msgid "Unknown update checker status \"%s\""
msgstr "Непознат статус провере ажурирања \"%s\""
#: Puc/v5p5/Vcs/PluginUpdateChecker.php:113
msgid "There is no changelog available."
msgstr "Белешке о изменама нису доступне."

View File

@ -1,57 +1,57 @@
msgid ""
msgstr ""
"Project-Id-Version: plugin-update-checker\n"
"POT-Creation-Date: 2025-11-21 10:40+0800\n"
"PO-Revision-Date: 2025-11-21 10:40+0800\n"
"POT-Creation-Date: 2022-01-29 12:09+0800\n"
"PO-Revision-Date: 2022-01-29 12:10+0800\n"
"Last-Translator: Seaton Jiang <hi@seatonjiang.com>\n"
"Language-Team: \n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.8\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n"
"X-Poedit-SearchPath-0: .\n"
#: Puc/v5p6/Plugin/Ui.php:56
#: Puc/v4p11/Plugin/Ui.php:54
msgid "View details"
msgstr "查看详情"
#: Puc/v5p6/Plugin/Ui.php:79
#: Puc/v4p11/Plugin/Ui.php:77
#, php-format
msgid "More information about %s"
msgstr "%s 的更多信息"
#: Puc/v5p6/Plugin/Ui.php:130
#: Puc/v4p11/Plugin/Ui.php:128
msgid "Check for updates"
msgstr "检查更新"
#: Puc/v5p6/Plugin/Ui.php:217
#: Puc/v4p11/Plugin/Ui.php:214
#, php-format
msgctxt "the plugin title"
msgid "The %s plugin is up to date."
msgstr "%s 目前是最新版本。"
#: Puc/v5p6/Plugin/Ui.php:219
#: Puc/v4p11/Plugin/Ui.php:216
#, php-format
msgctxt "the plugin title"
msgid "A new version of the %s plugin is available."
msgstr "%s 当前有可用的更新。"
#: Puc/v5p6/Plugin/Ui.php:221
#: Puc/v4p11/Plugin/Ui.php:218
#, php-format
msgctxt "the plugin title"
msgid "Could not determine if updates are available for %s."
msgstr "%s 无法确定是否有可用的更新。"
#: Puc/v5p6/Plugin/Ui.php:227
#: Puc/v4p11/Plugin/Ui.php:224
#, php-format
msgid "Unknown update checker status \"%s\""
msgstr "未知的更新检查状态:%s"
#: Puc/v5p6/Vcs/PluginUpdateChecker.php:113
#: Puc/v4p11/Vcs/PluginUpdateChecker.php:100
msgid "There is no changelog available."
msgstr "没有可用的更新日志。"

View File

@ -1,66 +0,0 @@
# Blank Plugin POT Template
# Copyright 2025 ...
# This file is distributed under the GNU General Public License v3 or later.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Plugin Update Checker\n"
"Report-Msgid-Bugs-To: Alex Lion <learnwithalex@gmail.com>\n"
"POT-Creation-Date: 2025-09-19 14:05-0700\n"
"PO-Revision-Date: \n"
"Last-Translator: Alex Lion <learnwithalex@gmail.com>\n"
"Language-Team: Alex Lion <learnwithalex@gmail.com>\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Poedit-WPHeader: plugin-update-checker.php\n"
"X-Textdomain-Support: yesX-Generator: Poedit 1.6.4\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: "
"__;_e;esc_html_e;esc_html_x:1,2c;esc_html__;esc_attr_e;esc_attr_x:1,2c;esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2;_n_noop:1,2;__ngettext:1,2;__ngettext_noop:1,2;_c,_nc:4c,1,2\n"
"X-Poedit-Basepath: ..\n"
"X-Poedit-Bookmarks: \n"
"X-Generator: Poedit 3.7\n"
"X-Poedit-SearchPath-0: .\n"
#: Puc/v5p6/Plugin/Ui.php:56
msgid "View details"
msgstr "檢視詳細資料"
#: Puc/v5p6/Plugin/Ui.php:79
#, php-format
msgid "More information about %s"
msgstr "進一步了解 %s 的相關資訊"
#: Puc/v5p6/Plugin/Ui.php:130
msgid "Check for updates"
msgstr "檢查更新"
#: Puc/v5p6/Plugin/Ui.php:217
#, php-format
msgctxt "the plugin title"
msgid "The %s plugin is up to date."
msgstr "%s 外掛已為最新版本。"
#: Puc/v5p6/Plugin/Ui.php:219
#, php-format
msgctxt "the plugin title"
msgid "A new version of the %s plugin is available."
msgstr "%s 外掛已有新版本可供更新。"
#: Puc/v5p6/Plugin/Ui.php:221
#, php-format
msgctxt "the plugin title"
msgid "Could not determine if updates are available for %s."
msgstr "無法確定 %s 是否有可用的更新。"
#: Puc/v5p6/Plugin/Ui.php:227
#, php-format
msgid "Unknown update checker status \"%s\""
msgstr "未知的更新檢查程式狀態: %s"
#: Puc/v5p6/Vcs/PluginUpdateChecker.php:113
msgid "There is no changelog available."
msgstr "目前沒有可供檢閱的變更記錄。"

View File

@ -2,7 +2,7 @@
msgid ""
msgstr ""
"Project-Id-Version: plugin-update-checker\n"
"POT-Creation-Date: 2025-05-20 15:27+0300\n"
"POT-Creation-Date: 2022-07-29 15:34+0300\n"
"PO-Revision-Date: 2016-01-10 20:59+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -11,39 +11,39 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.6\n"
"X-Generator: Poedit 3.1.1\n"
"X-Poedit-Basepath: ..\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n"
"X-Poedit-SearchPath-0: .\n"
#: Puc/v5p6/Plugin/Ui.php:130
#: Puc/v5p1/Plugin/Ui.php:128
msgid "Check for updates"
msgstr ""
#: Puc/v5p6/Plugin/Ui.php:217
#: Puc/v5p1/Plugin/Ui.php:214
#, php-format
msgctxt "the plugin title"
msgid "The %s plugin is up to date."
msgstr ""
#: Puc/v5p6/Plugin/Ui.php:219
#: Puc/v5p1/Plugin/Ui.php:216
#, php-format
msgctxt "the plugin title"
msgid "A new version of the %s plugin is available."
msgstr ""
#: Puc/v5p6/Plugin/Ui.php:221
#: Puc/v5p1/Plugin/Ui.php:218
#, php-format
msgctxt "the plugin title"
msgid "Could not determine if updates are available for %s."
msgstr ""
#: Puc/v5p6/Plugin/Ui.php:227
#: Puc/v5p1/Plugin/Ui.php:224
#, php-format
msgid "Unknown update checker status \"%s\""
msgstr ""
#: Puc/v5p6/Vcs/PluginUpdateChecker.php:113
#: Puc/v5p1/Vcs/PluginUpdateChecker.php:100
msgid "There is no changelog available."
msgstr ""

View File

@ -1,4 +1,4 @@
Copyright (c) 2023 Jānis Elsts
Copyright (c) 2017 Jānis Elsts
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

View File

@ -1,14 +1,14 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p1;
use YahnisElsts\PluginUpdateChecker\v5\PucFactory as MajorFactory;
use YahnisElsts\PluginUpdateChecker\v5p6\PucFactory as MinorFactory;
use YahnisElsts\PluginUpdateChecker\v5p1\PucFactory as MinorFactory;
require __DIR__ . '/Puc/v5p6/Autoloader.php';
require __DIR__ . '/Puc/v5p1/Autoloader.php';
new Autoloader();
require __DIR__ . '/Puc/v5p6/PucFactory.php';
require __DIR__ . '/Puc/v5p1/PucFactory.php';
require __DIR__ . '/Puc/v5/PucFactory.php';
//Register classes defined in this version with the factory.
@ -26,9 +26,9 @@ foreach (
)
as $pucGeneralClass => $pucVersionedClass
) {
MajorFactory::addVersion($pucGeneralClass, $pucVersionedClass, '5.6');
MajorFactory::addVersion($pucGeneralClass, $pucVersionedClass, '5.1');
//Also add it to the minor-version factory in case the major-version factory
//was already defined by another, older version of the update checker.
MinorFactory::addVersion($pucGeneralClass, $pucVersionedClass, '5.6');
MinorFactory::addVersion($pucGeneralClass, $pucVersionedClass, '5.1');
}

View File

@ -1,10 +1,10 @@
<?php
/**
* Plugin Update Checker Library 5.6
* Plugin Update Checker Library 5.1
* http://w-shadow.com/
*
* Copyright 2025 Janis Elsts
* Copyright 2022 Janis Elsts
* Released under the MIT license. See license.txt for details.
*/
require dirname(__FILE__) . '/load-v5p6.php';
require dirname(__FILE__) . '/load-v5p1.php';

View File

@ -648,7 +648,7 @@ class Parsedown
#
# Setext
protected function blockSetextHeader($Line, $Block = null)
protected function blockSetextHeader($Line, array $Block = null)
{
if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted']))
{
@ -786,7 +786,7 @@ class Parsedown
#
# Table
protected function blockTable($Line, $Block = null)
protected function blockTable($Line, array $Block = null)
{
if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted']))
{