211 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * File: Extension_ImageService_Cron.php
 | |
|  *
 | |
|  * @since 2.2.0
 | |
|  *
 | |
|  * @package W3TC
 | |
|  */
 | |
| 
 | |
| namespace W3TC;
 | |
| 
 | |
| /**
 | |
|  * Class: Extension_ImageService_Cron
 | |
|  *
 | |
|  * @since 2.2.0
 | |
|  */
 | |
| class Extension_ImageService_Cron {
 | |
| 	/**
 | |
| 	 * Add cron job/event.
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 * @static
 | |
| 	 */
 | |
| 	public static function add_cron() {
 | |
| 		if ( ! wp_next_scheduled( 'w3tc_imageservice_cron' ) ) {
 | |
| 			wp_schedule_event( time(), 'ten_seconds', 'w3tc_imageservice_cron' );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Add cron schedule.
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 * @static
 | |
| 	 *
 | |
| 	 * @param array $schedules Schedules.
 | |
| 	 */
 | |
| 	public static function add_schedule( array $schedules = array() ) {
 | |
| 		$schedules['ten_seconds'] = array(
 | |
| 			'interval' => 10,
 | |
| 			'display'  => esc_html__( 'Every Ten Seconds', 'w3-total-cache' ),
 | |
| 		);
 | |
| 		return $schedules;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Remove cron job/event.
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 * @static
 | |
| 	 */
 | |
| 	public static function delete_cron() {
 | |
| 		$timestamp = wp_next_scheduled( 'w3tc_imageservice_cron' );
 | |
| 
 | |
| 		if ( $timestamp ) {
 | |
| 			wp_unschedule_event( $timestamp, 'w3tc_imageservice_cron' );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Run the cron event.
 | |
| 	 *
 | |
| 	 * @since 2.2.0
 | |
| 	 *
 | |
| 	 * @see Extension_ImageService_Plugin_Admin::get_imageservice_attachments()
 | |
| 	 * @see Extension_ImageService_Plugin::get_api()
 | |
| 	 *
 | |
| 	 * @global $wp_filesystem WP_Filesystem.
 | |
| 	 */
 | |
| 	public static function run() {
 | |
| 		// Get all images with postmeta key "w3tc_imageservice".
 | |
| 		$results = Extension_ImageService_Plugin_Admin::get_imageservice_attachments();
 | |
| 
 | |
| 		// If there are matches, then load dependencies before use.
 | |
| 		if ( $results->have_posts() ) {
 | |
| 			require_once __DIR__ . '/Extension_ImageService_Plugin_Admin.php';
 | |
| 
 | |
| 			$wp_upload_dir = wp_upload_dir();
 | |
| 
 | |
| 			global $wp_filesystem;
 | |
| 
 | |
| 			// Make sure that this file is included, as wp_generate_attachment_metadata() depends on it.
 | |
| 			require_once ABSPATH . 'wp-admin/includes/image.php';
 | |
| 		}
 | |
| 
 | |
| 		foreach ( $results->posts as $post ) {
 | |
| 			$postmeta = get_post_meta( $post->ID, 'w3tc_imageservice', true );
 | |
| 			$status   = isset( $postmeta['status'] ) ? $postmeta['status'] : null;
 | |
| 
 | |
| 			// Handle items with the "processing" status.
 | |
| 			if ( 'processing' === $status && isset( $postmeta['processing']['job_id'] ) && isset( $postmeta['processing']['signature'] ) ) {
 | |
| 				// Get the Image Service API object (singlton).
 | |
| 				$api = Extension_ImageService_Plugin::get_api();
 | |
| 
 | |
| 				// Check the status of the request.
 | |
| 				$response = $api->get_status( $postmeta['processing']['job_id'], $postmeta['processing']['signature'] );
 | |
| 
 | |
| 				// Save the status response.
 | |
| 				Extension_ImageService_Plugin_Admin::update_postmeta(
 | |
| 					$post->ID,
 | |
| 					array( 'job_status' => $response )
 | |
| 				);
 | |
| 
 | |
| 				// Check if image is ready for pickup/download.
 | |
| 				if ( isset( $response['status'] ) && 'pickup' === $response['status'] ) {
 | |
| 					// Download image.
 | |
| 					$response   = $api->download( $postmeta['processing']['job_id'], $postmeta['processing']['signature'] );
 | |
| 					$headers    = wp_remote_retrieve_headers( $response );
 | |
| 					$is_error   = isset( $response['error'] );
 | |
| 					$is_reduced = ! $is_error && isset( $headers['x-filesize-reduced'] ) &&
 | |
| 						rtrim( $headers['x-filesize-reduced'], '%' ) > 0;
 | |
| 
 | |
| 					switch ( true ) {
 | |
| 						case $is_error:
 | |
| 							$status = 'error';
 | |
| 							break;
 | |
| 						case $is_reduced:
 | |
| 							$status = 'converted';
 | |
| 							break;
 | |
| 						default:
 | |
| 							$status = 'notconverted';
 | |
| 							break;
 | |
| 					}
 | |
| 
 | |
| 					// Save the download headers or error.
 | |
| 					Extension_ImageService_Plugin_Admin::update_postmeta(
 | |
| 						$post->ID,
 | |
| 						array(
 | |
| 							'download' => $is_error ? $response['error'] : (array) $headers,
 | |
| 							'status'   => $status,
 | |
| 						)
 | |
| 					);
 | |
| 
 | |
| 					// Skip error responses or if converted image is larger.
 | |
| 					if ( $is_error || ! $is_reduced ) {
 | |
| 						continue;
 | |
| 					}
 | |
| 
 | |
| 					// If an converted file already exists, then delete it before saving the new file.
 | |
| 					if ( isset( $postmeta['post_child'] ) ) {
 | |
| 						wp_delete_attachment( $postmeta['post_child'], true );
 | |
| 					}
 | |
| 
 | |
| 					// Save the file.
 | |
| 					$original_filepath = get_attached_file( $post->ID );
 | |
| 					$original_size     = wp_getimagesize( $original_filepath );
 | |
| 					$original_filename = basename( get_attached_file( $post->ID ) );
 | |
| 					$original_filedir  = str_replace( '/' . $original_filename, '', $original_filepath );
 | |
| 					$extension         = isset( $headers['X-Mime-Type-Out'] ) ?
 | |
| 						str_replace( 'image/', '', $headers['X-Mime-Type-Out'] ) : 'webp';
 | |
| 					$new_filename      = preg_replace( '/\.[^.]+$/', '', $original_filename ) . '.' . $extension;
 | |
| 					$new_filepath      = $original_filedir . '/' . $new_filename;
 | |
| 
 | |
| 					if ( is_a( $wp_filesystem, 'WP_Filesystem_Base' ) ) {
 | |
| 						$wp_filesystem->put_contents( $new_filepath, wp_remote_retrieve_body( $response ) );
 | |
| 					} else {
 | |
| 						Util_File::file_put_contents_atomic( $new_filepath, wp_remote_retrieve_body( $response ) );
 | |
| 					}
 | |
| 
 | |
| 					// Insert as attachment post.
 | |
| 					$post_id = wp_insert_attachment(
 | |
| 						array(
 | |
| 							'guid'           => $new_filepath,
 | |
| 							'post_mime_type' => $headers['x-mime-type-out'],
 | |
| 							'post_title'     => preg_replace( '/\.[^.]+$/', '', $new_filename ),
 | |
| 							'post_content'   => '',
 | |
| 							'post_status'    => 'inherit',
 | |
| 							'post_parent'    => $post->ID,
 | |
| 							'comment_status' => 'closed',
 | |
| 						),
 | |
| 						$new_filepath,
 | |
| 						$post->ID,
 | |
| 						false,
 | |
| 						false
 | |
| 					);
 | |
| 
 | |
| 					// Copy postmeta data to the new attachment.
 | |
| 					Extension_ImageService_Plugin_Admin::copy_postmeta( $post->ID, $post_id );
 | |
| 
 | |
| 					// Save the new post id.
 | |
| 					Extension_ImageService_Plugin_Admin::update_postmeta(
 | |
| 						$post->ID,
 | |
| 						array( 'post_child' => $post_id )
 | |
| 					);
 | |
| 
 | |
| 					// Mark the downloaded file as the converted one.
 | |
| 					Extension_ImageService_Plugin_Admin::update_postmeta(
 | |
| 						$post_id,
 | |
| 						array( 'is_converted_file' => true )
 | |
| 					);
 | |
| 
 | |
| 					// In order to filter/hide converted files in the media list, add a meta key.
 | |
| 					update_post_meta( $post_id, 'w3tc_imageservice_file', $extension );
 | |
| 
 | |
| 					// Generate the metadata for the attachment, and update the database record.
 | |
| 					$attach_data           = wp_generate_attachment_metadata( $post_id, $new_filepath );
 | |
| 					$attach_data['width']  = isset( $attach_data['width'] ) ? $attach_data['width'] : $original_size[0];
 | |
| 					$attach_data['height'] = isset( $attach_data['height'] ) ? $attach_data['height'] : $original_size[1];
 | |
| 					wp_update_attachment_metadata( $post_id, $attach_data );
 | |
| 				} elseif ( isset( $response['status'] ) && 'complete' === $response['status'] ) {
 | |
| 					// Update the status to "error".
 | |
| 					Extension_ImageService_Plugin_Admin::update_postmeta(
 | |
| 						$post->ID,
 | |
| 						array( 'status' => 'error' )
 | |
| 					);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |