Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93
/home/sportsfe.../httpdocs/clone/wp-conte.../plugins/wp-smush.../core/smush
File: class-smush-optimization.php
<?php
[0] Fix | Delete
[1] Fix | Delete
namespace Smush\Core\Smush;
[2] Fix | Delete
[3] Fix | Delete
use Smush\Core\Media\Media_Item;
[4] Fix | Delete
use Smush\Core\Media\Media_Item_Optimization;
[5] Fix | Delete
use Smush\Core\Media\Media_Item_Size;
[6] Fix | Delete
use Smush\Core\Media\Media_Item_Stats;
[7] Fix | Delete
use Smush\Core\Settings;
[8] Fix | Delete
use WP_Error;
[9] Fix | Delete
[10] Fix | Delete
/**
[11] Fix | Delete
* Smushes a media item and updates the stats.
[12] Fix | Delete
*/
[13] Fix | Delete
class Smush_Optimization extends Media_Item_Optimization {
[14] Fix | Delete
const KEY = 'smush_optimization';
[15] Fix | Delete
const SMUSH_META_KEY = 'wp-smpro-smush-data';
[16] Fix | Delete
const LOSSY_META_KEY = 'wp-smush-lossy';
[17] Fix | Delete
[18] Fix | Delete
/**
[19] Fix | Delete
* @var Media_Item_Stats
[20] Fix | Delete
*/
[21] Fix | Delete
private $stats;
[22] Fix | Delete
/**
[23] Fix | Delete
* @var Media_Item_Stats[]
[24] Fix | Delete
*/
[25] Fix | Delete
private $size_stats = array();
[26] Fix | Delete
/**
[27] Fix | Delete
* @var Media_Item
[28] Fix | Delete
*/
[29] Fix | Delete
private $media_item;
[30] Fix | Delete
/**
[31] Fix | Delete
* @var array
[32] Fix | Delete
*/
[33] Fix | Delete
private $smush_meta;
[34] Fix | Delete
/**
[35] Fix | Delete
* @var int
[36] Fix | Delete
*/
[37] Fix | Delete
private $keep_exif;
[38] Fix | Delete
/**
[39] Fix | Delete
* @var bool
[40] Fix | Delete
*/
[41] Fix | Delete
private $lossy_level;
[42] Fix | Delete
/**
[43] Fix | Delete
* @var string
[44] Fix | Delete
*/
[45] Fix | Delete
private $api_version;
[46] Fix | Delete
/**
[47] Fix | Delete
* @var Settings
[48] Fix | Delete
*/
[49] Fix | Delete
private $settings;
[50] Fix | Delete
[51] Fix | Delete
private $reset_properties = array(
[52] Fix | Delete
'stats',
[53] Fix | Delete
'size_stats',
[54] Fix | Delete
'smush_meta',
[55] Fix | Delete
'keep_exif',
[56] Fix | Delete
'lossy_level',
[57] Fix | Delete
'api_version',
[58] Fix | Delete
);
[59] Fix | Delete
/**
[60] Fix | Delete
* @var Smusher
[61] Fix | Delete
*/
[62] Fix | Delete
private $smusher;
[63] Fix | Delete
[64] Fix | Delete
public function __construct( $media_item ) {
[65] Fix | Delete
$this->media_item = $media_item;
[66] Fix | Delete
$this->settings = Settings::get_instance();
[67] Fix | Delete
$this->smusher = new Smusher();
[68] Fix | Delete
}
[69] Fix | Delete
[70] Fix | Delete
public function get_key() {
[71] Fix | Delete
return self::KEY;
[72] Fix | Delete
}
[73] Fix | Delete
[74] Fix | Delete
public function get_stats() {
[75] Fix | Delete
if ( is_null( $this->stats ) ) {
[76] Fix | Delete
$this->stats = $this->prepare_stats();
[77] Fix | Delete
}
[78] Fix | Delete
[79] Fix | Delete
return $this->stats;
[80] Fix | Delete
}
[81] Fix | Delete
[82] Fix | Delete
public function set_stats( $stats ) {
[83] Fix | Delete
$this->stats = $stats;
[84] Fix | Delete
}
[85] Fix | Delete
[86] Fix | Delete
private function get_meta_sizes() {
[87] Fix | Delete
$smush_meta = $this->get_smush_meta();
[88] Fix | Delete
[89] Fix | Delete
return empty( $smush_meta['sizes'] )
[90] Fix | Delete
? array()
[91] Fix | Delete
: $smush_meta['sizes'];
[92] Fix | Delete
}
[93] Fix | Delete
[94] Fix | Delete
private function get_size_meta( $size_key ) {
[95] Fix | Delete
$sizes = $this->get_meta_sizes();
[96] Fix | Delete
$size = empty( $sizes[ $size_key ] )
[97] Fix | Delete
? array()
[98] Fix | Delete
: (array) $sizes[ $size_key ];
[99] Fix | Delete
[100] Fix | Delete
return empty( $size ) ? array() : $size;
[101] Fix | Delete
}
[102] Fix | Delete
[103] Fix | Delete
private function size_meta_exists( $size_key ) {
[104] Fix | Delete
return ! empty( $this->get_size_meta( $size_key ) );
[105] Fix | Delete
}
[106] Fix | Delete
[107] Fix | Delete
public function get_size_stats( $size_key ) {
[108] Fix | Delete
if ( empty( $this->size_stats[ $size_key ] ) ) {
[109] Fix | Delete
$this->size_stats[ $size_key ] = $this->prepare_size_stats( $size_key );
[110] Fix | Delete
}
[111] Fix | Delete
[112] Fix | Delete
return $this->size_stats[ $size_key ];
[113] Fix | Delete
}
[114] Fix | Delete
[115] Fix | Delete
private function prepare_size_stats( $size_key ) {
[116] Fix | Delete
$stats = new Media_Item_Stats();
[117] Fix | Delete
$stats->from_array( $this->get_size_meta( $size_key ) );
[118] Fix | Delete
[119] Fix | Delete
return $stats;
[120] Fix | Delete
}
[121] Fix | Delete
[122] Fix | Delete
public function save() {
[123] Fix | Delete
$meta = $this->make_smush_meta();
[124] Fix | Delete
if ( ! empty( $meta ) ) {
[125] Fix | Delete
update_post_meta( $this->media_item->get_id(), self::SMUSH_META_KEY, $meta );
[126] Fix | Delete
// TODO: the separate lossy meta is only necessary for the backup global stats, if enough time has passed and enough people have moved to the new stats then we can remove it
[127] Fix | Delete
if ( $this->get_lossy_level() ) {
[128] Fix | Delete
update_post_meta( $this->media_item->get_id(), self::LOSSY_META_KEY, 1 );
[129] Fix | Delete
} else {
[130] Fix | Delete
delete_post_meta( $this->media_item->get_id(), self::LOSSY_META_KEY );
[131] Fix | Delete
}
[132] Fix | Delete
$this->reset();
[133] Fix | Delete
}
[134] Fix | Delete
}
[135] Fix | Delete
[136] Fix | Delete
public function is_optimized() {
[137] Fix | Delete
return ! $this->get_stats()->is_empty();
[138] Fix | Delete
}
[139] Fix | Delete
[140] Fix | Delete
public function should_optimize() {
[141] Fix | Delete
if ( $this->media_item->is_skipped() || $this->media_item->has_errors() ) {
[142] Fix | Delete
return false;
[143] Fix | Delete
}
[144] Fix | Delete
[145] Fix | Delete
return ! empty( $this->get_sizes_to_smush() );
[146] Fix | Delete
}
[147] Fix | Delete
[148] Fix | Delete
public function should_reoptimize() {
[149] Fix | Delete
return $this->should_resmush();
[150] Fix | Delete
}
[151] Fix | Delete
[152] Fix | Delete
public function optimize() {
[153] Fix | Delete
if ( ! $this->should_optimize() ) {
[154] Fix | Delete
return false;
[155] Fix | Delete
}
[156] Fix | Delete
[157] Fix | Delete
$media_item = $this->media_item;
[158] Fix | Delete
$file_paths = array_map( function ( $size ) {
[159] Fix | Delete
return $size->get_file_path();
[160] Fix | Delete
}, $this->get_sizes_to_smush() );
[161] Fix | Delete
$responses = $this->smusher->smush( $file_paths, ! $media_item->is_large() );
[162] Fix | Delete
$success_responses = array_filter( $responses );
[163] Fix | Delete
if ( count( $success_responses ) !== count( $responses ) ) {
[164] Fix | Delete
return false;
[165] Fix | Delete
}
[166] Fix | Delete
[167] Fix | Delete
$media_item_stats = $this->create_media_item_stats_instance();
[168] Fix | Delete
foreach ( $responses as $size_key => $data ) {
[169] Fix | Delete
$this->update_from_response( $size_key, $data, $media_item_stats );
[170] Fix | Delete
}
[171] Fix | Delete
$this->set_stats( $media_item_stats );
[172] Fix | Delete
[173] Fix | Delete
if ( $media_item_stats->get_bytes() >= 0 ) {
[174] Fix | Delete
do_action( 'wp_smush_image_optimised',
[175] Fix | Delete
$this->media_item->get_id(),
[176] Fix | Delete
$this->make_smush_meta(),
[177] Fix | Delete
$this->media_item->get_wp_metadata()
[178] Fix | Delete
);
[179] Fix | Delete
}
[180] Fix | Delete
[181] Fix | Delete
// Update media item
[182] Fix | Delete
$media_item->save();
[183] Fix | Delete
[184] Fix | Delete
// Update smush meta
[185] Fix | Delete
$this->save();
[186] Fix | Delete
[187] Fix | Delete
return true;
[188] Fix | Delete
}
[189] Fix | Delete
[190] Fix | Delete
private function prepare_stats() {
[191] Fix | Delete
$smush_meta = $this->get_smush_meta();
[192] Fix | Delete
$stats = $this->create_media_item_stats_instance();
[193] Fix | Delete
$stats_data = empty( $smush_meta['stats'] )
[194] Fix | Delete
? array()
[195] Fix | Delete
: $smush_meta['stats'];
[196] Fix | Delete
$stats->from_array( $stats_data );
[197] Fix | Delete
$stats->set_lossy( (bool) $this->get_lossy_level() );
[198] Fix | Delete
[199] Fix | Delete
return $stats;
[200] Fix | Delete
}
[201] Fix | Delete
[202] Fix | Delete
private function get_smush_meta() {
[203] Fix | Delete
if ( is_null( $this->smush_meta ) ) {
[204] Fix | Delete
$this->smush_meta = $this->fetch_smush_meta();
[205] Fix | Delete
}
[206] Fix | Delete
[207] Fix | Delete
return $this->smush_meta;
[208] Fix | Delete
}
[209] Fix | Delete
[210] Fix | Delete
private function fetch_smush_meta() {
[211] Fix | Delete
$post_meta = get_post_meta( $this->media_item->get_id(), self::SMUSH_META_KEY, true );
[212] Fix | Delete
[213] Fix | Delete
return empty( $post_meta ) || ! is_array( $post_meta )
[214] Fix | Delete
? array()
[215] Fix | Delete
: $post_meta;
[216] Fix | Delete
}
[217] Fix | Delete
[218] Fix | Delete
public function keep_exif() {
[219] Fix | Delete
if ( is_null( $this->keep_exif ) ) {
[220] Fix | Delete
$this->keep_exif = $this->prepare_keep_exif();
[221] Fix | Delete
}
[222] Fix | Delete
[223] Fix | Delete
return $this->keep_exif;
[224] Fix | Delete
}
[225] Fix | Delete
[226] Fix | Delete
private function prepare_keep_exif() {
[227] Fix | Delete
$smush_meta = $this->get_smush_meta();
[228] Fix | Delete
[229] Fix | Delete
return isset( $smush_meta['stats']['keep_exif'] )
[230] Fix | Delete
? (int) $smush_meta['stats']['keep_exif']
[231] Fix | Delete
: 0;
[232] Fix | Delete
}
[233] Fix | Delete
[234] Fix | Delete
public function set_keep_exif( $keep_exif ) {
[235] Fix | Delete
$this->keep_exif = (int) $keep_exif;
[236] Fix | Delete
}
[237] Fix | Delete
[238] Fix | Delete
public function get_lossy_level() {
[239] Fix | Delete
if ( is_null( $this->lossy_level ) ) {
[240] Fix | Delete
$this->lossy_level = $this->prepare_lossy_level();
[241] Fix | Delete
}
[242] Fix | Delete
[243] Fix | Delete
return $this->lossy_level;
[244] Fix | Delete
}
[245] Fix | Delete
[246] Fix | Delete
private function prepare_lossy_level() {
[247] Fix | Delete
$smush_meta = $this->get_smush_meta();
[248] Fix | Delete
[249] Fix | Delete
return empty( $smush_meta['stats']['lossy'] )
[250] Fix | Delete
? 0
[251] Fix | Delete
: (int) $smush_meta['stats']['lossy'];
[252] Fix | Delete
}
[253] Fix | Delete
[254] Fix | Delete
public function set_lossy_level( $lossy ) {
[255] Fix | Delete
$this->lossy_level = (int) $lossy;
[256] Fix | Delete
}
[257] Fix | Delete
[258] Fix | Delete
public function get_api_version() {
[259] Fix | Delete
if ( is_null( $this->api_version ) ) {
[260] Fix | Delete
$this->api_version = $this->prepare_api_version();
[261] Fix | Delete
}
[262] Fix | Delete
[263] Fix | Delete
return $this->api_version;
[264] Fix | Delete
}
[265] Fix | Delete
[266] Fix | Delete
private function prepare_api_version() {
[267] Fix | Delete
$smush_meta = $this->get_smush_meta();
[268] Fix | Delete
[269] Fix | Delete
return empty( $smush_meta['stats']['api_version'] )
[270] Fix | Delete
? ''
[271] Fix | Delete
: $smush_meta['stats']['api_version'];
[272] Fix | Delete
}
[273] Fix | Delete
[274] Fix | Delete
public function set_api_version( $api_version ) {
[275] Fix | Delete
$this->api_version = $api_version;
[276] Fix | Delete
}
[277] Fix | Delete
[278] Fix | Delete
private function make_smush_meta() {
[279] Fix | Delete
$smush_meta = $this->get_smush_meta();
[280] Fix | Delete
[281] Fix | Delete
// Stats
[282] Fix | Delete
$media_item_stats = $this->get_stats();
[283] Fix | Delete
if ( ! $media_item_stats->is_empty() ) {
[284] Fix | Delete
$smush_meta['stats'] = array_merge(
[285] Fix | Delete
empty( $smush_meta['stats'] ) ? array() : $smush_meta['stats'],
[286] Fix | Delete
$media_item_stats->to_array(),
[287] Fix | Delete
array(
[288] Fix | Delete
'keep_exif' => $this->keep_exif(),
[289] Fix | Delete
'lossy' => $this->get_lossy_level(),
[290] Fix | Delete
'api_version' => $this->get_api_version(),
[291] Fix | Delete
)
[292] Fix | Delete
);
[293] Fix | Delete
}
[294] Fix | Delete
[295] Fix | Delete
// Sizes
[296] Fix | Delete
foreach ( $this->size_stats as $size_key => $size_stats ) {
[297] Fix | Delete
if ( ! $size_stats->is_empty() ) {
[298] Fix | Delete
$smush_meta['sizes'][ $size_key ] = (object) $size_stats->to_array();
[299] Fix | Delete
}
[300] Fix | Delete
}
[301] Fix | Delete
[302] Fix | Delete
return $smush_meta;
[303] Fix | Delete
}
[304] Fix | Delete
[305] Fix | Delete
private function should_resmush() {
[306] Fix | Delete
if ( ! $this->should_optimize() ) {
[307] Fix | Delete
return false;
[308] Fix | Delete
}
[309] Fix | Delete
[310] Fix | Delete
if ( $this->is_next_level_available() ) {
[311] Fix | Delete
return true;
[312] Fix | Delete
}
[313] Fix | Delete
[314] Fix | Delete
if ( $this->settings->get( 'strip_exif' ) && $this->keep_exif() ) {
[315] Fix | Delete
return true;
[316] Fix | Delete
}
[317] Fix | Delete
[318] Fix | Delete
foreach ( $this->get_sizes_to_smush() as $size_key => $size ) {
[319] Fix | Delete
$is_smushed = $this->size_meta_exists( $size_key ) || $this->is_file_smushed( $size->get_file_path() );
[320] Fix | Delete
if ( ! $is_smushed ) {
[321] Fix | Delete
return true;
[322] Fix | Delete
}
[323] Fix | Delete
}
[324] Fix | Delete
[325] Fix | Delete
return false;
[326] Fix | Delete
}
[327] Fix | Delete
[328] Fix | Delete
public function is_next_level_available() {
[329] Fix | Delete
$current_lossy_level = $this->get_lossy_level();
[330] Fix | Delete
$required_lossy_level = $this->settings->get_lossy_level_setting();
[331] Fix | Delete
[332] Fix | Delete
return $current_lossy_level < $required_lossy_level;
[333] Fix | Delete
}
[334] Fix | Delete
[335] Fix | Delete
private function is_file_smushed( $file_path ) {
[336] Fix | Delete
foreach ( $this->media_item->get_sizes() as $size_key => $size ) {
[337] Fix | Delete
if ( $size->get_file_path() === $file_path && $this->size_meta_exists( $size_key ) ) {
[338] Fix | Delete
return true;
[339] Fix | Delete
}
[340] Fix | Delete
}
[341] Fix | Delete
[342] Fix | Delete
return false;
[343] Fix | Delete
}
[344] Fix | Delete
[345] Fix | Delete
/**
[346] Fix | Delete
* @param $size_key
[347] Fix | Delete
* @param object $data
[348] Fix | Delete
* @param $media_item_stats Smush_Media_Item_Stats
[349] Fix | Delete
*/
[350] Fix | Delete
private function update_from_response( $size_key, $data, $media_item_stats ) {
[351] Fix | Delete
$size_stats = $this->get_size_stats( $size_key );
[352] Fix | Delete
[353] Fix | Delete
$this->set_api_version( $data->api_version );
[354] Fix | Delete
$this->set_lossy_level( (int) $data->lossy );
[355] Fix | Delete
$this->set_keep_exif( empty( $data->keep_exif ) ? 0 : $data->keep_exif );
[356] Fix | Delete
[357] Fix | Delete
// Update the size stats
[358] Fix | Delete
$size_stats->from_array( $this->size_stats_from_response( $size_stats, $data ) );
[359] Fix | Delete
[360] Fix | Delete
// Add the size stats to the media item stats
[361] Fix | Delete
$media_item_stats->add( $size_stats );
[362] Fix | Delete
// TODO: maybe remove the lossy count from smush stats
[363] Fix | Delete
$media_item_stats->set_lossy( (bool) $this->get_lossy_level() );
[364] Fix | Delete
}
[365] Fix | Delete
[366] Fix | Delete
/**
[367] Fix | Delete
* @param $existing_stats Media_Item_Stats
[368] Fix | Delete
* @param $data
[369] Fix | Delete
*
[370] Fix | Delete
* @return array
[371] Fix | Delete
*/
[372] Fix | Delete
private function size_stats_from_response( $existing_stats, $data ) {
[373] Fix | Delete
$size_before = max( $existing_stats->get_size_before(), $data->before_size ); // We want to use the oldest before size
[374] Fix | Delete
[375] Fix | Delete
return array(
[376] Fix | Delete
'size_before' => $size_before,
[377] Fix | Delete
'size_after' => $data->after_size,
[378] Fix | Delete
'time' => $data->time,
[379] Fix | Delete
);
[380] Fix | Delete
}
[381] Fix | Delete
[382] Fix | Delete
/**
[383] Fix | Delete
* @return WP_Error
[384] Fix | Delete
*/
[385] Fix | Delete
public function get_errors() {
[386] Fix | Delete
return $this->get_smusher()->get_errors();
[387] Fix | Delete
}
[388] Fix | Delete
[389] Fix | Delete
protected function reset() {
[390] Fix | Delete
foreach ( $this->reset_properties as $property ) {
[391] Fix | Delete
$this->$property = null;
[392] Fix | Delete
}
[393] Fix | Delete
}
[394] Fix | Delete
[395] Fix | Delete
public function delete_data() {
[396] Fix | Delete
delete_post_meta( $this->media_item->get_id(), self::SMUSH_META_KEY );
[397] Fix | Delete
[398] Fix | Delete
$this->reset();
[399] Fix | Delete
}
[400] Fix | Delete
[401] Fix | Delete
/**
[402] Fix | Delete
* @param $size Media_Item_Size
[403] Fix | Delete
*
[404] Fix | Delete
* @return bool
[405] Fix | Delete
*/
[406] Fix | Delete
public function should_optimize_size( $size ) {
[407] Fix | Delete
if ( ! $this->should_optimize() ) {
[408] Fix | Delete
return false;
[409] Fix | Delete
}
[410] Fix | Delete
[411] Fix | Delete
return array_key_exists(
[412] Fix | Delete
$size->get_key(),
[413] Fix | Delete
$this->get_sizes_to_smush()
[414] Fix | Delete
);
[415] Fix | Delete
}
[416] Fix | Delete
[417] Fix | Delete
/**
[418] Fix | Delete
* @return Media_Item_Size[]
[419] Fix | Delete
*/
[420] Fix | Delete
private function get_sizes_to_smush() {
[421] Fix | Delete
return $this->media_item->get_smushable_sizes();
[422] Fix | Delete
}
[423] Fix | Delete
[424] Fix | Delete
/**
[425] Fix | Delete
* @return Smusher
[426] Fix | Delete
*/
[427] Fix | Delete
public function get_smusher() {
[428] Fix | Delete
return $this->smusher;
[429] Fix | Delete
}
[430] Fix | Delete
[431] Fix | Delete
/**
[432] Fix | Delete
* @return Smush_Media_Item_Stats
[433] Fix | Delete
*/
[434] Fix | Delete
private function create_media_item_stats_instance() {
[435] Fix | Delete
return new Smush_Media_Item_Stats();
[436] Fix | Delete
}
[437] Fix | Delete
[438] Fix | Delete
public function get_optimized_sizes_count() {
[439] Fix | Delete
$count = 0;
[440] Fix | Delete
$sizes = $this->get_sizes_to_smush();
[441] Fix | Delete
foreach ( $sizes as $size_key => $size ) {
[442] Fix | Delete
$size_stats = $this->get_size_stats( $size_key );
[443] Fix | Delete
if ( $size_stats && ! $size_stats->is_empty() ) {
[444] Fix | Delete
$count ++;
[445] Fix | Delete
}
[446] Fix | Delete
}
[447] Fix | Delete
[448] Fix | Delete
return $count;
[449] Fix | Delete
}
[450] Fix | Delete
}
[451] Fix | Delete
[452] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function