✅ Fixed bulk conversion getting stuck on missing files ✅ Added robust error handling and timeout protection ✅ Improved JavaScript response parsing ✅ Added file existence validation ✅ Fixed missing PHP class imports ✅ Added comprehensive try-catch error recovery 🔧 Key fixes: - File existence checks before conversion attempts - 30-second timeout protection per file - Graceful handling of 500 errors and JSON parsing issues - Automatic continuation to next file on failures - Cache busting for JavaScript updates 🎯 Result: Bulk conversion now completes successfully even with missing files 🚀 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
151 lines
6.0 KiB
PHP
151 lines
6.0 KiB
PHP
<?php
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
|
|
|
use \WebPExpress\Paths;
|
|
use \WebPExpress\Config;
|
|
|
|
// Note: $ver is added to querystring. However, when it is is critical that no-one gets the cached version,
|
|
// a change of filename is neccessary, as there is a plugin that strips version strings out there...!
|
|
// If only one file update is critical: change the name of the file
|
|
// If several files are critical: rename the folder (ie "js2")
|
|
$ver = '4-cloudhost'; // note: Minimum 1.
|
|
$jsDir = 'js';
|
|
|
|
if (!function_exists('webp_express_add_inline_script')) {
|
|
function webp_express_add_inline_script($id, $script, $position) {
|
|
if (function_exists('wp_add_inline_script')) {
|
|
// wp_add_inline_script is available from Wordpress 4.5
|
|
wp_add_inline_script($id, $script, $position);
|
|
} else {
|
|
echo '<script>' . $script . '</script>';
|
|
}
|
|
}
|
|
}
|
|
|
|
wp_register_script('sortable', plugins_url($jsDir . '/sortable.min.js', __FILE__), [], '1.9.0');
|
|
wp_enqueue_script('sortable');
|
|
|
|
wp_register_script('daspopup', plugins_url($jsDir . '/das-popup.js', __FILE__), [], $ver);
|
|
wp_enqueue_script('daspopup');
|
|
|
|
wp_register_script('escapehtml', plugins_url($jsDir . '/escapeHTML.js', __FILE__), [], $ver);
|
|
wp_enqueue_script('escapehtml');
|
|
|
|
$config = Config::getConfigForOptionsPage();
|
|
|
|
// selftest
|
|
wp_register_script('webpexpress_selftest', plugins_url($jsDir . '/self-test.js', __FILE__), ['escapehtml'], $ver);
|
|
wp_enqueue_script('webpexpress_selftest');
|
|
|
|
// Add converter, bulk convert and whitelist script, EXCEPT for "no conversion" mode
|
|
if (!(isset($config['operation-mode']) && ($config['operation-mode'] == 'no-conversion'))) {
|
|
|
|
// Remove empty options arrays.
|
|
// These cause trouble in json because they are encoded as [] rather than {}
|
|
|
|
foreach ($config['converters'] as &$converter) {
|
|
if (isset($converter['options']) && (count(array_keys($converter['options'])) == 0)) {
|
|
unset($converter['options']);
|
|
}
|
|
}
|
|
|
|
// Converters
|
|
// ----------
|
|
wp_register_script('converters', plugins_url($jsDir . '/converters.js', __FILE__), ['sortable', 'daspopup', 'escapehtml'], $ver);
|
|
|
|
// PS: no escaping/sanitizing needed as json_encode always produces something safe
|
|
webp_express_add_inline_script(
|
|
'converters',
|
|
'window.webpExpressPaths = ' . json_encode(Paths::getUrlsAndPathsForTheJavascript()) . ';',
|
|
'before'
|
|
);
|
|
|
|
// PS: no escaping/sanitizing needed as json_encode always produces something safe
|
|
webp_express_add_inline_script(
|
|
'converters',
|
|
'window.converters = ' . json_encode($config['converters']) . ';',
|
|
'before'
|
|
);
|
|
wp_enqueue_script('converters');
|
|
|
|
// Whitelist
|
|
// ---------
|
|
wp_register_script('whitelist', plugins_url($jsDir . '/whitelist.js', __FILE__), ['daspopup', 'escapehtml'], $ver);
|
|
|
|
// PS: no escaping/sanitizing needed as json_encode always produces something safe
|
|
webp_express_add_inline_script('whitelist', 'window.whitelist = ' . json_encode($config['web-service']['whitelist']) . ';', 'before');
|
|
wp_enqueue_script('whitelist');
|
|
|
|
// bulk convert
|
|
wp_register_script('bulkconvert', plugins_url($jsDir . '/bulk-convert.js', __FILE__), ['escapehtml'], $ver);
|
|
wp_enqueue_script('bulkconvert');
|
|
|
|
// test convert
|
|
wp_register_script('testconvert', plugins_url($jsDir . '/test-convert.js', __FILE__), ['escapehtml'], $ver);
|
|
$canDisplayWebp = (isset($_SERVER['HTTP_ACCEPT']) && (strpos($_SERVER['HTTP_ACCEPT'], 'image/webp') !== false ));
|
|
|
|
/*
|
|
AlterHTMLHelper::getWebPUrlInImageRoot(
|
|
Paths::getPluginUrl() . '/webp-express', // source url
|
|
$baseId,
|
|
Paths::getPluginUrl(), // base url
|
|
Paths::getPluginDirAbs() // base dir
|
|
);
|
|
|
|
getRelUrlPath()*/
|
|
|
|
webp_express_add_inline_script('testconvert', 'window.canDisplayWebp = ' . ($canDisplayWebp ? 'true' : 'false') . ';', 'before');
|
|
wp_enqueue_script('testconvert');
|
|
|
|
wp_register_script('image-comparison-slider', plugins_url($jsDir . '/image-comparison-slider.js', __FILE__), [], $ver);
|
|
wp_enqueue_script('image-comparison-slider');
|
|
|
|
|
|
// purge cache
|
|
wp_register_script('purgecache', plugins_url($jsDir . '/purge-cache.js', __FILE__), [], $ver);
|
|
wp_enqueue_script('purgecache');
|
|
|
|
// purge log
|
|
wp_register_script('purgelog', plugins_url($jsDir . '/purge-log.js', __FILE__), [], $ver);
|
|
wp_enqueue_script('purgelog');
|
|
|
|
}
|
|
|
|
//wp_register_script('api_keys', plugins_url($jsDir . 'api-keys.js', __FILE__), ['daspopup'], '0.7.0-dev8');
|
|
//wp_enqueue_script('api_keys');
|
|
|
|
wp_register_script( 'page', plugins_url($jsDir . '/page.js', __FILE__), [], $ver);
|
|
|
|
// TODO: Add all vars needed to this array (whitelist, converters, etc)
|
|
$javascriptVars = [
|
|
'ajax-nonces' => [
|
|
'convert' => wp_create_nonce('webpexpress-ajax-convert-nonce'),
|
|
'list-unconverted-files' => wp_create_nonce('webpexpress-ajax-list-unconverted-files-nonce'),
|
|
'purge-cache' => wp_create_nonce('webpexpress-ajax-purge-cache-nonce'),
|
|
'purge-log' => wp_create_nonce('webpexpress-ajax-purge-log-nonce'),
|
|
'view-log' => wp_create_nonce('webpexpress-ajax-view-log-nonce'),
|
|
'self-test' => wp_create_nonce('webpexpress-ajax-self-test-nonce'),
|
|
],
|
|
'can-use-doc-root-for-structuring' => Paths::canUseDocRootForRelPaths()
|
|
];
|
|
webp_express_add_inline_script(
|
|
'page',
|
|
'window.webpExpress = ' . json_encode($javascriptVars, JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK),
|
|
'before'
|
|
);
|
|
wp_enqueue_script('page');
|
|
|
|
|
|
// Register styles
|
|
wp_register_style('webp-express-options-page-css', plugins_url('css/webp-express-options-page.css', __FILE__), null, $ver);
|
|
wp_enqueue_style('webp-express-options-page-css');
|
|
|
|
wp_register_style('test-convert-css', plugins_url('css/test-convert.css', __FILE__), null, $ver);
|
|
wp_enqueue_style('test-convert-css');
|
|
|
|
wp_register_style('das-popup-css', plugins_url('css/das-popup.css', __FILE__), null, $ver);
|
|
wp_enqueue_style('das-popup-css');
|
|
|
|
add_thickbox();
|