Edit File by line
/home/zeestwma/ajeebong.../wp-conte.../plugins/image-op.../modules/core
File: module.php
<?php
[0] Fix | Delete
namespace ImageOptimization\Modules\Core;
[1] Fix | Delete
[2] Fix | Delete
use ImageOptimization\Modules\Optimization\{
[3] Fix | Delete
Classes\Validate_Image,
[4] Fix | Delete
Rest\Cancel_Bulk_Optimization,
[5] Fix | Delete
Rest\Optimize_Bulk,
[6] Fix | Delete
};
[7] Fix | Delete
use ImageOptimization\Modules\Settings\Classes\Settings;
[8] Fix | Delete
use ImageOptimization\Modules\Backups\Rest\{
[9] Fix | Delete
Restore_All,
[10] Fix | Delete
Remove_Backups,
[11] Fix | Delete
};
[12] Fix | Delete
use ImageOptimization\Classes\{
[13] Fix | Delete
Async_Operation\Async_Operation,
[14] Fix | Delete
Async_Operation\Async_Operation_Queue,
[15] Fix | Delete
Async_Operation\Queries\Operation_Query,
[16] Fix | Delete
Image\Image_Meta,
[17] Fix | Delete
Image\Image_Optimization_Error_Type,
[18] Fix | Delete
Image\Image_Status,
[19] Fix | Delete
Migration\Migration_Manager,
[20] Fix | Delete
Module_Base,
[21] Fix | Delete
Utils,
[22] Fix | Delete
};
[23] Fix | Delete
[24] Fix | Delete
use ImageOptimization\Plugin;
[25] Fix | Delete
[26] Fix | Delete
if ( ! defined( 'ABSPATH' ) ) {
[27] Fix | Delete
exit; // Exit if accessed directly.
[28] Fix | Delete
}
[29] Fix | Delete
[30] Fix | Delete
class Module extends Module_Base {
[31] Fix | Delete
public function get_name(): string {
[32] Fix | Delete
return 'core';
[33] Fix | Delete
}
[34] Fix | Delete
[35] Fix | Delete
public static function component_list() : array {
[36] Fix | Delete
return [
[37] Fix | Delete
'Pointers',
[38] Fix | Delete
'Migrations',
[39] Fix | Delete
'Conflicts',
[40] Fix | Delete
'User_Feedback',
[41] Fix | Delete
'Not_Connected',
[42] Fix | Delete
'Not_Connected_Modal',
[43] Fix | Delete
'Renewal_Notice',
[44] Fix | Delete
];
[45] Fix | Delete
}
[46] Fix | Delete
[47] Fix | Delete
private function render_top_bar() {
[48] Fix | Delete
?>
[49] Fix | Delete
<div id="image-optimization-top-bar"></div>
[50] Fix | Delete
<?php
[51] Fix | Delete
}
[52] Fix | Delete
[53] Fix | Delete
private function render_app() {
[54] Fix | Delete
?>
[55] Fix | Delete
<div class="clear"></div>
[56] Fix | Delete
<div id="image-optimization-app"></div>
[57] Fix | Delete
<?php
[58] Fix | Delete
}
[59] Fix | Delete
[60] Fix | Delete
public function maybe_add_quota_reached_notice() {
[61] Fix | Delete
[62] Fix | Delete
// @var ImageOptimizer/Modules/ConnectManager/Module
[63] Fix | Delete
$module = Plugin::instance()->modules_manager->get_modules( 'connect-manager' );
[64] Fix | Delete
[65] Fix | Delete
if ( ! $module->connect_instance->get_connect_status() || $module->connect_instance->images_left() > 0 ) {
[66] Fix | Delete
return;
[67] Fix | Delete
}
[68] Fix | Delete
[69] Fix | Delete
?>
[70] Fix | Delete
<div class="notice notice-warning notice image-optimizer__notice image-optimizer__notice--warning">
[71] Fix | Delete
<p>
[72] Fix | Delete
<b>
[73] Fix | Delete
<?php esc_html_e(
[74] Fix | Delete
'You’ve reached your plan quota.',
[75] Fix | Delete
'image-optimization'
[76] Fix | Delete
); ?>
[77] Fix | Delete
</b>
[78] Fix | Delete
[79] Fix | Delete
<span>
[80] Fix | Delete
<?php esc_html_e(
[81] Fix | Delete
'You have no images left to optimize in your current plan.',
[82] Fix | Delete
'image-optimization'
[83] Fix | Delete
); ?>
[84] Fix | Delete
[85] Fix | Delete
<a href="https://go.elementor.com/io-quota-upgrade/">
[86] Fix | Delete
<?php esc_html_e(
[87] Fix | Delete
'Upgrade plan now',
[88] Fix | Delete
'image-optimization'
[89] Fix | Delete
); ?>
[90] Fix | Delete
</a>
[91] Fix | Delete
</span>
[92] Fix | Delete
</p>
[93] Fix | Delete
</div>
[94] Fix | Delete
<?php
[95] Fix | Delete
}
[96] Fix | Delete
[97] Fix | Delete
public function maybe_add_80_quota_reached_notice() {
[98] Fix | Delete
[99] Fix | Delete
// @var ImageOptimizer/Modules/ConnectManager/Module
[100] Fix | Delete
$module = Plugin::instance()->modules_manager->get_modules( 'connect-manager' );
[101] Fix | Delete
[102] Fix | Delete
$connect_status = $module->connect_instance->get_connect_status();
[103] Fix | Delete
[104] Fix | Delete
if ( ! isset( $connect_status->quota ) && ! isset( $connect_status->used_quota ) ) {
[105] Fix | Delete
return;
[106] Fix | Delete
}
[107] Fix | Delete
[108] Fix | Delete
$usage = $connect_status->used_quota / $connect_status->quota * 100;
[109] Fix | Delete
[110] Fix | Delete
if ( ! $module->connect_instance->get_connect_status() || ( $usage < 80 || $usage === 100 ) ) {
[111] Fix | Delete
return;
[112] Fix | Delete
}
[113] Fix | Delete
[114] Fix | Delete
?>
[115] Fix | Delete
<div class="notice notice-warning notice image-optimizer__notice image-optimizer__notice--warning">
[116] Fix | Delete
<p>
[117] Fix | Delete
<b>
[118] Fix | Delete
<?php esc_html_e(
[119] Fix | Delete
'You’ve used 80% of your plan quota.',
[120] Fix | Delete
'image-optimization'
[121] Fix | Delete
); ?>
[122] Fix | Delete
</b>
[123] Fix | Delete
[124] Fix | Delete
<span>
[125] Fix | Delete
<?php esc_html_e(
[126] Fix | Delete
'Upgrade now to avoid interruptions.',
[127] Fix | Delete
'image-optimization'
[128] Fix | Delete
); ?>
[129] Fix | Delete
[130] Fix | Delete
<a href="https://go.elementor.com/io-quota-upgrade/">
[131] Fix | Delete
<?php esc_html_e(
[132] Fix | Delete
'Upgrade plan now',
[133] Fix | Delete
'image-optimization'
[134] Fix | Delete
); ?>
[135] Fix | Delete
</a>
[136] Fix | Delete
</span>
[137] Fix | Delete
</p>
[138] Fix | Delete
</div>
[139] Fix | Delete
<?php
[140] Fix | Delete
}
[141] Fix | Delete
[142] Fix | Delete
public function maybe_add_url_mismatch_notice() {
[143] Fix | Delete
// @var ImageOptimizer/Modules/ConnectManager/Module
[144] Fix | Delete
$module = Plugin::instance()->modules_manager->get_modules( 'connect-manager' );
[145] Fix | Delete
[146] Fix | Delete
if ( $module->connect_instance->is_valid_home_url() ) {
[147] Fix | Delete
return;
[148] Fix | Delete
}
[149] Fix | Delete
[150] Fix | Delete
?>
[151] Fix | Delete
<div class="notice notice-error notice image-optimizer__notice image-optimizer__notice--error">
[152] Fix | Delete
<p>
[153] Fix | Delete
<b>
[154] Fix | Delete
<?php esc_html_e(
[155] Fix | Delete
'Your license key does not match your current domain, causing a mismatch.',
[156] Fix | Delete
'image-optimization'
[157] Fix | Delete
); ?>
[158] Fix | Delete
</b>
[159] Fix | Delete
[160] Fix | Delete
<span>
[161] Fix | Delete
<?php esc_html_e(
[162] Fix | Delete
'This is most likely due to a change in the domain URL of your site (including HTTP/SSL migration).',
[163] Fix | Delete
'image-optimization'
[164] Fix | Delete
); ?>
[165] Fix | Delete
[166] Fix | Delete
<button type="button" onclick="document.dispatchEvent( new Event( 'image-optimizer/auth/url-mismatch-modal/open' ) );">
[167] Fix | Delete
<?php esc_html_e(
[168] Fix | Delete
'Fix mismatched URL',
[169] Fix | Delete
'image-optimization'
[170] Fix | Delete
); ?>
[171] Fix | Delete
</button>
[172] Fix | Delete
</span>
[173] Fix | Delete
</p>
[174] Fix | Delete
</div>
[175] Fix | Delete
<?php
[176] Fix | Delete
}
[177] Fix | Delete
[178] Fix | Delete
public function add_plugin_links( $links, $plugin_file_name ): array {
[179] Fix | Delete
if ( ! str_ends_with( $plugin_file_name, '/image-optimization.php' ) ) {
[180] Fix | Delete
return (array) $links;
[181] Fix | Delete
}
[182] Fix | Delete
[183] Fix | Delete
$custom_links = [
[184] Fix | Delete
'settings' => sprintf(
[185] Fix | Delete
'<a href="%s">%s</a>',
[186] Fix | Delete
admin_url( 'admin.php?page=' . \ImageOptimization\Modules\Settings\Module::SETTING_BASE_SLUG ),
[187] Fix | Delete
esc_html__( 'Settings', 'image-optimization' )
[188] Fix | Delete
),
[189] Fix | Delete
];
[190] Fix | Delete
// @var ImageOptimizer/Modules/ConnectManager/Module
[191] Fix | Delete
$module = Plugin::instance()->modules_manager->get_modules( 'connect-manager' );
[192] Fix | Delete
[193] Fix | Delete
if ( $module->connect_instance->is_connected() ) {
[194] Fix | Delete
$custom_links['upgrade'] = sprintf(
[195] Fix | Delete
'<a href="%s" style="color: #524CFF; font-weight: 700;" target="_blank" rel="noopener noreferrer">%s</a>',
[196] Fix | Delete
'https://go.elementor.com/io-plugins-upgrade/',
[197] Fix | Delete
esc_html__( 'Upgrade', 'image-optimization' )
[198] Fix | Delete
);
[199] Fix | Delete
} else {
[200] Fix | Delete
$custom_links['connect'] = sprintf(
[201] Fix | Delete
'<a href="%s" style="color: #524CFF; font-weight: 700;">%s</a>',
[202] Fix | Delete
admin_url( 'admin.php?page=' . \ImageOptimization\Modules\Settings\Module::SETTING_BASE_SLUG ),
[203] Fix | Delete
esc_html__( 'Connect', 'image-optimization' )
[204] Fix | Delete
);
[205] Fix | Delete
}
[206] Fix | Delete
[207] Fix | Delete
return array_merge( $custom_links, $links );
[208] Fix | Delete
}
[209] Fix | Delete
[210] Fix | Delete
public function enqueue_global_assets() {
[211] Fix | Delete
wp_enqueue_style(
[212] Fix | Delete
'image-optimization-admin-fonts',
[213] Fix | Delete
'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap',
[214] Fix | Delete
[],
[215] Fix | Delete
IMAGE_OPTIMIZATION_VERSION
[216] Fix | Delete
);
[217] Fix | Delete
[218] Fix | Delete
wp_enqueue_style(
[219] Fix | Delete
'image-optimization-core-style-admin',
[220] Fix | Delete
$this->get_css_assets_url( 'style-admin', 'assets/build/' ),
[221] Fix | Delete
[],
[222] Fix | Delete
IMAGE_OPTIMIZATION_VERSION,
[223] Fix | Delete
);
[224] Fix | Delete
}
[225] Fix | Delete
[226] Fix | Delete
/**
[227] Fix | Delete
* Enqueue styles and scripts
[228] Fix | Delete
*/
[229] Fix | Delete
private function enqueue_scripts() {
[230] Fix | Delete
$asset_file = require IMAGE_OPTIMIZATION_ASSETS_PATH . 'build/admin.asset.php';
[231] Fix | Delete
[232] Fix | Delete
foreach ( $asset_file['dependencies'] as $style ) {
[233] Fix | Delete
wp_enqueue_style( $style );
[234] Fix | Delete
}
[235] Fix | Delete
[236] Fix | Delete
wp_enqueue_script(
[237] Fix | Delete
'image-optimization-admin',
[238] Fix | Delete
$this->get_js_assets_url( 'admin' ),
[239] Fix | Delete
array_merge( $asset_file['dependencies'], [ 'wp-util' ] ),
[240] Fix | Delete
$asset_file['version'],
[241] Fix | Delete
true
[242] Fix | Delete
);
[243] Fix | Delete
[244] Fix | Delete
wp_localize_script(
[245] Fix | Delete
'image-optimization-admin',
[246] Fix | Delete
'imageOptimizerAppSettings',
[247] Fix | Delete
[
[248] Fix | Delete
'siteUrl' => wp_parse_url( get_site_url(), PHP_URL_HOST ),
[249] Fix | Delete
'thumbnailSizes' => wp_get_registered_image_subsizes(),
[250] Fix | Delete
'isDevelopment' => defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG,
[251] Fix | Delete
]
[252] Fix | Delete
);
[253] Fix | Delete
[254] Fix | Delete
/**
[255] Fix | Delete
* @var ImageOptimizer\Modules\ConnectManager\Module $module
[256] Fix | Delete
*/
[257] Fix | Delete
$module = Plugin::instance()->modules_manager->get_modules( 'connect-manager' );
[258] Fix | Delete
$is_connect_on_fly = $module->connect_instance->get_is_connect_on_fly();
[259] Fix | Delete
$connect_email = $module->connect_instance->get_connect_data()['user']['email'] ?? null;
[260] Fix | Delete
$show_reset = ! $module->connect_instance->is_connected()
[261] Fix | Delete
&& ( $module->connect_instance->get_client_id() || $module->connect_instance->get_client_secret() );
[262] Fix | Delete
[263] Fix | Delete
wp_localize_script(
[264] Fix | Delete
'image-optimization-admin',
[265] Fix | Delete
'imageOptimizerUserData',
[266] Fix | Delete
[
[267] Fix | Delete
'isConnectOnFly' => $is_connect_on_fly,
[268] Fix | Delete
'isConnected' => $module->connect_instance->is_connected(),
[269] Fix | Delete
'isActivated' => $module->connect_instance->is_activated(),
[270] Fix | Delete
'isUrlMismatch' => ! $module->connect_instance->is_valid_home_url(),
[271] Fix | Delete
'planData' => $module->connect_instance->is_activated() ? $module->connect_instance->get_connect_status() : null,
[272] Fix | Delete
'licenseKey' => $module->connect_instance->is_activated() ? $module->connect_instance->get_activation_state() : null,
[273] Fix | Delete
'imagesLeft' => $module->connect_instance->is_activated() ? $module->connect_instance->images_left() : null,
[274] Fix | Delete
'isOwner' => $module->connect_instance->is_connected() ? $module->connect_instance->user_is_subscription_owner() : null,
[275] Fix | Delete
'subscriptionEmail' => $connect_email ? $connect_email : null,
[276] Fix | Delete
'showResetButton' => $show_reset,
[277] Fix | Delete
'maxFileSize' => Validate_Image::get_max_file_size(),
[278] Fix | Delete
'helpVideos' => Settings::get( Settings::HELP_VIDEOS ),
[279] Fix | Delete
[280] Fix | Delete
'wpRestNonce' => wp_create_nonce( 'wp_rest' ),
[281] Fix | Delete
'disconnect' => wp_create_nonce( 'wp_rest' ),
[282] Fix | Delete
'authInitNonce' => wp_create_nonce( $module->connect_instance->connect_init_nonce() ),
[283] Fix | Delete
'authDisconnectNonce' => wp_create_nonce( $module->connect_instance->disconnect_nonce() ),
[284] Fix | Delete
'authDeactivateNonce' => wp_create_nonce( $module->connect_instance->deactivate_nonce() ),
[285] Fix | Delete
'authGetSubscriptionsNonce' => wp_create_nonce( $module->connect_instance->get_subscriptions_nonce() ),
[286] Fix | Delete
'authActivateNonce' => wp_create_nonce( $module->connect_instance->activate_nonce() ),
[287] Fix | Delete
'versionNonce' => wp_create_nonce( $module->connect_instance->version_nonce() ),
[288] Fix | Delete
'removeBackupsNonce' => wp_create_nonce( Remove_Backups::NONCE_NAME ),
[289] Fix | Delete
'restoreAllImagesNonce' => wp_create_nonce( Restore_All::NONCE_NAME ),
[290] Fix | Delete
'optimizeBulkNonce' => wp_create_nonce( Optimize_Bulk::NONCE_NAME ),
[291] Fix | Delete
'cancelBulkOptimizationNonce' => wp_create_nonce( Cancel_Bulk_Optimization::NONCE_NAME ),
[292] Fix | Delete
]
[293] Fix | Delete
);
[294] Fix | Delete
[295] Fix | Delete
wp_set_script_translations( 'image-optimization-admin', 'image-optimization' );
[296] Fix | Delete
}
[297] Fix | Delete
[298] Fix | Delete
private function should_render(): bool {
[299] Fix | Delete
return ( Utils::is_media_page() || Utils::is_plugin_page() ) && Utils::user_is_admin();
[300] Fix | Delete
}
[301] Fix | Delete
[302] Fix | Delete
public static function on_deactivation(): void {
[303] Fix | Delete
$optimization_query = ( new Operation_Query() )
[304] Fix | Delete
->set_queue( Async_Operation_Queue::OPTIMIZE )
[305] Fix | Delete
->set_status( [ Async_Operation::OPERATION_STATUS_PENDING, Async_Operation::OPERATION_STATUS_RUNNING ] )
[306] Fix | Delete
->set_limit( -1 );
[307] Fix | Delete
[308] Fix | Delete
$restoring_query = ( new Operation_Query() )
[309] Fix | Delete
->set_queue( Async_Operation_Queue::RESTORE )
[310] Fix | Delete
->set_status( [ Async_Operation::OPERATION_STATUS_PENDING, Async_Operation::OPERATION_STATUS_RUNNING ] )
[311] Fix | Delete
->set_limit( -1 );
[312] Fix | Delete
[313] Fix | Delete
$optimization_operations = Async_Operation::get( $optimization_query );
[314] Fix | Delete
$restoring_operations = Async_Operation::get( $restoring_query );
[315] Fix | Delete
[316] Fix | Delete
foreach ( $optimization_operations as $operation ) {
[317] Fix | Delete
$image_id = $operation->get_args()['attachment_id'];
[318] Fix | Delete
[319] Fix | Delete
if ( ! $image_id ) {
[320] Fix | Delete
continue;
[321] Fix | Delete
}
[322] Fix | Delete
[323] Fix | Delete
Async_Operation::remove( [ $operation->get_id() ] );
[324] Fix | Delete
[325] Fix | Delete
$image_meta = new Image_Meta( $image_id );
[326] Fix | Delete
[327] Fix | Delete
if ( empty( $image_meta->get_optimized_sizes() ) ) {
[328] Fix | Delete
$image_meta->delete();
[329] Fix | Delete
} else {
[330] Fix | Delete
$image_meta
[331] Fix | Delete
->set_status( Image_Status::OPTIMIZATION_FAILED )
[332] Fix | Delete
->set_error_type( Image_Optimization_Error_Type::PLUGIN_DEACTIVATION )
[333] Fix | Delete
->save();
[334] Fix | Delete
}
[335] Fix | Delete
}
[336] Fix | Delete
[337] Fix | Delete
foreach ( $restoring_operations as $operation ) {
[338] Fix | Delete
$image_id = $operation->get_args()['attachment_id'];
[339] Fix | Delete
[340] Fix | Delete
if ( ! $image_id ) {
[341] Fix | Delete
continue;
[342] Fix | Delete
}
[343] Fix | Delete
[344] Fix | Delete
Async_Operation::remove( [ $operation->get_id() ] );
[345] Fix | Delete
[346] Fix | Delete
$image_meta = new Image_Meta( $image_id );
[347] Fix | Delete
[348] Fix | Delete
$image_meta
[349] Fix | Delete
->set_status( Image_Status::RESTORING_FAILED )
[350] Fix | Delete
->set_error_type( Image_Optimization_Error_Type::PLUGIN_DEACTIVATION )
[351] Fix | Delete
->save();
[352] Fix | Delete
}
[353] Fix | Delete
}
[354] Fix | Delete
[355] Fix | Delete
/**
[356] Fix | Delete
* Renders the Bulk Optimization link on the media pages.
[357] Fix | Delete
*
[358] Fix | Delete
* @return void
[359] Fix | Delete
*/
[360] Fix | Delete
public function add_bulk_optimization_links(): void {
[361] Fix | Delete
$page_url = add_query_arg(
[362] Fix | Delete
[ 'page' => 'image-optimization-bulk-optimization' ],
[363] Fix | Delete
admin_url( 'upload.php' )
[364] Fix | Delete
);
[365] Fix | Delete
[366] Fix | Delete
?>
[367] Fix | Delete
<script>
[368] Fix | Delete
document.addEventListener( 'DOMContentLoaded', function () {
[369] Fix | Delete
// Grid media is rendered by JS, so the timeout is required
[370] Fix | Delete
setTimeout( () => {
[371] Fix | Delete
const targetButton = document.querySelector( '.filter-items .actions input[type=submit]' ) ||
[372] Fix | Delete
document.querySelector( '.media-toolbar-secondary .select-mode-toggle-button' );
[373] Fix | Delete
[374] Fix | Delete
if ( targetButton ) {
[375] Fix | Delete
const link = document.createElement('a');
[376] Fix | Delete
[377] Fix | Delete
link.href = '<?php echo esc_js( $page_url ); ?>';
[378] Fix | Delete
link.innerText = '<?php echo esc_js( __( 'Bulk Optimization', 'image-optimization' ) ); ?>';
[379] Fix | Delete
link.className = 'button is-primary image-optimizer__button image-optimizer__button--pink';
[380] Fix | Delete
[381] Fix | Delete
targetButton.insertAdjacentElement( 'afterend', link );
[382] Fix | Delete
}
[383] Fix | Delete
}, 100 )
[384] Fix | Delete
} );
[385] Fix | Delete
</script>
[386] Fix | Delete
<?php
[387] Fix | Delete
}
[388] Fix | Delete
[389] Fix | Delete
/**
[390] Fix | Delete
* Module constructor.
[391] Fix | Delete
*/
[392] Fix | Delete
public function __construct() {
[393] Fix | Delete
$this->register_components();
[394] Fix | Delete
[395] Fix | Delete
add_action( 'action_scheduler_init', [ Migration_Manager::class, 'init' ] );
[396] Fix | Delete
[397] Fix | Delete
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_global_assets' ] );
[398] Fix | Delete
add_filter( 'plugin_action_links', [ $this, 'add_plugin_links' ], 10, 2 );
[399] Fix | Delete
[400] Fix | Delete
add_action('current_screen', function () {
[401] Fix | Delete
if ( ! $this->should_render() ) {
[402] Fix | Delete
return;
[403] Fix | Delete
}
[404] Fix | Delete
[405] Fix | Delete
add_action( 'admin_notices', [ $this, 'maybe_add_quota_reached_notice' ] );
[406] Fix | Delete
add_action( 'admin_notices', [ $this, 'maybe_add_80_quota_reached_notice' ] );
[407] Fix | Delete
add_action( 'admin_notices', [ $this, 'maybe_add_url_mismatch_notice' ] );
[408] Fix | Delete
[409] Fix | Delete
if ( Utils::is_media_page() ) {
[410] Fix | Delete
add_action('in_admin_header', function () {
[411] Fix | Delete
$this->render_top_bar();
[412] Fix | Delete
});
[413] Fix | Delete
[414] Fix | Delete
add_action('all_admin_notices', function () {
[415] Fix | Delete
$this->render_app();
[416] Fix | Delete
});
[417] Fix | Delete
}
[418] Fix | Delete
[419] Fix | Delete
if ( Utils::is_plugin_page() ) {
[420] Fix | Delete
add_action('in_admin_header', function () {
[421] Fix | Delete
$this->render_top_bar();
[422] Fix | Delete
});
[423] Fix | Delete
}
[424] Fix | Delete
[425] Fix | Delete
add_action('admin_enqueue_scripts', function () {
[426] Fix | Delete
$this->enqueue_scripts();
[427] Fix | Delete
});
[428] Fix | Delete
[429] Fix | Delete
if ( Utils::is_media_page() ) {
[430] Fix | Delete
add_action( 'admin_enqueue_scripts', [ $this, 'add_bulk_optimization_links' ] );
[431] Fix | Delete
}
[432] Fix | Delete
});
[433] Fix | Delete
}
[434] Fix | Delete
}
[435] Fix | Delete
[436] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function