File "class-wc-helper-updater.php"
Full path: /home/kosmetik/public_html/wp-content/plugins/woocommerce/includes/admin/helper/class-wc-helper-updater.php
File
size: 11.11 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?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();