????JFIF??x?x????'
Server IP : 79.136.114.73 / Your IP : 18.219.198.219 Web Server : Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.29 OpenSSL/1.0.1f System : Linux b8009 3.13.0-170-generic #220-Ubuntu SMP Thu May 9 12:40:49 UTC 2019 x86_64 User : www-data ( 33) PHP Version : 5.5.9-1ubuntu4.29 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /var/www/www.astacus.eu/wp-content/themes/Avada/includes/ |
Upload File : |
<?php // Do not allow directly accessing this file. if ( ! defined( 'ABSPATH' ) ) { exit( 'Direct script access denied.' ); } /** * Handle images in Avada. * Includes responsive-images tweaks. * * @since 3.8 */ class Avada_Images { /** * The grid image meta. * * @static * @access public * @var array */ public static $grid_image_meta; /** * An array of the accepted widths. * * @static * @access public * @var array */ public static $grid_accepted_widths; /** * An array of supported layouts. * * @static * @access public * @var array */ public static $supported_grid_layouts; /** * Constructor. * * @access public */ public function __construct() { self::$grid_image_meta = array(); self::$grid_accepted_widths = array( '200', '400', '600', '800', '1200' ); self::$supported_grid_layouts = array( 'grid', 'timeline', 'large', 'portfolio_full', 'related-posts' ); $options = get_option( Avada::get_option_name() ); if ( isset( $options['status_lightbox'] ) && $options['status_lightbox'] ) { add_filter( 'wp_get_attachment_link', array( $this, 'prepare_lightbox_links' ) ); } add_filter( 'jpeg_quality', array( $this, 'set_jpeg_quality' ) ); add_filter( 'wp_editor_set_quality', array( $this, 'set_jpeg_quality' ) ); add_filter( 'max_srcset_image_width', array( $this, 'set_max_srcset_image_width' ) ); add_filter( 'wp_calculate_image_srcset', array( $this, 'set_largest_image_size' ), '10', '5' ); add_filter( 'wp_calculate_image_srcset', array( $this, 'edit_grid_image_srcset' ), '15', '5' ); add_filter( 'wp_calculate_image_sizes', array( $this, 'edit_grid_image_sizes' ), '10', '5' ); add_filter( 'post_thumbnail_html', array( $this, 'edit_grid_image_src' ), '10', '5' ); add_action( 'delete_attachment', array( $this, 'delete_resized_images' ) ); } /** * Adds lightbox attributes to links. * * @param string $content The content. */ public function prepare_lightbox_links( $content ) { preg_match_all( '/<a[^>]+href=([\'"])(.+?)\1[^>]*>/i', $content, $matches ); $attachment_id = self::get_attachment_id_from_url( $matches[2][0] ); $title = get_post_field( 'post_title', $attachment_id ); $caption = get_post_field( 'post_excerpt', $attachment_id ); $content = preg_replace( '/<a/', '<a data-rel="iLightbox[postimages]" data-title="' . $title . '" data-caption="' . $caption . '"' , $content, 1 ); return $content; } /** * Modify the image quality and set it to chosen Theme Options value. * * @since 3.9 * * @return string The new image quality. */ public function set_jpeg_quality() { return Avada()->settings->get( 'pw_jpeg_quality' ); } /** * Modify the maximum image width to be included in srcset attribute. * * @since 3.9 * * @param int $max_width The maximum image width to be included in the 'srcset'. Default '1600'. * * @return int The new max width. */ public function set_max_srcset_image_width( $max_width ) { return 1920; } /** * Add the fullsize image to the scrset attribute. * * @since 3.9.0 * * @param array $sources { * One or more arrays of source data to include in the 'srcset'. * * @type array $width { * @type string $url The URL of an image source. * @type string $descriptor The descriptor type used in the image candidate string, * either 'w' or 'x'. * @type int $value The source width if paired with a 'w' descriptor, or a * pixel density value if paired with an 'x' descriptor. * } * } * @param array $size_array Array of width and height values in pixels (in that order). * @param string $image_src The 'src' of the image. * @param array $image_meta The image meta data as returned by 'wp_get_attachment_metadata()'. * @param int $attachment_id Image attachment ID or 0. * * @return array $sources One or more arrays of source data to include in the 'srcset'. */ public function set_largest_image_size( $sources, $size_array, $image_src, $image_meta, $attachment_id ) { $cropped_image = false; foreach ( $sources as $source => $details ) { if ( $details['url'] == $image_src ) { $cropped_image = true; } } if ( ! $cropped_image ) { $full_image_src = wp_get_attachment_image_src( $attachment_id, 'full' ); $full_size = array( 'url' => $full_image_src[0], 'descriptor' => 'w', 'value' => $image_meta['width'], ); $sources[ $image_meta['width'] ] = $full_size; } return $sources; } /** * Filter out all srcset attributes, that do not fit current grid layout. * * @since 4.0.0 * * @param array $sources { * One or more arrays of source data to include in the 'srcset'. * * @type array $width { * @type string $url The URL of an image source. * @type string $descriptor The descriptor type used in the image candidate string, * either 'w' or 'x'. * @type int $value The source width if paired with a 'w' descriptor, or a * pixel density value if paired with an 'x' descriptor. * } * } * @param array $size_array Array of width and height values in pixels (in that order). * @param string $image_src The 'src' of the image. * @param array $image_meta The image meta data as returned by 'wp_get_attachment_metadata()'. * @param int $attachment_id Image attachment ID or 0. * * @return array $sources One or more arrays of source data to include in the 'srcset'. */ public function edit_grid_image_srcset( $sources, $size_array, $image_src, $image_meta, $attachment_id ) { // Only do manipulation for blog images. if ( ! empty( self::$grid_image_meta ) ) { // Check if Safari below version 9 is used. $is_safari_below_v9 = false; if ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) { $user_agent = $_SERVER['HTTP_USER_AGENT']; preg_match( '/(?:version\/|(?:safari) )([\d.]+)/i', $user_agent, $matches ); $version = isset( $matches[1] ) ? $matches[1] : false; if ( false !== stripos( $user_agent, 'safari' ) && false === stripos( $user_agent, 'chrome' ) && version_compare( $version, '9.0.0', '<' ) ) { $is_safari_below_v9 = true; } } // All browsers except Safari below version 9. if ( ! $is_safari_below_v9 ) { // Only include the uncropped sizes in srcset. foreach ( $sources as $width => $source ) { // Make sure the original image isn't deleted. preg_match( '/-\d+x\d+(?=\.(jpg|jpeg|png|gif|tiff|svg)$)/i', $source['url'], $matches ); if ( ! in_array( $width, self::$grid_accepted_widths ) && isset( $matches[0] ) ) { unset( $sources[ $width ] ); } } // Safari below version 9. } else { $accepted_widths = array( '400', '800', '1200' ); foreach ( $sources as $width => $source ) { if ( ! in_array( $width, $accepted_widths ) ) { // Unset cropped sizes. unset( $sources[ $width ] ); } else { // Reset the sources to x descriptor. if ( in_array( $width, $accepted_widths ) ) { $sources[ $width ]['descriptor'] = 'x'; $sources[ $width ]['value'] = array_search( $width, $accepted_widths ) + 1; } } } } } ksort( $sources ); return $sources; } /** * Edits the'sizes' attribute for grid images. * * @since 4.0 * * @param string $sizes A source size value for use in a 'sizes' attribute. * @param array|string $size Image size to retrieve. Accepts any valid image size, or an array * of width and height values in pixels (in that order). Default 'medium'. * @param string $image_src Optional. The URL to the image file. Default null. * @param array $image_meta Optional. The image meta data as returned by 'wp_get_attachment_metadata()'. * Default null. * @param int $attachment_id Optional. Image attachment ID. Either `$image_meta` or `$attachment_id` * is needed when using the image size name as argument for `$size`. Default 0. * @return string|bool A valid source size value for use in a 'sizes' attribute or false. */ public function edit_grid_image_sizes( $sizes, $size, $image_src, $image_meta, $attachment_id ) { if ( isset( self::$grid_image_meta['layout'] ) ) { $side_header_width = ( 'Top' == Avada()->settings->get( 'header_position' ) ) ? 0 : intval( Avada()->settings->get( 'side_header_width' ) ); $content_break_point = $side_header_width + intval( Avada()->settings->get( 'content_break_point' ) ); $content_width = Avada()->layout->get_content_width(); if ( isset( self::$grid_image_meta['gutter_width'] ) ) { $content_width -= self::$grid_image_meta['gutter_width'] * ( (int) self::$grid_image_meta['columns'] - 1 ); } // Grid. if ( in_array( self::$grid_image_meta['layout'], array( 'grid', 'portfolio_full', 'related-posts' ) ) ) { $main_break_point = (int) Avada()->settings->get( 'grid_main_break_point' ); if ( 640 < $main_break_point ) { $breakpoint_range = $main_break_point - 640; } else { $breakpoint_range = 360; } $breakpoint_interval = $breakpoint_range / 5; $break_points[6] = $main_break_point + $side_header_width; $break_points[5] = $break_points[6] - $breakpoint_interval; $break_points[4] = $break_points[6] - 2 * $breakpoint_interval; $break_points[3] = $break_points[6] - 3 * $breakpoint_interval; $break_points[2] = $break_points[6] - 4 * $breakpoint_interval; $break_points[1] = $break_points[6] - 5 * $breakpoint_interval; $sizes = ''; // Make sure image sizes will be correct for 100% width pages. if ( Avada()->layout->is_current_wrapper_hundred_percent() ) { $largest_breakpoint = $main_break_point + 200; $columns = (int) self::$grid_image_meta['columns']; $width = round( 100 / $columns ); $sizes .= '(min-width: ' . $largest_breakpoint . 'px) ' . $width . 'vw, '; } foreach ( $break_points as $columns => $breakpoint ) { if ( $columns <= (int) self::$grid_image_meta['columns'] ) { $width = $content_width / $columns; if ( $breakpoint < $width ) { $width = $breakpoint + $breakpoint_interval; } $sizes .= '(min-width: ' . round( $breakpoint ) . 'px) ' . round( $width ) . 'px, '; } } $sizes .= '100vw'; // Timeline. } elseif ( 'timeline' == self::$grid_image_meta['layout'] ) { $width = 40; $sizes = '(max-width: ' . $content_break_point . 'px) 100vw, ' . $width . 'vw'; // Large Layouts. } elseif ( false !== strpos( self::$grid_image_meta['layout'], 'large' ) ) { $sizes = '(max-width: ' . $content_break_point . 'px) 100vw, ' . $content_width . 'px'; } } return $sizes; } /** * Change the src attribute for grid images. * * @since 4.0.0 * * @param string $html The post thumbnail HTML. * @param int $post_id The post ID. * @param string $post_thumbnail_id The post thumbnail ID. * @param string|array $size The post thumbnail size. Image size or array of width and height * values (in that order). Default 'post-thumbnail'. * @param string $attr Query string of attributes. * @return string The html markup of the image. */ public function edit_grid_image_src( $html, $post_id = null, $post_thumbnail_id = null, $size = null, $attr = null ) { if ( isset( self::$grid_image_meta['layout'] ) && in_array( self::$grid_image_meta['layout'], self::$supported_grid_layouts ) && 'full' === $size ) { $image_size = $this->get_grid_image_base_size( $post_thumbnail_id, self::$grid_image_meta['layout'], self::$grid_image_meta['columns'] ); $full_image_src = wp_get_attachment_image_src( $post_thumbnail_id, $image_size ); $html = preg_replace( '@src="([^"]+)"@', 'src="' . $full_image_src[0] . '"', $html ); } return $html; } /** * Get image size based on column size. * * @since 4.0.0 * * @param null|int $post_thumbnail_id Attachment ID. * @param null|string $layout The layout. * @param null|int $columns Number of columns. * @return string Image size name. */ public function get_grid_image_base_size( $post_thumbnail_id = null, $layout = null, $columns = null ) { // @codingStandardsIgnoreStart global $is_IE; // @codingStandardsIgnoreEnd $sizes = array(); $width = ''; // Get image metadata. $image_meta = wp_get_attachment_metadata( $post_thumbnail_id ); if ( $image_meta ) { $image_sizes = $image_meta['sizes']; if ( $image_sizes && is_array( $image_sizes ) ) { foreach ( $image_sizes as $name => $image ) { if ( in_array( $name, self::$grid_accepted_widths ) ) { // Create accepted sizes array. if ( $image['width'] ) { $sizes[ $image['width'] ] = $name; } } } } $sizes[ $image_meta['width'] ] = 'full'; } if ( false !== strpos( $layout, 'large' ) ) { $width = Avada()->layout->get_content_width(); } elseif ( 'timeline' == $layout ) { $width = Avada()->layout->get_content_width() * 0.8 / $columns; } else { $width = Avada()->layout->get_content_width(); if ( isset( self::$grid_image_meta['gutter_width'] ) ) { $width -= self::$grid_image_meta['gutter_width'] * ( $columns - 1 ); } $width = $width / $columns; } ksort( $sizes ); // Find closest size match. $image_size = null; $size_name = null; foreach ( $sizes as $size => $name ) { if ( null === $image_size || abs( $width - $image_size ) > abs( $size - $width ) ) { $image_size = $size; $size_name = $name; } } // Fallback to 'full' image size if no match was found or Internet Explorer is used. // @codingStandardsIgnoreStart if ( null == $size_name || '' == $size_name || $is_IE ) { $size_name = 'full'; } // @codingStandardsIgnoreEnd return $size_name; } /** * Setter function for the $grid_image_meta variable. * * @since 4.0 * * @param array $grid_image_meta Array containing layout and number of columns. * * @return void */ public function set_grid_image_meta( $grid_image_meta ) { self::$grid_image_meta = $grid_image_meta; } /** * Gets the attachment ID from the url. * * @param string $attachment_url The url of the attachment. * @return string The attachment ID */ public static function get_attachment_id_from_url( $attachment_url = '' ) { global $wpdb; $attachment_id = false; if ( '' == $attachment_url || ! is_string( $attachment_url ) ) { return ''; } $upload_dir_paths = wp_upload_dir(); $upload_dir_paths_baseurl = $upload_dir_paths['baseurl']; if ( substr( $attachment_url, 0, 2 ) == '//' ) { $upload_dir_paths_baseurl = Avada_Sanitize::get_url_with_correct_scheme( $upload_dir_paths_baseurl ); } // Make sure the upload path base directory exists in the attachment URL, to verify that we're working with a media library image. if ( false !== strpos( $attachment_url, $upload_dir_paths_baseurl ) ) { // If this is the URL of an auto-generated thumbnail, get the URL of the original image. $attachment_url = preg_replace( '/-\d+x\d+(?=\.(jpg|jpeg|png|gif|tiff|svg)$)/i', '', $attachment_url ); // Remove the upload path base directory from the attachment URL. $attachment_url = str_replace( $upload_dir_paths_baseurl . '/', '', $attachment_url ); // Run a custom database query to get the attachment ID from the modified attachment URL. $attachment_id = $wpdb->get_var( $wpdb->prepare( "SELECT wposts.ID FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta WHERE wposts.ID = wpostmeta.post_id AND wpostmeta.meta_key = '_wp_attached_file' AND wpostmeta.meta_value = '%s' AND wposts.post_type = 'attachment'", $attachment_url ) ); } return $attachment_id; } /** * Gets the most important attachment data from the url. * * @since 4.0 * @param string $attachment_url The url of the used attachment. * @return array/bool The attachment data of the image, false if the url is empty or attachment not found. */ public static function get_attachment_data_from_url( $attachment_url = '' ) { if ( '' == $attachment_url ) { return false; } $attachment_data['url'] = preg_replace( '/-\d+x\d+(?=\.(jpg|jpeg|png|gif)$)/i', '', $attachment_url ); $attachment_data['id'] = self::get_attachment_id_from_url( $attachment_data['url'] ); if ( ! $attachment_data['id'] ) { return false; } preg_match( '/\d+x\d+(?=\.(jpg|jpeg|png|gif)$)/i', $attachment_url, $matches ); if ( count( $matches ) > 0 ) { $dimensions = explode( 'x', $matches[0] ); $attachment_data['width'] = $dimensions[0]; $attachment_data['height'] = $dimensions[1]; } else { $attachment_src = wp_get_attachment_image_src( $attachment_data['id'], 'full' ); $attachment_data['width'] = $attachment_src[1]; $attachment_data['height'] = $attachment_src[2]; } $attachment_data['alt'] = get_post_field( '_wp_attachment_image_alt', $attachment_data['id'] ); $attachment_data['caption'] = get_post_field( 'post_excerpt', $attachment_data['id'] ); $attachment_data['title'] = get_post_field( 'post_title', $attachment_data['id'] ); return $attachment_data; } /** * Deletes the resized images when the original image is deleted from the Wordpress Media Library. * This is necessary in order to handle custom image sizes created from the Fusion_Image_Resizer class. * * @param int $post_id The post ID. */ function delete_resized_images( $post_id ) { // Get attachment image metadata. $metadata = wp_get_attachment_metadata( $post_id ); if ( ! $metadata ) { return; } // Do some bailing if we cannot continue. if ( ! isset( $metadata['file'] ) || ! isset( $metadata['image_meta']['resized_images'] ) ) { return; } $pathinfo = pathinfo( $metadata['file'] ); $resized_images = $metadata['image_meta']['resized_images']; // Get Wordpress uploads directory (and bail if it doesn't exist). $wp_upload_dir = wp_upload_dir(); $upload_dir = $wp_upload_dir['basedir']; if ( ! is_dir( $upload_dir ) ) { return; } // Delete the resized images. foreach ( $resized_images as $dims ) { // Get the resized images filename. $file = $upload_dir . '/' . $pathinfo['dirname'] . '/' . $pathinfo['filename'] . '-' . $dims . '.' . $pathinfo['extension']; // Delete the resized image. @unlink( $file ); } } /** * Gets the logo data (url, width, height ) for the specified option name * * @since 4.0 * @param string $logo_option_name The name of the logo option. * @return array The logo data. */ public function get_logo_data( $logo_option_name ) { $logo_data = array( 'url' => '', 'width' => '', 'height' => '', ); $logo_url = Avada_Sanitize::get_url_with_correct_scheme( Avada()->settings->get( $logo_option_name, 'url' ) ); if ( $logo_url ) { $logo_data['url'] = $logo_url; if ( false !== strpos( $logo_option_name, 'retina' ) ) { $logo_url = Avada_Sanitize::get_url_with_correct_scheme( Avada()->settings->get( str_replace( '_retina', '', $logo_option_name ), 'url' ) ); } $logo_attachment_data = self::get_attachment_data_from_url( $logo_url ); if ( $logo_attachment_data ) { $logo_data['width'] = $logo_attachment_data['width']; $logo_data['height'] = $logo_attachment_data['height']; } else { if ( function_exists( 'getimagesize' ) ) { $image_data = @getimagesize( 'https:' . $logo_data['url'] ); if ( ! $image_data ) { $image_data = @getimagesize( 'http:' . $logo_data['url'] ); } if ( $image_data ) { $logo_data['width'] = absint( $image_data[0] ); $logo_data['height'] = absint( $image_data[1] ); if ( false !== strpos( $logo_option_name, 'retina' ) ) { $logo_data['width'] = absint( $image_data[0] / 2 ); $logo_data['height'] = absint( $image_data[1] / 2 ); } } } } } return $logo_data; } } /* Omit closing PHP tag to avoid "Headers already sent" issues. */