Submit
Path:
~
/
/
var
/
softaculous
/
sitepad
/
editor
/
site-data
/
plugins
/
kkart-pro
/
includes
/
File Content:
class-kkart-regenerate-images.php
<?php /** * Regenerate Images Functionality * * All functionality pertaining to regenerating product images in realtime. * * @package Kkart\Classes * @version 3.5.0 * @since 3.3.0 */ defined( 'ABSPATH' ) || exit; /** * Regenerate Images Class */ class KKART_Regenerate_Images { /** * Background process to regenerate all images * * @var KKART_Regenerate_Images_Request */ protected static $background_process; /** * Stores size being generated on the fly. * * @var string */ protected static $regenerate_size; /** * Init function */ public static function init() { add_action( 'image_get_intermediate_size', array( __CLASS__, 'filter_image_get_intermediate_size' ), 10, 3 ); add_filter( 'wp_generate_attachment_metadata', array( __CLASS__, 'add_uncropped_metadata' ) ); add_filter( 'wp_get_attachment_image_src', array( __CLASS__, 'maybe_resize_image' ), 10, 4 ); // Not required when Jetpack Photon is in use. if ( method_exists( 'Jetpack', 'is_module_active' ) && Jetpack::is_module_active( 'photon' ) ) { return; } if ( apply_filters( 'kkart_background_image_regeneration', true ) ) { include_once KKART_ABSPATH . 'includes/class-kkart-regenerate-images-request.php'; self::$background_process = new KKART_Regenerate_Images_Request(); add_action( 'admin_init', array( __CLASS__, 'regenerating_notice' ) ); add_action( 'kkart_hide_regenerating_thumbnails_notice', array( __CLASS__, 'dismiss_regenerating_notice' ) ); // Regenerate thumbnails in the background after settings changes. Not ran on multisite to avoid multiple simultanious jobs. if ( ! is_multisite() ) { add_action( 'customize_save_after', array( __CLASS__, 'maybe_regenerate_images' ) ); add_action( 'after_switch_theme', array( __CLASS__, 'maybe_regenerate_images' ) ); } } } /** * If an intermediate size meta differs from the actual image size (settings were changed?) return false so the wrong size is not used. * * @param array $data Size data. * @param int $attachment_id Attachment ID. * @param string $size Size name. * @return array */ public static function filter_image_get_intermediate_size( $data, $attachment_id, $size ) { if ( ! is_string( $size ) || ! in_array( $size, apply_filters( 'kkart_image_sizes_to_resize', array( 'kkart_thumbnail', 'kkart_gallery_thumbnail', 'kkart_single', 'shop_thumbnail', 'shop_catalog', 'shop_single' ) ), true ) ) { return $data; } // If we don't have sizes, we cannot proceed. if ( ! isset( $data['width'], $data['height'] ) ) { return $data; } // See if the image size has changed from our settings. if ( ! self::image_size_matches_settings( $data, $size ) ) { // If Photon is running we can just return false and let Jetpack handle regeneration. if ( method_exists( 'Jetpack', 'is_module_active' ) && Jetpack::is_module_active( 'photon' ) ) { return false; } else { // If we get here, Jetpack is not running and we don't have the correct image sized stored. Try to return closest match. $size_data = kkart_get_image_size( $size ); return image_get_intermediate_size( $attachment_id, array( absint( $size_data['width'] ), absint( $size_data['height'] ) ) ); } } return $data; } /** * We need to track if uncropped was on or off when generating the images. * * @param array $meta_data Array of meta data. * @return array */ public static function add_uncropped_metadata( $meta_data ) { $size_data = kkart_get_image_size( 'kkart_thumbnail' ); if ( isset( $meta_data['sizes'], $meta_data['sizes']['kkart_thumbnail'] ) ) { $meta_data['sizes']['kkart_thumbnail']['uncropped'] = empty( $size_data['height'] ); } return $meta_data; } /** * See if an image's dimensions match actual settings. * * @param array $image Image dimensions array. * @param string $size Named size. * @return bool True if they match. False if they do not (may trigger regen). */ protected static function image_size_matches_settings( $image, $size ) { $target_size = kkart_get_image_size( $size ); $uncropped = '' === $target_size['width'] || '' === $target_size['height']; if ( ! $uncropped ) { $ratio_match = wp_image_matches_ratio( $image['width'], $image['height'], $target_size['width'], $target_size['height'] ); // Size is invalid if the widths or crop setting don't match. if ( $ratio_match && $target_size['width'] !== $image['width'] ) { return false; } // Size is invalid if the heights don't match. if ( $ratio_match && $target_size['height'] && $target_size['height'] !== $image['height'] ) { return false; } } // If cropping mode has changed, regenerate the image. if ( $uncropped && empty( $image['uncropped'] ) ) { return false; } return true; } /** * Show notice when job is running in background. */ public static function regenerating_notice() { if ( ! self::$background_process->is_running() ) { KKART_Admin_Notices::add_notice( 'regenerating_thumbnails' ); } else { KKART_Admin_Notices::remove_notice( 'regenerating_thumbnails' ); } } /** * Dismiss notice and cancel jobs. */ public static function dismiss_regenerating_notice() { if ( self::$background_process ) { self::$background_process->kill_process(); $log = kkart_get_logger(); $log->info( __( 'Cancelled product image regeneration job.', 'kkart' ), array( 'source' => 'kkart-image-regeneration', ) ); } KKART_Admin_Notices::remove_notice( 'regenerating_thumbnails' ); } /** * Regenerate images if the settings have changed since last re-generation. * * @return void */ public static function maybe_regenerate_images() { $size_hash = md5( wp_json_encode( array( kkart_get_image_size( 'thumbnail' ), kkart_get_image_size( 'single' ), kkart_get_image_size( 'gallery_thumbnail' ), ) ) ); if ( update_option( 'kkart_maybe_regenerate_images_hash', $size_hash ) ) { // Size settings have changed. Trigger regen. self::queue_image_regeneration(); } } /** * Check if we should maybe generate a new image size if not already there. * * @param array $image Properties of the image. * @param int $attachment_id Attachment ID. * @param string|array $size Image size. * @param bool $icon If icon or not. * @return array */ public static function maybe_resize_image( $image, $attachment_id, $size, $icon ) { if ( ! apply_filters( 'kkart_resize_images', true ) ) { return $image; } // List of sizes we want to resize. Ignore others. if ( ! $image || ! in_array( $size, apply_filters( 'kkart_image_sizes_to_resize', array( 'kkart_thumbnail', 'kkart_gallery_thumbnail', 'kkart_single', 'shop_thumbnail', 'shop_catalog', 'shop_single' ) ), true ) ) { return $image; } $target_size = kkart_get_image_size( $size ); $image_width = $image[1]; $image_height = $image[2]; $ratio_match = false; $target_uncropped = '' === $target_size['width'] || '' === $target_size['height'] || ! $target_size['crop']; // If '' is passed to either size, we test ratios against the original file. It's uncropped. if ( $target_uncropped ) { $full_size = self::get_full_size_image_dimensions( $attachment_id ); if ( ! $full_size || ! $full_size['width'] || ! $full_size['height'] ) { return $image; } $ratio_match = wp_image_matches_ratio( $image_width, $image_height, $full_size['width'], $full_size['height'] ); } else { $ratio_match = wp_image_matches_ratio( $image_width, $image_height, $target_size['width'], $target_size['height'] ); } if ( ! $ratio_match ) { $full_size = self::get_full_size_image_dimensions( $attachment_id ); if ( ! $full_size ) { return $image; } // Check if the actual image has a larger dimension than the requested image size. Smaller images are not zoom-cropped. if ( $image_width === $target_size['width'] && $full_size['height'] < $target_size['height'] ) { return $image; } if ( $image_height === $target_size['height'] && $full_size['width'] < $target_size['width'] ) { return $image; } // If the full size image is smaller both ways, don't scale it up. if ( $full_size['height'] < $target_size['height'] && $full_size['width'] < $target_size['width'] ) { return $image; } return self::resize_and_return_image( $attachment_id, $image, $size, $icon ); } return $image; } /** * Get full size image dimensions. * * @param int $attachment_id Attachment ID of image. * @return array Width and height. Empty array if the dimensions cannot be found. */ private static function get_full_size_image_dimensions( $attachment_id ) { $imagedata = wp_get_attachment_metadata( $attachment_id ); if ( ! $imagedata ) { return array(); } if ( ! isset( $imagedata['file'] ) && isset( $imagedata['sizes']['full'] ) ) { $imagedata['height'] = $imagedata['sizes']['full']['height']; $imagedata['width'] = $imagedata['sizes']['full']['width']; } return array( 'width' => $imagedata['width'], 'height' => $imagedata['height'], ); } /** * Ensure we are dealing with the correct image attachment * * @param int|WP_Post $attachment Attachment object or ID. * @return boolean */ public static function is_regeneratable( $attachment ) { if ( 'site-icon' === get_post_meta( is_object( $attachment ) ? $attachment->ID : $attachment, '_wp_attachment_context', true ) ) { return false; } if ( wp_attachment_is_image( $attachment ) ) { return true; } return false; } /** * Only regenerate images for the requested size. * * @param array $sizes Array of image sizes. * @return array */ public static function adjust_intermediate_image_sizes( $sizes ) { return array( self::$regenerate_size ); } /** * Generate the thumbnail filename and dimensions for a given file. * * @param string $fullsizepath Path to full size image. * @param int $thumbnail_width The width of the thumbnail. * @param int $thumbnail_height The height of the thumbnail. * @param bool $crop Whether to crop or not. * @return array|false An array of the filename, thumbnail width, and thumbnail height, or false on failure to resize such as the thumbnail being larger than the fullsize image. */ private static function get_image( $fullsizepath, $thumbnail_width, $thumbnail_height, $crop ) { list( $fullsize_width, $fullsize_height ) = getimagesize( $fullsizepath ); $dimensions = image_resize_dimensions( $fullsize_width, $fullsize_height, $thumbnail_width, $thumbnail_height, $crop ); $editor = wp_get_image_editor( $fullsizepath ); if ( is_wp_error( $editor ) ) { return false; } if ( ! $dimensions || ! is_array( $dimensions ) ) { return false; } list( , , , , $dst_w, $dst_h ) = $dimensions; $suffix = "{$dst_w}x{$dst_h}"; $file_ext = strtolower( pathinfo( $fullsizepath, PATHINFO_EXTENSION ) ); return array( 'filename' => $editor->generate_filename( $suffix, null, $file_ext ), 'width' => $dst_w, 'height' => $dst_h, ); } /** * Regenerate the image according to the required size * * @param int $attachment_id Attachment ID. * @param array $image Original Image. * @param string $size Size to return for new URL. * @param bool $icon If icon or not. * @return string */ private static function resize_and_return_image( $attachment_id, $image, $size, $icon ) { if ( ! self::is_regeneratable( $attachment_id ) ) { return $image; } $fullsizepath = get_attached_file( $attachment_id ); if ( false === $fullsizepath || is_wp_error( $fullsizepath ) || ! file_exists( $fullsizepath ) ) { return $image; } if ( ! function_exists( 'wp_crop_image' ) ) { include KKART_ADMIN_DIR . 'includes/image.php'; } self::$regenerate_size = is_customize_preview() ? $size . '_preview' : $size; if ( is_customize_preview() ) { $image_size = kkart_get_image_size( $size ); // Make sure registered image size matches the size we're requesting. add_image_size( self::$regenerate_size, absint( $image_size['width'] ), absint( $image_size['height'] ), $image_size['crop'] ); $thumbnail = self::get_image( $fullsizepath, absint( $image_size['width'] ), absint( $image_size['height'] ), $image_size['crop'] ); // If the file is already there perhaps just load it if we're using the customizer. No need to store in meta data. if ( $thumbnail && file_exists( $thumbnail['filename'] ) ) { $wp_uploads = wp_upload_dir( null, false ); $wp_uploads_dir = $wp_uploads['basedir']; $wp_uploads_url = $wp_uploads['baseurl']; return array( 0 => str_replace( $wp_uploads_dir, $wp_uploads_url, $thumbnail['filename'] ), 1 => $thumbnail['width'], 2 => $thumbnail['height'], ); } } $metadata = wp_get_attachment_metadata( $attachment_id ); // Fix for images with no metadata. if ( ! is_array( $metadata ) ) { $metadata = array(); } // We only want to regen a specific image size. add_filter( 'intermediate_image_sizes', array( __CLASS__, 'adjust_intermediate_image_sizes' ) ); // This function will generate the new image sizes. $new_metadata = wp_generate_attachment_metadata( $attachment_id, $fullsizepath ); // Remove custom filter. remove_filter( 'intermediate_image_sizes', array( __CLASS__, 'adjust_intermediate_image_sizes' ) ); // If something went wrong lets just return the original image. if ( is_wp_error( $new_metadata ) || empty( $new_metadata ) ) { return $image; } if ( isset( $new_metadata['sizes'][ self::$regenerate_size ] ) ) { $metadata['sizes'][ self::$regenerate_size ] = $new_metadata['sizes'][ self::$regenerate_size ]; wp_update_attachment_metadata( $attachment_id, $metadata ); } // Now we've done our regen, attempt to return the new size. $new_image = self::unfiltered_image_downsize( $attachment_id, self::$regenerate_size ); return $new_image ? $new_image : $image; } /** * Image downsize, without this classes filtering on the results. * * @param int $attachment_id Attachment ID. * @param string $size Size to downsize to. * @return string New image URL. */ private static function unfiltered_image_downsize( $attachment_id, $size ) { remove_action( 'image_get_intermediate_size', array( __CLASS__, 'filter_image_get_intermediate_size' ), 10, 3 ); $return = image_downsize( $attachment_id, $size ); add_action( 'image_get_intermediate_size', array( __CLASS__, 'filter_image_get_intermediate_size' ), 10, 3 ); return $return; } /** * Get list of images and queue them for regeneration * * @return void */ public static function queue_image_regeneration() { global $wpdb; // First lets cancel existing running queue to avoid running it more than once. self::$background_process->kill_process(); // Now lets find all product image attachments IDs and pop them onto the queue. $images = $wpdb->get_results( // @codingStandardsIgnoreLine "SELECT ID FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%' ORDER BY ID DESC" ); foreach ( $images as $image ) { self::$background_process->push_to_queue( array( 'attachment_id' => $image->ID, ) ); } // Lets dispatch the queue to start processing. self::$background_process->save()->dispatch(); } } add_action( 'init', array( 'KKART_Regenerate_Images', 'init' ) );
Submit
FILE
FOLDER
Name
Size
Permission
Action
abstracts
---
0755
admin
---
0755
cli
---
0755
customizer
---
0755
data-stores
---
0755
emails
---
0755
export
---
0755
gateways
---
0755
import
---
0755
integrations
---
0755
interfaces
---
0755
legacy
---
0755
libraries
---
0755
log-handlers
---
0755
payment-tokens
---
0755
queue
---
0755
rest-api
---
0755
shipping
---
0755
shortcodes
---
0755
theme-support
---
0755
tracks
---
0755
traits
---
0755
walkers
---
0755
wccom-site
---
0755
widgets
---
0755
body-props-settings.php
8379 bytes
0644
class-kkart-ajax.php
131339 bytes
0644
class-kkart-api.php
5090 bytes
0644
class-kkart-auth.php
11939 bytes
0644
class-kkart-autoloader.php
2842 bytes
0644
class-kkart-background-emailer.php
4703 bytes
0644
class-kkart-background-updater.php
3580 bytes
0644
class-kkart-breadcrumb.php
9692 bytes
0644
class-kkart-cache-helper.php
10967 bytes
0644
class-kkart-cart-fees.php
3498 bytes
0644
class-kkart-cart-session.php
14806 bytes
0644
class-kkart-cart-totals.php
28388 bytes
0644
class-kkart-cart.php
64753 bytes
0644
class-kkart-checkout.php
45656 bytes
0644
class-kkart-cli.php
1043 bytes
0644
class-kkart-comments.php
13305 bytes
0644
class-kkart-countries.php
43222 bytes
0644
class-kkart-coupon.php
33350 bytes
0644
class-kkart-customer-download-log.php
3458 bytes
0644
class-kkart-customer-download.php
10606 bytes
0644
class-kkart-customer.php
27894 bytes
0644
class-kkart-data-exception.php
1306 bytes
0644
class-kkart-data-store.php
6022 bytes
0644
class-kkart-datetime.php
2251 bytes
0644
class-kkart-deprecated-action-hooks.php
6697 bytes
0644
class-kkart-deprecated-filter-hooks.php
6413 bytes
0644
class-kkart-discounts.php
31706 bytes
0644
class-kkart-download-handler.php
23930 bytes
0644
class-kkart-emails.php
22698 bytes
0644
class-kkart-embed.php
4284 bytes
0644
class-kkart-form-handler.php
44776 bytes
0644
class-kkart-frontend-scripts.php
26623 bytes
0644
class-kkart-geo-ip.php
31165 bytes
0644
class-kkart-geolite-integration.php
2042 bytes
0644
class-kkart-geolocation.php
10586 bytes
0644
class-kkart-https.php
4397 bytes
0644
class-kkart-install.php
55130 bytes
0644
class-kkart-integrations.php
1316 bytes
0644
class-kkart-log-levels.php
2597 bytes
0644
class-kkart-logger.php
8405 bytes
0644
class-kkart-meta-data.php
2231 bytes
0644
class-kkart-order-factory.php
3212 bytes
0644
class-kkart-order-item-coupon.php
4118 bytes
0644
class-kkart-order-item-fee.php
8909 bytes
0644
class-kkart-order-item-meta.php
5939 bytes
0644
class-kkart-order-item-product.php
13366 bytes
0644
class-kkart-order-item-shipping.php
7933 bytes
0644
class-kkart-order-item-tax.php
6593 bytes
0644
class-kkart-order-item.php
10947 bytes
0644
class-kkart-order-query.php
2578 bytes
0644
class-kkart-order-refund.php
5009 bytes
0644
class-kkart-order.php
62493 bytes
0644
class-kkart-payment-gateways.php
5367 bytes
0644
class-kkart-payment-tokens.php
6047 bytes
0644
class-kkart-post-data.php
18242 bytes
0644
class-kkart-post-types.php
27128 bytes
0644
class-kkart-privacy-background-process.php
1734 bytes
0644
class-kkart-privacy-erasers.php
13603 bytes
0644
class-kkart-privacy-exporters.php
14458 bytes
0644
class-kkart-privacy.php
15212 bytes
0644
class-kkart-product-attribute.php
7052 bytes
0644
class-kkart-product-download.php
6159 bytes
0644
class-kkart-product-external.php
4889 bytes
0644
class-kkart-product-factory.php
3683 bytes
0644
class-kkart-product-grouped.php
5319 bytes
0644
class-kkart-product-query.php
2222 bytes
0644
class-kkart-product-simple.php
1899 bytes
0644
class-kkart-product-variable.php
21983 bytes
0644
class-kkart-product-variation.php
17610 bytes
0644
class-kkart-query.php
31129 bytes
0644
class-kkart-rate-limiter.php
2133 bytes
0644
class-kkart-regenerate-images-request.php
8365 bytes
0644
class-kkart-regenerate-images.php
15607 bytes
0644
class-kkart-register-wp-admin-settings.php
4990 bytes
0644
class-kkart-rest-authentication.php
19811 bytes
0644
class-kkart-rest-exception.php
273 bytes
0644
class-kkart-session-handler.php
10821 bytes
0644
class-kkart-shipping-rate.php
5388 bytes
0644
class-kkart-shipping-zone.php
13404 bytes
0644
class-kkart-shipping-zones.php
4169 bytes
0644
class-kkart-shipping.php
11607 bytes
0644
class-kkart-shortcodes.php
17618 bytes
0644
class-kkart-structured-data.php
17614 bytes
0644
class-kkart-tax.php
36697 bytes
0644
class-kkart-template-loader.php
18878 bytes
0644
class-kkart-tracker.php
23049 bytes
0644
class-kkart-validation.php
5975 bytes
0644
class-kkart-webhook.php
30567 bytes
0644
class-kkart.php
33477 bytes
0644
kkart-account-functions.php
12995 bytes
0644
kkart-attribute-functions.php
21083 bytes
0644
kkart-cart-functions.php
17683 bytes
0644
kkart-conditional-functions.php
12079 bytes
0644
kkart-core-functions.php
84228 bytes
0644
kkart-coupon-functions.php
2711 bytes
0644
kkart-formatting-functions.php
42607 bytes
0644
kkart-notice-functions.php
7623 bytes
0644
kkart-order-functions.php
34333 bytes
0644
kkart-order-item-functions.php
5177 bytes
0644
kkart-page-functions.php
7084 bytes
0644
kkart-product-functions.php
48433 bytes
0644
kkart-rest-functions.php
10876 bytes
0644
kkart-stock-functions.php
12753 bytes
0644
kkart-template-functions.php
168595 bytes
0644
kkart-template-hooks.php
11322 bytes
0644
kkart-term-functions.php
19918 bytes
0644
kkart-update-functions.php
66440 bytes
0644
kkart-user-functions.php
27222 bytes
0644
kkart-webhook-functions.php
5713 bytes
0644
kkart-widget-functions.php
2126 bytes
0644
premium.php
943 bytes
0644
premium_functions.php
957 bytes
0644
shortcode_functions.php
72821 bytes
0644
shortcodes.php
272113 bytes
0644
template.php
2921 bytes
0644
N4ST4R_ID | Naxtarrr