Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
woocommerce
/
includes
/
admin
/
helper
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php if (!defined('ABSPATH')) { exit; } class WC_Helper_Updater { public static function load() { add_action('pre_set_site_transient_update_plugins', array(__CLASS__, 'transient_update_plugins'), 21, 1); add_action('pre_set_site_transient_update_themes', array(__CLASS__, 'transient_update_themes'), 21, 1); add_action('upgrader_process_complete', array(__CLASS__, 'upgrader_process_complete')); add_action('upgrader_pre_download', array(__CLASS__, 'block_expired_updates'), 10, 2); } public static function transient_update_plugins($transient) { $update_data = self::get_update_data(); foreach (WC_Helper::get_local_woo_plugins() as $plugin) { if (empty($update_data[$plugin['_product_id']])) { continue; } $data = $update_data[$plugin['_product_id']]; $filename = $plugin['_filename']; $item = array('id' => 'woocommerce-com-' . $plugin['_product_id'], 'slug' => 'woocommerce-com-' . $data['slug'], 'plugin' => $filename, 'new_version' => $data['version'], 'url' => $data['url'], 'package' => $data['package'], 'upgrade_notice' => $data['upgrade_notice']); if (isset($data['requires_php'])) { $item['requires_php'] = $data['requires_php']; } if (!self::_has_active_subscription($plugin['_product_id'])) { $item['package'] = 'woocommerce-com-expired-' . $plugin['_product_id']; } if (version_compare($plugin['Version'], $data['version'], '<')) { $transient->response[$filename] = (object) $item; unset($transient->no_update[$filename]); } else { $transient->no_update[$filename] = (object) $item; unset($transient->response[$filename]); } } $translations = self::get_translations_update_data(); $transient->translations = array_merge(isset($transient->translations) ? $transient->translations : array(), $translations); return $transient; } public static function transient_update_themes($transient) { $update_data = self::get_update_data(); foreach (WC_Helper::get_local_woo_themes() as $theme) { if (empty($update_data[$theme['_product_id']])) { continue; } $data = $update_data[$theme['_product_id']]; $slug = $theme['_stylesheet']; $item = array('theme' => $slug, 'new_version' => $data['version'], 'url' => $data['url'], 'package' => ''); if (self::_has_active_subscription($theme['_product_id'])) { $item['package'] = $data['package']; } if (version_compare($theme['Version'], $data['version'], '<')) { $transient->response[$slug] = $item; } else { unset($transient->response[$slug]); $transient->checked[$slug] = $data['version']; } } return $transient; } public static function get_update_data() { $payload = array(); foreach (WC_Helper::get_subscriptions() as $subscription) { $payload[$subscription['product_id']] = array('product_id' => $subscription['product_id'], 'file_id' => ''); } foreach (WC_Helper::get_local_woo_plugins() as $data) { if (!isset($payload[$data['_product_id']])) { $payload[$data['_product_id']] = array('product_id' => $data['_product_id']); } $payload[$data['_product_id']]['file_id'] = $data['_file_id']; } foreach (WC_Helper::get_local_woo_themes() as $data) { if (!isset($payload[$data['_product_id']])) { $payload[$data['_product_id']] = array('product_id' => $data['_product_id']); } $payload[$data['_product_id']]['file_id'] = $data['_file_id']; } return self::_update_check($payload); } public static function get_translations_update_data() { $payload = array(); $installed_translations = wp_get_installed_translations('plugins'); $locales = array_values(get_available_languages()); $locales = apply_filters('plugins_update_check_locales', $locales); $locales = array_unique($locales); if (empty($locales)) { return array(); } $plugins = WC_Helper::get_local_woo_plugins(); $active_woo_plugins = array_intersect(array_keys($plugins), get_option('active_plugins', array())); $active_for_translations = array_filter($active_woo_plugins, function ($plugin) use($plugins) { return apply_filters('woocommerce_translations_updates_for_' . $plugins[$plugin]['slug'], false); }); if (empty($active_for_translations)) { return array(); } if (wp_doing_cron()) { $timeout = 30; } else { $timeout = 3 + (int) (count($active_for_translations) / 10); } $request_body = array('locales' => $locales, 'plugins' => array()); foreach ($active_for_translations as $active_plugin) { $plugin = $plugins[$active_plugin]; $request_body['plugins'][$plugin['slug']] = array('version' => $plugin['Version']); } $raw_response = wp_remote_post('https://translate.wordpress.com/api/translations-updates/woocommerce', array('body' => json_encode($request_body), 'headers' => array('Content-Type: application/json'), 'timeout' => $timeout)); $response_code = wp_remote_retrieve_response_code($raw_response); if (200 !== $response_code) { return array(); } $response = json_decode(wp_remote_retrieve_body($raw_response), true); if (array_key_exists('success', $response) && false === $response['success']) { return array(); } $translations = array(); foreach ($response['data'] as $plugin_name => $language_packs) { foreach ($language_packs as $language_pack) { if (array_key_exists($plugin_name, $installed_translations) && array_key_exists($language_pack['wp_locale'], $installed_translations[$plugin_name])) { $installed_translation_revision_time = new DateTime($installed_translations[$plugin_name][$language_pack['wp_locale']]['PO-Revision-Date']); $new_translation_revision_time = new DateTime($language_pack['last_modified']); if ($new_translation_revision_time <= $installed_translation_revision_time) { continue; } } $translations[] = array('type' => 'plugin', 'slug' => $plugin_name, 'language' => $language_pack['wp_locale'], 'version' => $language_pack['version'], 'updated' => $language_pack['last_modified'], 'package' => $language_pack['package'], 'autoupdate' => true); } } return $translations; } private static function _update_check($payload) { ksort($payload); $hash = md5(wp_json_encode($payload)); $cache_key = '_woocommerce_helper_updates'; $data = get_transient($cache_key); if (false !== $data) { if (hash_equals($hash, $data['hash'])) { return $data['products']; } } $data = array('hash' => $hash, 'updated' => time(), 'products' => array(), 'errors' => array()); $request = WC_Helper_API::post('update-check', array('body' => wp_json_encode(array('products' => $payload)), 'authenticated' => true)); if (wp_remote_retrieve_response_code($request) !== 200) { $data['errors'][] = 'http-error'; } else { $data['products'] = json_decode(wp_remote_retrieve_body($request), true); } set_transient($cache_key, $data, 12 * HOUR_IN_SECONDS); return $data['products']; } private static function _has_active_subscription($product_id) { if (!isset($auth)) { $auth = WC_Helper_Options::get('auth'); } if (!isset($subscriptions)) { $subscriptions = WC_Helper::get_subscriptions(); } if (empty($auth['site_id']) || empty($subscriptions)) { return false; } foreach ($subscriptions as $subscription) { if ($subscription['product_id'] != $product_id) { continue; } if (in_array(absint($auth['site_id']), $subscription['connections'])) { return true; } } return false; } public static function get_updates_count() { $cache_key = '_woocommerce_helper_updates_count'; $count = get_transient($cache_key); if (false !== $count) { return $count; } if (!get_transient('_woocommerce_helper_subscriptions')) { return 0; } if (!get_transient('_woocommerce_helper_updates')) { return 0; } $count = 0; $update_data = self::get_update_data(); if (empty($update_data)) { set_transient($cache_key, $count, 12 * HOUR_IN_SECONDS); return $count; } foreach (WC_Helper::get_local_woo_plugins() as $plugin) { if (empty($update_data[$plugin['_product_id']])) { continue; } if (version_compare($plugin['Version'], $update_data[$plugin['_product_id']]['version'], '<')) { $count++; } } foreach (WC_Helper::get_local_woo_themes() as $theme) { if (empty($update_data[$theme['_product_id']])) { continue; } if (version_compare($theme['Version'], $update_data[$theme['_product_id']]['version'], '<')) { $count++; } } set_transient($cache_key, $count, 12 * HOUR_IN_SECONDS); return $count; } public static function get_updates_count_html() { $count = self::get_updates_count(); if (!$count) { return ''; } $count_html = sprintf('<span class="update-plugins count-%d"><span class="update-count">%d</span></span>', $count, number_format_i18n($count)); return $count_html; } public static function flush_updates_cache() { delete_transient('_woocommerce_helper_updates'); delete_transient('_woocommerce_helper_updates_count'); delete_site_transient('update_plugins'); delete_site_transient('update_themes'); } public static function upgrader_process_complete() { delete_transient('_woocommerce_helper_updates_count'); } public static function block_expired_updates($reply, $package) { if (false !== $reply) { return $reply; } if (0 !== strpos($package, 'woocommerce-com-expired-')) { return false; } return new WP_Error('woocommerce_subscription_expired', sprintf(__('Please visit the <a href="%s" target="_blank">subscriptions page</a> and renew to continue receiving updates.', 'woocommerce'), esc_url(admin_url('admin.php?page=wc-addons§ion=helper')))); } } WC_Helper_Updater::load();