diff --git a/Puc/v4p4/Plugin/Ui.php b/Puc/v4p4/Plugin/Ui.php
new file mode 100644
index 0000000..02e7ac0
--- /dev/null
+++ b/Puc/v4p4/Plugin/Ui.php
@@ -0,0 +1,263 @@
+updateChecker = $updateChecker;
+ $this->manualCheckErrorTransient = $this->updateChecker->getUniqueName('manual_check_errors');
+
+ add_filter('plugin_row_meta', array($this, 'addViewDetailsLink'), 10, 3);
+ add_filter('plugin_row_meta', array($this, 'addCheckForUpdatesLink'), 10, 2);
+ add_action('admin_init', array($this, 'handleManualCheck'));
+ add_action('all_admin_notices', array($this, 'displayManualCheckResult'));
+ }
+
+ /**
+ * Add a "View Details" link to the plugin row in the "Plugins" page. By default,
+ * the new link will appear before the "Visit plugin site" link (if present).
+ *
+ * You can change the link text by using the "puc_view_details_link-$slug" filter.
+ * Returning an empty string from the filter will disable the link.
+ *
+ * You can change the position of the link using the
+ * "puc_view_details_link_position-$slug" filter.
+ * Returning 'before' or 'after' will place the link immediately before/after
+ * the "Visit plugin site" link.
+ * Returning 'append' places the link after any existing links at the time of the hook.
+ * Returning 'replace' replaces the "Visit plugin site" link.
+ * Returning anything else disables the link when there is a "Visit plugin site" link.
+ *
+ * If there is no "Visit plugin site" link 'append' is always used!
+ *
+ * @param array $pluginMeta Array of meta links.
+ * @param string $pluginFile
+ * @param array $pluginData Array of plugin header data.
+ * @return array
+ */
+ public function addViewDetailsLink($pluginMeta, $pluginFile, $pluginData = array()) {
+ if ( $this->isMyPluginFile($pluginFile) && $this->updateChecker->userCanInstallUpdates() && !isset($pluginData['slug']) ) {
+ $linkText = apply_filters($this->updateChecker->getUniqueName('view_details_link'), __('View details'));
+ if ( !empty($linkText) ) {
+ $viewDetailsLinkPosition = 'append';
+
+ //Find the "Visit plugin site" link (if present).
+ $visitPluginSiteLinkIndex = count($pluginMeta) - 1;
+ if ( $pluginData['PluginURI'] ) {
+ $escapedPluginUri = esc_url($pluginData['PluginURI']);
+ foreach ($pluginMeta as $linkIndex => $existingLink) {
+ if ( strpos($existingLink, $escapedPluginUri) !== false ) {
+ $visitPluginSiteLinkIndex = $linkIndex;
+ $viewDetailsLinkPosition = apply_filters(
+ $this->updateChecker->getUniqueName('view_details_link_position'),
+ 'before'
+ );
+ break;
+ }
+ }
+ }
+
+ $viewDetailsLink = sprintf('%s',
+ esc_url(network_admin_url('plugin-install.php?tab=plugin-information&plugin=' . urlencode($this->updateChecker->slug) .
+ '&TB_iframe=true&width=600&height=550')),
+ esc_attr(sprintf(__('More information about %s'), $pluginData['Name'])),
+ esc_attr($pluginData['Name']),
+ $linkText
+ );
+ switch ($viewDetailsLinkPosition) {
+ case 'before':
+ array_splice($pluginMeta, $visitPluginSiteLinkIndex, 0, $viewDetailsLink);
+ break;
+ case 'after':
+ array_splice($pluginMeta, $visitPluginSiteLinkIndex + 1, 0, $viewDetailsLink);
+ break;
+ case 'replace':
+ $pluginMeta[$visitPluginSiteLinkIndex] = $viewDetailsLink;
+ break;
+ case 'append':
+ default:
+ $pluginMeta[] = $viewDetailsLink;
+ break;
+ }
+ }
+ }
+ return $pluginMeta;
+ }
+
+ /**
+ * Add a "Check for updates" link to the plugin row in the "Plugins" page. By default,
+ * the new link will appear after the "Visit plugin site" link if present, otherwise
+ * after the "View plugin details" link.
+ *
+ * You can change the link text by using the "puc_manual_check_link-$slug" filter.
+ * Returning an empty string from the filter will disable the link.
+ *
+ * @param array $pluginMeta Array of meta links.
+ * @param string $pluginFile
+ * @return array
+ */
+ public function addCheckForUpdatesLink($pluginMeta, $pluginFile) {
+ if ( $this->isMyPluginFile($pluginFile) && $this->updateChecker->userCanInstallUpdates() ) {
+ $linkUrl = wp_nonce_url(
+ add_query_arg(
+ array(
+ 'puc_check_for_updates' => 1,
+ 'puc_slug' => $this->updateChecker->slug,
+ ),
+ self_admin_url('plugins.php')
+ ),
+ 'puc_check_for_updates'
+ );
+
+ $linkText = apply_filters(
+ $this->updateChecker->getUniqueName('manual_check_link'),
+ __('Check for updates', 'plugin-update-checker')
+ );
+ if ( !empty($linkText) ) {
+ /** @noinspection HtmlUnknownTarget */
+ $pluginMeta[] = sprintf('%s', esc_attr($linkUrl), $linkText);
+ }
+ }
+ return $pluginMeta;
+ }
+
+ protected function isMyPluginFile($pluginFile) {
+ return ($pluginFile == $this->updateChecker->pluginFile)
+ || (!empty($this->updateChecker->muPluginFile) && ($pluginFile == $this->updateChecker->muPluginFile));
+ }
+
+ /**
+ * Check for updates when the user clicks the "Check for updates" link.
+ *
+ * @see self::addCheckForUpdatesLink()
+ *
+ * @return void
+ */
+ public function handleManualCheck() {
+ $shouldCheck =
+ isset($_GET['puc_check_for_updates'], $_GET['puc_slug'])
+ && $_GET['puc_slug'] == $this->updateChecker->slug
+ && $this->updateChecker->userCanInstallUpdates()
+ && check_admin_referer('puc_check_for_updates');
+
+ if ( $shouldCheck ) {
+ $update = $this->updateChecker->checkForUpdates();
+ $status = ($update === null) ? 'no_update' : 'update_available';
+
+ if ( ($update === null) && !empty($this->lastRequestApiErrors) ) {
+ //Some errors are not critical. For example, if PUC tries to retrieve the readme.txt
+ //file from GitHub and gets a 404, that's an API error, but it doesn't prevent updates
+ //from working. Maybe the plugin simply doesn't have a readme.
+ //Let's only show important errors.
+ $foundCriticalErrors = false;
+ $questionableErrorCodes = array(
+ 'puc-github-http-error',
+ 'puc-gitlab-http-error',
+ 'puc-bitbucket-http-error',
+ );
+
+ foreach ($this->lastRequestApiErrors as $item) {
+ $wpError = $item['error'];
+ /** @var WP_Error $wpError */
+ if ( !in_array($wpError->get_error_code(), $questionableErrorCodes) ) {
+ $foundCriticalErrors = true;
+ break;
+ }
+ }
+
+ if ( $foundCriticalErrors ) {
+ $status = 'error';
+ set_site_transient($this->manualCheckErrorTransient, $this->lastRequestApiErrors, 60);
+ }
+ }
+
+ wp_redirect(add_query_arg(
+ array(
+ 'puc_update_check_result' => $status,
+ 'puc_slug' => $this->updateChecker->slug,
+ ),
+ self_admin_url('plugins.php')
+ ));
+ }
+ }
+
+ /**
+ * Display the results of a manual update check.
+ *
+ * @see self::handleManualCheck()
+ *
+ * You can change the result message by using the "puc_manual_check_message-$slug" filter.
+ */
+ public function displayManualCheckResult() {
+ if ( isset($_GET['puc_update_check_result'], $_GET['puc_slug']) && ($_GET['puc_slug'] == $this->updateChecker->slug) ) {
+ $status = strval($_GET['puc_update_check_result']);
+ $title = $this->updateChecker->getPluginTitle();
+ $noticeClass = 'updated notice-success';
+ $details = '';
+
+ if ( $status == 'no_update' ) {
+ $message = sprintf(_x('The %s plugin is up to date.', 'the plugin title', 'plugin-update-checker'), $title);
+ } else if ( $status == 'update_available' ) {
+ $message = sprintf(_x('A new version of the %s plugin is available.', 'the plugin title', 'plugin-update-checker'), $title);
+ } else if ( $status === 'error' ) {
+ $message = sprintf(_x('Could not determine if updates are available for %s.', 'the plugin title', 'plugin-update-checker'), $title);
+ $noticeClass = 'error notice-error';
+
+ $details = $this->formatManualCheckErrors(get_site_transient($this->manualCheckErrorTransient));
+ delete_site_transient($this->manualCheckErrorTransient);
+ } else {
+ $message = sprintf(__('Unknown update checker status "%s"', 'plugin-update-checker'), htmlentities($status));
+ $noticeClass = 'error notice-error';
+ }
+ printf(
+ '
',
+ $noticeClass,
+ apply_filters($this->updateChecker->getUniqueName('manual_check_message'), $message, $status),
+ $details
+ );
+ }
+ }
+
+ /**
+ * Format the list of errors that were thrown during an update check.
+ *
+ * @param array $errors
+ * @return string
+ */
+ protected function formatManualCheckErrors($errors) {
+ if ( empty($errors) ) {
+ return '';
+ }
+ $output = '';
+
+ $showAsList = count($errors) > 1;
+ if ( $showAsList ) {
+ $output .= '';
+ $formatString = '- %1$s
%2$s ';
+ } else {
+ $formatString = '%1$s %2$s
';
+ }
+ foreach ($errors as $item) {
+ $wpError = $item['error'];
+ /** @var WP_Error $wpError */
+ $output .= sprintf(
+ $formatString,
+ $wpError->get_error_message(),
+ $wpError->get_error_code()
+ );
+ }
+ if ( $showAsList ) {
+ $output .= '
';
+ }
+
+ return $output;
+ }
+ }
+endif;
\ No newline at end of file
diff --git a/Puc/v4p4/Plugin/UpdateChecker.php b/Puc/v4p4/Plugin/UpdateChecker.php
index 2d99437..6eabdd0 100644
--- a/Puc/v4p4/Plugin/UpdateChecker.php
+++ b/Puc/v4p4/Plugin/UpdateChecker.php
@@ -17,7 +17,7 @@ if ( !class_exists('Puc_v4p4_Plugin_UpdateChecker', false) ):
public $muPluginFile = ''; //For MU plugins, the plugin filename relative to the mu-plugins directory.
private $cachedInstalledVersion = null;
- private $manualCheckErrorTransient = '';
+ private $extraUi = null;
/**
* Class constructor.
@@ -62,9 +62,9 @@ if ( !class_exists('Puc_v4p4_Plugin_UpdateChecker', false) ):
//Details: https://github.com/YahnisElsts/plugin-update-checker/issues/138#issuecomment-335590964
add_action('uninstall_' . $this->pluginFile, array($this, 'removeHooks'));
- $this->manualCheckErrorTransient = $this->getUniqueName('manual_check_errors');
-
parent::__construct($metadataUrl, dirname($this->pluginFile), $slug, $checkPeriod, $optionName);
+
+ $this->extraUi = new Puc_v4p4_Plugin_Ui($this);
}
/**
@@ -89,11 +89,6 @@ if ( !class_exists('Puc_v4p4_Plugin_UpdateChecker', false) ):
//Override requests for plugin information
add_filter('plugins_api', array($this, 'injectInfo'), 20, 3);
- add_filter('plugin_row_meta', array($this, 'addViewDetailsLink'), 10, 3);
- add_filter('plugin_row_meta', array($this, 'addCheckForUpdatesLink'), 10, 2);
- add_action('admin_init', array($this, 'handleManualCheck'));
- add_action('all_admin_notices', array($this, 'displayManualCheckResult'));
-
//Clear the version number cache when something - anything - is upgraded or WP clears the update cache.
add_filter('upgrader_post_install', array($this, 'clearCachedVersion'));
add_action('delete_site_transient_update_plugins', array($this, 'clearCachedVersion'));
@@ -362,252 +357,12 @@ if ( !class_exists('Puc_v4p4_Plugin_UpdateChecker', false) ):
return $update;
}
- /**
- * Add a "Check for updates" link to the plugin row in the "Plugins" page. By default,
- * the new link will appear after the "Visit plugin site" link if present, otherwise
- * after the "View plugin details" link.
- *
- * You can change the link text by using the "puc_manual_check_link-$slug" filter.
- * Returning an empty string from the filter will disable the link.
- *
- * @param array $pluginMeta Array of meta links.
- * @param string $pluginFile
- * @return array
- */
- public function addCheckForUpdatesLink($pluginMeta, $pluginFile) {
- $isRelevant = ($pluginFile == $this->pluginFile)
- || (!empty($this->muPluginFile) && $pluginFile == $this->muPluginFile);
-
- if ( $isRelevant && $this->userCanInstallUpdates() ) {
- $linkUrl = wp_nonce_url(
- add_query_arg(
- array(
- 'puc_check_for_updates' => 1,
- 'puc_slug' => $this->slug,
- ),
- self_admin_url('plugins.php')
- ),
- 'puc_check_for_updates'
- );
-
- $linkText = apply_filters(
- $this->getUniqueName('manual_check_link'),
- __('Check for updates', 'plugin-update-checker')
- );
- if ( !empty($linkText) ) {
- /** @noinspection HtmlUnknownTarget */
- $pluginMeta[] = sprintf('%s', esc_attr($linkUrl), $linkText);
- }
- }
- return $pluginMeta;
- }
-
- /**
- * Add a "View Details" link to the plugin row in the "Plugins" page. By default,
- * the new link will appear before the "Visit plugin site" link (if present).
- *
- * You can change the link text by using the "puc_view_details_link-$slug" filter.
- * Returning an empty string from the filter will disable the link.
- *
- * You can change the position of the link using the
- * "puc_view_details_link_position-$slug" filter.
- * Returning 'before' or 'after' will place the link immediately before/after the
- * "Visit plugin site" link
- * Returning 'append' places the link after any existing links at the time of the hook.
- * Returning 'replace' replaces the "Visit plugin site" link
- * Returning anything else disables the link when there is a "Visit plugin site" link.
- *
- * If there is no "Visit plugin site" link 'append' is always used!
- *
- * @param array $pluginMeta Array of meta links.
- * @param string $pluginFile
- * @param array $pluginData Array of plugin header data.
- * @return array
- */
- public function addViewDetailsLink($pluginMeta, $pluginFile, $pluginData = array()) {
- $isRelevant = ($pluginFile == $this->pluginFile)
- || (!empty($this->muPluginFile) && $pluginFile == $this->muPluginFile);
-
- if ( $isRelevant && $this->userCanInstallUpdates() && !isset($pluginData['slug']) ) {
- $linkText = apply_filters($this->getUniqueName('view_details_link'), __('View details'));
- if ( !empty($linkText) ) {
- $viewDetailsLinkPosition = 'append';
-
- //Find the "Visit plugin site" link (if present).
- $visitPluginSiteLinkIndex = count($pluginMeta) - 1;
- if ( $pluginData['PluginURI'] ) {
- $escapedPluginUri = esc_url($pluginData['PluginURI']);
- foreach ($pluginMeta as $linkIndex => $existingLink) {
- if ( strpos($existingLink, $escapedPluginUri) !== false ) {
- $visitPluginSiteLinkIndex = $linkIndex;
- $viewDetailsLinkPosition = apply_filters(
- $this->getUniqueName('view_details_link_position'),
- 'before'
- );
- break;
- }
- }
- }
-
- $viewDetailsLink = sprintf('%s',
- esc_url(network_admin_url('plugin-install.php?tab=plugin-information&plugin=' . urlencode($this->slug) .
- '&TB_iframe=true&width=600&height=550')),
- esc_attr(sprintf(__('More information about %s'), $pluginData['Name'])),
- esc_attr($pluginData['Name']),
- $linkText
- );
- switch ($viewDetailsLinkPosition) {
- case 'before':
- array_splice($pluginMeta, $visitPluginSiteLinkIndex, 0, $viewDetailsLink);
- break;
- case 'after':
- array_splice($pluginMeta, $visitPluginSiteLinkIndex + 1, 0, $viewDetailsLink);
- break;
- case 'replace':
- $pluginMeta[$visitPluginSiteLinkIndex] = $viewDetailsLink;
- break;
- case 'append':
- default:
- $pluginMeta[] = $viewDetailsLink;
- break;
- }
- }
- }
- return $pluginMeta;
- }
-
-
- /**
- * Check for updates when the user clicks the "Check for updates" link.
- * @see self::addCheckForUpdatesLink()
- *
- * @return void
- */
- public function handleManualCheck() {
- $shouldCheck =
- isset($_GET['puc_check_for_updates'], $_GET['puc_slug'])
- && $_GET['puc_slug'] == $this->slug
- && $this->userCanInstallUpdates()
- && check_admin_referer('puc_check_for_updates');
-
- if ( $shouldCheck ) {
- $update = $this->checkForUpdates();
- $status = ($update === null) ? 'no_update' : 'update_available';
-
- if ( ($update === null) && !empty($this->lastRequestApiErrors) ) {
- //Some errors are not critical. For example, if PUC tries to retrieve the readme.txt
- //file from GitHub and gets a 404, that's an API error, but it doesn't prevent updates
- //from working. Maybe the plugin simply doesn't have a readme.
- //Let's only show important errors.
- $foundCriticalErrors = false;
- $questionableErrorCodes = array(
- 'puc-github-http-error',
- 'puc-gitlab-http-error',
- 'puc-bitbucket-http-error',
- );
-
- foreach ($this->lastRequestApiErrors as $item) {
- $wpError = $item['error'];
- /** @var WP_Error $wpError */
- if ( !in_array($wpError->get_error_code(), $questionableErrorCodes) ) {
- $foundCriticalErrors = true;
- break;
- }
- }
-
- if ( $foundCriticalErrors ) {
- $status = 'error';
- set_site_transient($this->manualCheckErrorTransient, $this->lastRequestApiErrors, 60);
- }
- }
-
- wp_redirect(add_query_arg(
- array(
- 'puc_update_check_result' => $status,
- 'puc_slug' => $this->slug,
- ),
- self_admin_url('plugins.php')
- ));
- }
- }
-
- /**
- * Display the results of a manual update check.
- * @see self::handleManualCheck()
- *
- * You can change the result message by using the "puc_manual_check_message-$slug" filter.
- */
- public function displayManualCheckResult() {
- if ( isset($_GET['puc_update_check_result'], $_GET['puc_slug']) && ($_GET['puc_slug'] == $this->slug) ) {
- $status = strval($_GET['puc_update_check_result']);
- $title = $this->getPluginTitle();
- $noticeClass = 'updated notice-success';
- $details = '';
-
- if ( $status == 'no_update' ) {
- $message = sprintf(_x('The %s plugin is up to date.', 'the plugin title', 'plugin-update-checker'), $title);
- } else if ( $status == 'update_available' ) {
- $message = sprintf(_x('A new version of the %s plugin is available.', 'the plugin title', 'plugin-update-checker'), $title);
- } else if ( $status === 'error' ) {
- $message = sprintf(_x('Could not determine if updates are available for %s.', 'the plugin title', 'plugin-update-checker'), $title);
- $noticeClass = 'error notice-error';
-
- $details = $this->formatManualCheckErrors(get_site_transient($this->manualCheckErrorTransient));
- delete_site_transient($this->manualCheckErrorTransient);
- } else {
- $message = sprintf(__('Unknown update checker status "%s"', 'plugin-update-checker'), htmlentities($status));
- $noticeClass = 'error notice-error';
- }
- printf(
- '',
- $noticeClass,
- apply_filters($this->getUniqueName('manual_check_message'), $message, $status),
- $details
- );
- }
- }
-
- /**
- * Format the list of errors that were thrown during an update check.
- *
- * @param array $errors
- * @return string
- */
- protected function formatManualCheckErrors($errors) {
- if ( empty($errors) ) {
- return '';
- }
- $output = '';
-
- $showAsList = count($errors) > 1;
- if ( $showAsList ) {
- $output .= '';
- $formatString = '- %1$s
%2$s ';
- } else {
- $formatString = '%1$s %2$s
';
- }
- foreach ($errors as $item) {
- $wpError = $item['error'];
- /** @var WP_Error $wpError */
- $output .= sprintf(
- $formatString,
- $wpError->get_error_message(),
- $wpError->get_error_code()
- );
- }
- if ( $showAsList ) {
- $output .= '
';
- }
-
- return $output;
- }
-
/**
* Get the translated plugin title.
*
* @return string
*/
- protected function getPluginTitle() {
+ public function getPluginTitle() {
$title = '';
$header = $this->getPluginHeader();
if ( $header && !empty($header['Name']) && isset($header['TextDomain']) ) {