Files
WebP-eXpress/lib/options/page.php
Malin 37cf714058 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>
2025-09-23 10:22:32 +02:00

262 lines
8.1 KiB
PHP

<?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>