' . __FUNCTION__ . '()' );
?>
' . __FUNCTION__ . '()' );
$list = array();
$dir = get_home_path();
$iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir ), RecursiveIteratorIterator::CHILD_FIRST );
$start = microtime( true );
$file_counter = 0;
foreach ( $iterator as $path ) {
if ( ewww_image_optimizer_stl_check() ) {
set_time_limit( 0 );
}
$skip_optimized = false;
if ( $path->isDir() ) {
continue;
} else {
++$file_counter;
$path = $path->getPathname();
$newwebpformat = preg_replace( '/\.webp/', '', $path );
if ( file_exists( $newwebpformat ) ) {
continue;
}
if ( preg_match( '/\.webp$/', $path ) ) {
ewwwio_debug_message( "queued $path" );
$list[] = $path;
}
}
}
$end = microtime( true ) - $start;
ewwwio_debug_message( "query time for $file_counter files (seconds): $end" );
return $list;
}
/**
* Prepares the migration and includes the javascript functions.
*
* @param string $hook The hook identifier for the current page.
*/
function ewww_image_optimizer_webp_script( $hook ) {
ewwwio_debug_message( '
' . __FUNCTION__ . '()' );
// Make sure we are being called from the migration page.
if ( 'admin_page_ewww-image-optimizer-webp-migrate' !== $hook ) {
return;
}
$images = ewww_image_optimizer_webp_scan();
// Remove the images array from the db if it currently exists, and then store the new list in the database.
if ( get_option( 'ewww_image_optimizer_webp_images' ) ) {
delete_option( 'ewww_image_optimizer_webp_images' );
}
add_option( 'ewww_image_optimizer_webp_images', '', '', 'no' );
update_option( 'ewww_image_optimizer_webp_images', $images );
wp_enqueue_script( 'ewwwwebpscript', plugins_url( '/includes/webp.js', __FILE__ ), array( 'jquery' ), EWWW_IMAGE_OPTIMIZER_VERSION );
$image_count = count( $images );
// Submit a couple variables to the javascript to work with.
wp_localize_script(
'ewwwwebpscript',
'ewww_vars',
array( 'ewww_wpnonce' => wp_create_nonce( 'ewww-image-optimizer-webp' ) )
);
}
/**
* Called by javascript to initialize some output.
*/
function ewww_image_optimizer_webp_initialize() {
// Verify that an authorized user has started the migration.
$permissions = apply_filters( 'ewww_image_optimizer_admin_permissions', '' );
if ( empty( $_REQUEST['ewww_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( $_REQUEST['ewww_wpnonce'] ), 'ewww-image-optimizer-webp' ) || ! current_user_can( $permissions ) ) {
ewwwio_ob_clean();
die( esc_html__( 'Access denied.', 'ewww-image-optimizer' ) );
}
if ( get_option( 'ewww_image_optimizer_webp_skipped' ) ) {
delete_option( 'ewww_image_optimizer_webp_skipped' );
}
add_option( 'ewww_image_optimizer_webp_skipped', '', '', 'no' );
// Generate the WP spinner image for display.
$loading_image = plugins_url( '/images/wpspin.gif', __FILE__ );
// Let the user know that we are beginning.
ewwwio_ob_clean();
die( '
' . esc_html__( 'Scanning', 'ewww-image-optimizer' ) . '
' );
}
/**
* Called by javascript to process each image in the queue.
*/
function ewww_image_optimizer_webp_loop() {
ewwwio_debug_message( '
' . __FUNCTION__ . '()' );
$permissions = apply_filters( 'ewww_image_optimizer_admin_permissions', '' );
if ( empty( $_REQUEST['ewww_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( $_REQUEST['ewww_wpnonce'] ), 'ewww-image-optimizer-webp' ) || ! current_user_can( $permissions ) ) {
ewwwio_ob_clean();
die( esc_html__( 'Access token has expired, please reload the page.', 'ewww-image-optimizer' ) );
}
// Retrieve the time when the migration starts.
$started = microtime( true );
if ( ewww_image_optimizer_stl_check() ) {
set_time_limit( 0 );
}
$images = array();
ewwwio_debug_message( 'renaming images now' );
$images_processed = 0;
$images_skipped = '';
$images = get_option( 'ewww_image_optimizer_webp_images' );
if ( $images ) {
/* translators: %d: number of images */
printf( esc_html__( '%d Webp images left to rename.', 'ewww-image-optimizer' ), count( $images ) );
echo '
';
}
while ( $images ) {
++$images_processed;
ewwwio_debug_message( "processed $images_processed images so far" );
if ( $images_processed > 1000 ) {
ewwwio_debug_message( 'hit 1000, breaking loop' );
break;
}
$image = array_pop( $images );
$replace_base = '';
$skip = true;
$pngfile = preg_replace( '/webp$/', 'png', $image );
$upngfile = preg_replace( '/webp$/', 'PNG', $image );
$jpgfile = preg_replace( '/webp$/', 'jpg', $image );
$jpegfile = preg_replace( '/webp$/', 'jpeg', $image );
$ujpgfile = preg_replace( '/webp$/', 'JPG', $image );
if ( file_exists( $pngfile ) ) {
$replace_base = $pngfile;
$skip = false;
} if ( file_exists( $upngfile ) ) {
if ( empty( $replace_base ) ) {
$replace_base = $upngfile;
$skip = false;
} else {
$skip = true;
}
} if ( file_exists( $jpgfile ) ) {
if ( empty( $replace_base ) ) {
$replace_base = $jpgfile;
$skip = false;
} else {
$skip = true;
}
} if ( file_exists( $jpegfile ) ) {
if ( empty( $replace_base ) ) {
$replace_base = $jpegfile;
$skip = false;
} else {
$skip = true;
}
} if ( file_exists( $ujpgfile ) ) {
if ( empty( $replace_base ) ) {
$replace_base = $ujpgfile;
$skip = false;
} else {
$skip = true;
}
}
if ( $skip ) {
if ( $replace_base ) {
ewwwio_debug_message( "multiple replacement options for $image, not renaming" );
} else {
ewwwio_debug_message( "no match found for $image, strange..." );
}
$images_skipped .= "$image
";
} else {
ewwwio_debug_message( "renaming $image with match of $replace_base" );
rename( $image, $replace_base . '.webp' );
}
} // End while().
if ( $images_skipped ) {
update_option( 'ewww_image_optimizer_webp_skipped', get_option( 'ewww_image_optimizer_webp_skipped' ) . $images_skipped );
}
// Calculate how much time has elapsed since we started.
$elapsed = microtime( true ) - $started;
ewwwio_debug_message( "took $elapsed seconds this time around" );
// Store the updated list of images back in the database.
update_option( 'ewww_image_optimizer_webp_images', $images );
die();
}
/**
* Called by javascript to cleanup after ourselves.
*/
function ewww_image_optimizer_webp_cleanup() {
$permissions = apply_filters( 'ewww_image_optimizer_admin_permissions', '' );
if ( empty( $_REQUEST['ewww_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( $_REQUEST['ewww_wpnonce'] ), 'ewww-image-optimizer-webp' ) || ! current_user_can( $permissions ) ) {
ewwwio_ob_clean();
die( esc_html__( 'Access token has expired, please reload the page.', 'ewww-image-optimizer' ) );
}
$skipped = get_option( 'ewww_image_optimizer_webp_skipped' );
// All done, so we can remove the webp options...
delete_option( 'ewww_image_optimizer_webp_images' );
delete_option( 'ewww_image_optimizer_webp_skipped', '' );
ewwwio_ob_clean();
if ( $skipped ) {
echo '
' . esc_html__( 'Skipped:', 'ewww-image-optimizer' ) . '
';
echo wp_kses_post( "
$skipped
" );
}
// and let the user know we are done.
die( '
' . esc_html__( 'Finished', 'ewww-image-optimizer' ) . '
' );
}
add_action( 'admin_enqueue_scripts', 'ewww_image_optimizer_webp_script' );
add_action( 'wp_ajax_webp_init', 'ewww_image_optimizer_webp_initialize' );
add_action( 'wp_ajax_webp_loop', 'ewww_image_optimizer_webp_loop' );
add_action( 'wp_ajax_webp_cleanup', 'ewww_image_optimizer_webp_cleanup' );