WebP Express CloudHost.es Fix v0.25.9-cloudhost
✅ 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>
This commit is contained in:
261
lib/options/page.php
Normal file
261
lib/options/page.php
Normal file
@@ -0,0 +1,261 @@
|
||||
<?php
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
use \WebPExpress\Config;
|
||||
use \WebPExpress\ConvertersHelper;
|
||||
use \WebPExpress\FileHelper;
|
||||
use \WebPExpress\HTAccess;
|
||||
use \WebPExpress\Messenger;
|
||||
use \WebPExpress\Multisite;
|
||||
use \WebPExpress\Paths;
|
||||
use \WebPExpress\PlatformInfo;
|
||||
use \WebPExpress\State;
|
||||
use \WebPExpress\TestRun;
|
||||
|
||||
if (!current_user_can('manage_options')) {
|
||||
wp_die('You do not have sufficient permissions to access this page.');
|
||||
}
|
||||
|
||||
?>
|
||||
<div class="wrap">
|
||||
<h2>WebP Express Settings<?php echo Multisite::isNetworkActivated() ? ' (network)' : ''; ?></h2>
|
||||
|
||||
<?php
|
||||
|
||||
function webpexpress_converterName($converterId) {
|
||||
if ($converterId == 'wpc') {
|
||||
return 'Remote WebP Express';
|
||||
}
|
||||
return $converterId;
|
||||
}
|
||||
|
||||
/*
|
||||
Removed (#243)
|
||||
function printAutoQualityOptionForConverter($converterId) {
|
||||
?>
|
||||
<div>
|
||||
<label for="<?php echo $converterId; ?>_quality">
|
||||
Quality
|
||||
<?php echo helpIcon('If "Auto" is selected, the converted image will get same quality as source. Auto is recommended!'); ?>
|
||||
</label>
|
||||
<select id="<?php echo $converterId; ?>_quality" onchange="converterQualityChanged('<?php echo $converterId; ?>')">
|
||||
<option value="inherit">Use global settings</option>
|
||||
<option value="auto">Auto</option>
|
||||
</select>
|
||||
</div>
|
||||
<div id="<?php echo $converterId; ?>_max_quality_div">
|
||||
<label>
|
||||
Max quality
|
||||
<?php echo helpIcon('Enter number (0-100). Converted images will be encoded with same quality as the source image, but not more than this setting'); ?>
|
||||
</label>
|
||||
<input type="text" size=3 id="<?php echo $converterId; ?>_max_quality">
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
*/
|
||||
|
||||
$canDetectQuality = TestRun::isLocalQualityDetectionWorking();
|
||||
$testResult = TestRun::getConverterStatus();
|
||||
$config = Config::getConfigForOptionsPage();
|
||||
|
||||
State::setState('workingConverterIds', ConvertersHelper::getWorkingConverterIds($config));
|
||||
State::setState('workingAndActiveConverterIds', ConvertersHelper::getWorkingAndActiveConverterIds($config));
|
||||
|
||||
|
||||
//State::setState('last-ewww-optimize-attempt', 0);
|
||||
//State::setState('last-ewww-optimize', 0);
|
||||
\WebPExpress\KeepEwwwSubscriptionAlive::keepAliveIfItIsTime($config);
|
||||
|
||||
if (!$testResult) {
|
||||
Messenger::printMessage(
|
||||
'error',
|
||||
'WebP Express cannot save a test conversion, because it does not have write ' .
|
||||
'access to your upload folder, nor your wp-content folder. Please provide!'
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
include __DIR__ . "/page-messages.php";
|
||||
|
||||
/*
|
||||
foreach (Paths::getHTAccessDirs() as $dir) {
|
||||
echo $dir . ':' . (Paths::canWriteHTAccessRulesHere($dir) ? 'writable' : 'not writable') . '<br>';
|
||||
//Paths::canWriteHTAccessRulesHere($dir);
|
||||
}*/
|
||||
|
||||
|
||||
//echo '<pre>' . print_r($config['converters'], true) . '</pre>';
|
||||
|
||||
//echo 'Working converters:' . print_r($workingConverters, true) . '<br>';
|
||||
// Generate a custom nonce value.
|
||||
$webpexpressSaveSettingsNonce = wp_create_nonce('webpexpress-save-settings-nonce');
|
||||
?>
|
||||
|
||||
<?php
|
||||
//echo get_theme_root_uri();
|
||||
|
||||
//include_once __DIR__ . '/../classes/AlterHtmlHelper.php';
|
||||
//$actionUrl = Multisite::isNetworkActivated() ? network_admin_url( 'admin-post.php' ) : admin_url( 'admin-post.php' );
|
||||
$actionUrl = admin_url('admin-post.php');
|
||||
|
||||
echo '<form id="webpexpress_settings" action="' . esc_url($actionUrl) . '" method="post" >';
|
||||
?>
|
||||
<input type="hidden" name="action" value="webpexpress_settings_submit">
|
||||
<input type="hidden" name="_wpnonce" value="<?php echo $webpexpressSaveSettingsNonce ?>" />
|
||||
|
||||
<fieldset class="block buttons">
|
||||
<table>
|
||||
<tr>
|
||||
<td style="padding-right:20px"><?php submit_button('Save settings', 'primary', 'mysubmit'); ?></td>
|
||||
<td><?php submit_button('Save settings and force new .htaccess rules', 'secondary', 'force'); ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
<?php
|
||||
function helpIcon($text, $customClass = '') {
|
||||
$className = '';
|
||||
if (strlen($text) < 80) {
|
||||
$className = 'narrow';
|
||||
}
|
||||
if (strlen($text) > 150) {
|
||||
if (strlen($text) > 300) {
|
||||
if (strlen($text) > 500) {
|
||||
if (strlen($text) > 1000) {
|
||||
$className = 'widest';
|
||||
} else {
|
||||
$className = 'even-wider';
|
||||
}
|
||||
} else {
|
||||
$className = 'wider';
|
||||
}
|
||||
} else {
|
||||
$className = 'wide';
|
||||
}
|
||||
}
|
||||
return '<div class="help ' . $customClass . '">?<div class="popup ' . $className . '">' . $text . '</div></div>';
|
||||
}
|
||||
|
||||
function webpexpress_selectBoxOptions($selected, $options) {
|
||||
foreach ($options as $optionValue => $text) {
|
||||
echo '<option value="' . esc_attr($optionValue) . '"' . ($optionValue == $selected ? ' selected' : '') . '>';
|
||||
echo esc_html($text);
|
||||
echo '</option>';
|
||||
}
|
||||
}
|
||||
|
||||
function webpexpress_radioButton($optionName, $optionValue, $label, $selectedValue, $helpText = null) {
|
||||
$id = esc_attr(str_replace('-', '_', $optionName . '_' . $optionValue));
|
||||
echo '<input type="radio" id="' . $id . '"';
|
||||
if ($optionValue == $selectedValue) {
|
||||
echo ' checked="checked"';
|
||||
}
|
||||
echo ' name="' . esc_attr($optionName) . '" value="' . esc_attr($optionValue) . '" style="margin-right: 10px">';
|
||||
echo '<label for="' . $id . '">';
|
||||
echo $label;
|
||||
if (!is_null($helpText)) {
|
||||
echo helpIcon($helpText);
|
||||
}
|
||||
echo '</label>';
|
||||
}
|
||||
|
||||
function webpexpress_radioButtons($optionName, $selected, $options, $helpTexts = [], $style='margin-left: 20px; margin-top: 5px') {
|
||||
echo '<ul style="' . $style . '">';
|
||||
foreach ($options as $optionValue => $label) {
|
||||
echo '<li>';
|
||||
webpexpress_radioButton($optionName, $optionValue, $label, $selected, isset($helpTexts[$optionValue]) ? $helpTexts[$optionValue] : null);
|
||||
echo '</li>';
|
||||
}
|
||||
echo '</ul>';
|
||||
}
|
||||
|
||||
function webpexpress_checkbox($optionName, $checked, $label, $helpText = '') {
|
||||
$id = esc_attr(str_replace('-', '_', $optionName));
|
||||
echo '<div style="margin:10px 0 0 10px;">';
|
||||
echo '<input value="true" type="checkbox" style="margin-right: 10px" ';
|
||||
echo 'name="' . esc_attr($optionName) . '"';
|
||||
echo 'id="' . $id . '"';
|
||||
if ($checked) {
|
||||
echo ' checked="checked"';
|
||||
}
|
||||
echo '>';
|
||||
echo '<label for="' . $id . '">';
|
||||
echo $label . '</label>';
|
||||
if ($helpText != '') {
|
||||
echo helpIcon($helpText);
|
||||
}
|
||||
echo '</div>';
|
||||
|
||||
}
|
||||
|
||||
include_once 'options/operation-mode.inc';
|
||||
include_once 'options/general/general.inc';
|
||||
|
||||
|
||||
/*
|
||||
idea:
|
||||
|
||||
$options = [
|
||||
'tweaked' => [
|
||||
'general' => [
|
||||
'image-types',
|
||||
'destination-folder',
|
||||
'destination-extension',
|
||||
'cache-control'
|
||||
]
|
||||
],
|
||||
...
|
||||
];
|
||||
*/
|
||||
|
||||
|
||||
if ($config['operation-mode'] != 'tweaked') {
|
||||
// echo '<fieldset class="block">';
|
||||
// echo '<table class="form-table"><tbody>';
|
||||
}
|
||||
|
||||
if ($config['operation-mode'] == 'no-conversion') {
|
||||
|
||||
// General
|
||||
/*
|
||||
echo '<tr><th colspan=2>';
|
||||
echo '<h2>General</h2>';
|
||||
echo '</th></tr>';
|
||||
include_once 'options/conversion-options/destination-extension.inc';
|
||||
include_once 'options/general/image-types.inc';
|
||||
*/
|
||||
|
||||
include_once 'options/redirection-rules/redirection-rules.inc';
|
||||
include_once 'options/alter-html/alter-html.inc';
|
||||
} else {
|
||||
include_once 'options/redirection-rules/redirection-rules.inc';
|
||||
include_once 'options/conversion-options/conversion-options.inc';
|
||||
//include_once 'options/conversion-options/destination-extension.inc';
|
||||
include_once 'options/serve-options/serve-options.inc';
|
||||
|
||||
include_once 'options/alter-html/alter-html.inc';
|
||||
|
||||
/*
|
||||
if ($config['operation-mode'] == 'cdn-friendly') {
|
||||
include_once 'options/redirection-rules/enable-redirection-to-webp-realizer.inc';
|
||||
|
||||
// ps: we call it "auto convert", when in this mode
|
||||
include_once 'options/redirection-rules/enable-redirection-to-converter.inc';
|
||||
}
|
||||
|
||||
if ($config['operation-mode'] == 'varied-image-responses') {
|
||||
include_once 'options/redirection-rules/enable-redirection-to-webp-realizer.inc';
|
||||
}
|
||||
*/
|
||||
|
||||
include_once 'options/web-service-options/web-service-options.inc';
|
||||
}
|
||||
|
||||
if ($config['operation-mode'] != 'tweaked') {
|
||||
// echo '</tbody></table>';
|
||||
// echo '</fieldset>';
|
||||
}
|
||||
|
||||
?>
|
||||
</form>
|
||||
</div>
|
||||
Reference in New Issue
Block a user