Compare commits

..

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

54 changed files with 185 additions and 658 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\v5p2\PucFactory {
}
endif;

View File

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

View File

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

View File

@ -1,7 +1,7 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\DebugBar;
namespace YahnisElsts\PluginUpdateChecker\v5p2\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p6\UpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p6\Plugin\UpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p2\Plugin\UpdateChecker;
if ( !class_exists(PluginExtension::class, false) ):

View File

@ -1,7 +1,7 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\DebugBar;
namespace YahnisElsts\PluginUpdateChecker\v5p2\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p6\Plugin\UpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2\DebugBar;
use YahnisElsts\PluginUpdateChecker\v5p6\Theme\UpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2;
if ( !class_exists(InstalledPackage::class, false) ):

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Plugin;
namespace YahnisElsts\PluginUpdateChecker\v5p2\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p6\Metadata;
use YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2\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\v5p2\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p6\Update as BaseUpdate;
use YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2\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\v5p2\InstalledPackage;
use YahnisElsts\PluginUpdateChecker\v5p2\UpdateChecker as BaseUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p2\Scheduler;
use YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2;
use YahnisElsts\PluginUpdateChecker\v5p6\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p6\Theme;
use YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
use YahnisElsts\PluginUpdateChecker\v5p2\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p2\Theme;
use YahnisElsts\PluginUpdateChecker\v5p2\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.2)
*
* @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\v5p2;
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\v5p2;
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\v5p2\Theme;
use YahnisElsts\PluginUpdateChecker\v5p6\InstalledPackage;
use YahnisElsts\PluginUpdateChecker\v5p2\InstalledPackage;
if ( !class_exists(Package::class, false) ):

View File

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

View File

@ -1,18 +1,18 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Theme;
namespace YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2\UpdateChecker as BaseUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p2\InstalledPackage;
use YahnisElsts\PluginUpdateChecker\v5p2\Scheduler;
use YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2;
use stdClass;

View File

@ -1,5 +1,5 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p2;
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\v5p2;
if ( !class_exists(UpgraderStatus::class, false) ):

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,8 +1,8 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs;
use YahnisElsts\PluginUpdateChecker\v5p6\Plugin;
use YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2\Vcs;
if ( !class_exists(Reference::class, false) ):

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6\Vcs;
namespace YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2\Vcs\PluginUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2\Vcs\PluginUpdateChecker;
use YahnisElsts\PluginUpdateChecker\v5p2\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\v5p2\PucFactory` |
| `Puc_v4p13_Plugin_UpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p2\Plugin\UpdateChecker` |
| `Puc_v4p13_Theme_UpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p2\Theme\UpdateChecker` |
| `Puc_v4p13_Vcs_PluginUpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p2\Vcs\PluginUpdateChecker` |
| `Puc_v4p13_Vcs_ThemeUpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p2\Vcs\ThemeUpdateChecker` |
| `Puc_v4p13_Vcs_GitHubApi` | `YahnisElsts\PluginUpdateChecker\v5p2\Vcs\GitHubApi` |
| `Puc_v4p13_Vcs_GitLabApi` | `YahnisElsts\PluginUpdateChecker\v5p2\Vcs\GitLabApi` |
| `Puc_v4p13_Vcs_BitBucketApi` | `YahnisElsts\PluginUpdateChecker\v5p2\Vcs\BitBucketApi` |
License Management
------------------

View File

@ -18,6 +18,6 @@
"ext-json": "*"
},
"autoload": {
"files": ["load-v5p6.php"]
"files": ["load-v5p2.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/v5p2/Plugin/Ui.php:128
msgid "Check for updates"
msgstr ""
#: Puc/v5p6/Plugin/Ui.php:217
#: Puc/v5p2/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/v5p2/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/v5p2/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/v5p2/Plugin/Ui.php:224
#, php-format
msgid "Unknown update checker status \"%s\""
msgstr ""
#: Puc/v5p6/Vcs/PluginUpdateChecker.php:113
#: Puc/v5p2/Vcs/PluginUpdateChecker.php:100
msgid "There is no changelog available."
msgstr ""

View File

@ -1,14 +1,14 @@
<?php
namespace YahnisElsts\PluginUpdateChecker\v5p6;
namespace YahnisElsts\PluginUpdateChecker\v5p2;
use YahnisElsts\PluginUpdateChecker\v5\PucFactory as MajorFactory;
use YahnisElsts\PluginUpdateChecker\v5p6\PucFactory as MinorFactory;
use YahnisElsts\PluginUpdateChecker\v5p2\PucFactory as MinorFactory;
require __DIR__ . '/Puc/v5p6/Autoloader.php';
require __DIR__ . '/Puc/v5p2/Autoloader.php';
new Autoloader();
require __DIR__ . '/Puc/v5p6/PucFactory.php';
require __DIR__ . '/Puc/v5p2/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.2');
//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.2');
}

View File

@ -1,10 +1,10 @@
<?php
/**
* Plugin Update Checker Library 5.6
* Plugin Update Checker Library 5.2
* 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-v5p2.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']))
{