Sync plugins from current page
Signed-off-by: Adrian Nöthlich <git@promasu.tech>
This commit is contained in:
		
							
								
								
									
										248
									
								
								wp-content/plugins/imsanity/ajax.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								wp-content/plugins/imsanity/ajax.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,248 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Imsanity AJAX functions. | ||||
|  * | ||||
|  * @package Imsanity | ||||
|  */ | ||||
|  | ||||
| add_action( 'wp_ajax_imsanity_get_images', 'imsanity_get_images' ); | ||||
| add_action( 'wp_ajax_imsanity_resize_image', 'imsanity_resize_image' ); | ||||
|  | ||||
| /** | ||||
|  * Verifies that the current user has administrator permission and, if not, | ||||
|  * renders a json warning and dies | ||||
|  */ | ||||
| function imsanity_verify_permission() { | ||||
| 	if ( ! current_user_can( 'activate_plugins' ) ) { // this isn't a real capability, but super admins can do anything, so it works. | ||||
| 		die( | ||||
| 			json_encode( | ||||
| 				array( | ||||
| 					'success' => false, | ||||
| 					'message' => esc_html__( 'Administrator permission is required', 'imsanity' ), | ||||
| 				) | ||||
| 			) | ||||
| 		); | ||||
| 	} | ||||
| 	if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'imsanity-bulk' ) ) { | ||||
| 		die( | ||||
| 			json_encode( | ||||
| 				array( | ||||
| 					'success' => false, | ||||
| 					'message' => esc_html__( 'Access token has expired, please reload the page.', 'imsanity' ), | ||||
| 				) | ||||
| 			) | ||||
| 		); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Searches for up to 250 images that are candidates for resize and renders them | ||||
|  * to the browser as a json array, then dies | ||||
|  */ | ||||
| function imsanity_get_images() { | ||||
| 	imsanity_verify_permission(); | ||||
|  | ||||
| 	global $wpdb; | ||||
| 	$offset  = 0; | ||||
| 	$limit   = apply_filters( 'imsanity_attachment_query_limit', 3000 ); | ||||
| 	$results = array(); | ||||
| 	$maxw    = imsanity_get_option( 'imsanity_max_width', IMSANITY_DEFAULT_MAX_WIDTH ); | ||||
| 	$maxh    = imsanity_get_option( 'imsanity_max_height', IMSANITY_DEFAULT_MAX_HEIGHT ); | ||||
| 	$count   = 0; | ||||
|  | ||||
| 	$images = $wpdb->get_results( $wpdb->prepare( "SELECT metas.meta_value as file_meta,metas.post_id as ID FROM $wpdb->postmeta metas INNER JOIN $wpdb->posts posts ON posts.ID = metas.post_id WHERE posts.post_type = 'attachment' AND posts.post_mime_type LIKE %s AND posts.post_mime_type != 'image/bmp' AND metas.meta_key = '_wp_attachment_metadata' ORDER BY ID DESC LIMIT %d,%d", '%image%', $offset, $limit ) ); | ||||
| 	/* $images = $wpdb->get_results( "SELECT metas.meta_value as file_meta,metas.post_id as ID FROM $wpdb->postmeta metas INNER JOIN $wpdb->posts posts ON posts.ID = metas.post_id WHERE posts.post_type LIKE 'attachment' AND posts.post_mime_type LIKE 'image%%' AND posts.post_mime_type NOT LIKE 'image/bmp' AND metas.meta_key = '_wp_attachment_metadata' LIMIT $offset,$limit" ); */ | ||||
| 	while ( $images ) { | ||||
|  | ||||
| 		foreach ( $images as $image ) { | ||||
| 			$imagew = false; | ||||
| 			$imageh = false; | ||||
|  | ||||
| 			$meta = unserialize( $image->file_meta ); | ||||
|  | ||||
| 			// If "noresize" is included in the filename then we will bypass imsanity scaling. | ||||
| 			if ( ! empty( $meta['file'] ) && strpos( $meta['file'], 'noresize' ) !== false ) { | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			if ( imsanity_get_option( 'imsanity_deep_scan', false ) ) { | ||||
| 				$file_path = imsanity_attachment_path( $meta, $image->ID, '', false ); | ||||
| 				if ( $file_path ) { | ||||
| 					list( $imagew, $imageh ) = getimagesize( $file_path ); | ||||
| 				} | ||||
| 			} | ||||
| 			if ( empty( $imagew ) || empty( $imageh ) ) { | ||||
| 				$imagew = $meta['width']; | ||||
| 				$imageh = $meta['height']; | ||||
| 			} | ||||
|  | ||||
| 			if ( $imagew > $maxw || $imageh > $maxh ) { | ||||
| 				$count++; | ||||
|  | ||||
| 				$results[] = array( | ||||
| 					'id'     => $image->ID, | ||||
| 					'width'  => $imagew, | ||||
| 					'height' => $imageh, | ||||
| 					'file'   => $meta['file'], | ||||
| 				); | ||||
| 			} | ||||
|  | ||||
| 			// Make sure we only return a limited number of records so we don't overload the ajax features. | ||||
| 			if ( $count >= IMSANITY_AJAX_MAX_RECORDS ) { | ||||
| 				break 2; | ||||
| 			} | ||||
| 		} | ||||
| 		$offset += $limit; | ||||
| 		$images  = $wpdb->get_results( $wpdb->prepare( "SELECT metas.meta_value as file_meta,metas.post_id as ID FROM $wpdb->postmeta metas INNER JOIN $wpdb->posts posts ON posts.ID = metas.post_id WHERE posts.post_type = 'attachment' AND posts.post_mime_type LIKE %s AND posts.post_mime_type != 'image/bmp' AND metas.meta_key = '_wp_attachment_metadata' ORDER BY ID DESC LIMIT %d,%d", '%image%', $offset, $limit ) ); | ||||
| 	} // endwhile | ||||
| 	die( json_encode( $results ) ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Resizes the image with the given id according to the configured max width and height settings | ||||
|  * renders a json response indicating success/failure and dies | ||||
|  */ | ||||
| function imsanity_resize_image() { | ||||
| 	imsanity_verify_permission(); | ||||
|  | ||||
| 	global $wpdb; | ||||
|  | ||||
| 	$id = (int) $_POST['id']; | ||||
|  | ||||
| 	if ( ! $id ) { | ||||
| 		die( | ||||
| 			json_encode( | ||||
| 				array( | ||||
| 					'success' => false, | ||||
| 					'message' => esc_html__( 'Missing ID Parameter', 'imsanity' ), | ||||
| 				) | ||||
| 			) | ||||
| 		); | ||||
| 	} | ||||
|  | ||||
| 	$meta = wp_get_attachment_metadata( $id ); | ||||
|  | ||||
| 	if ( $meta && is_array( $meta ) ) { | ||||
| 		$uploads = wp_upload_dir(); | ||||
| 		$oldpath = imsanity_attachment_path( $meta['file'], $id, '', false ); | ||||
| 		if ( empty( $oldpath ) || ! is_writable( $oldpath ) ) { | ||||
| 			/* translators: %s: File-name of the image */ | ||||
| 			$msg = sprintf( esc_html__( '%s is not writable', 'imsanity' ), $meta['file'] ); | ||||
| 			die( | ||||
| 				json_encode( | ||||
| 					array( | ||||
| 						'success' => false, | ||||
| 						'message' => $msg, | ||||
| 					) | ||||
| 				) | ||||
| 			); | ||||
| 		} | ||||
|  | ||||
| 		$maxw = imsanity_get_option( 'imsanity_max_width', IMSANITY_DEFAULT_MAX_WIDTH ); | ||||
| 		$maxh = imsanity_get_option( 'imsanity_max_height', IMSANITY_DEFAULT_MAX_HEIGHT ); | ||||
|  | ||||
| 		// method one - slow but accurate, get file size from file itself. | ||||
| 		list( $oldw, $oldh ) = getimagesize( $oldpath ); | ||||
| 		// method two - get file size from meta, fast but resize will fail if meta is out of sync. | ||||
| 		if ( ! $oldw || ! $oldh ) { | ||||
| 			$oldw = $meta['width']; | ||||
| 			$oldh = $meta['height']; | ||||
| 		} | ||||
|  | ||||
| 		if ( ( $oldw > $maxw && $maxw > 0 ) || ( $oldh > $maxh && $maxh > 0 ) ) { | ||||
| 			$quality = imsanity_get_option( 'imsanity_quality', IMSANITY_DEFAULT_QUALITY ); | ||||
|  | ||||
| 			if ( $oldw > $maxw && $maxw > 0 && $oldh > $maxh && $maxh > 0 && apply_filters( 'imsanity_crop_image', false ) ) { | ||||
| 				$neww = $maxw; | ||||
| 				$newh = $maxh; | ||||
| 			} else { | ||||
| 				list( $neww, $newh ) = wp_constrain_dimensions( $oldw, $oldh, $maxw, $maxh ); | ||||
| 			} | ||||
|  | ||||
| 			$resizeresult = imsanity_image_resize( $oldpath, $neww, $newh, apply_filters( 'imsanity_crop_image', false ), null, null, $quality ); | ||||
|  | ||||
| 			if ( $resizeresult && ! is_wp_error( $resizeresult ) ) { | ||||
| 				$newpath = $resizeresult; | ||||
|  | ||||
| 				if ( $newpath !== $oldpath && is_file( $newpath ) && filesize( $newpath ) < filesize( $oldpath ) ) { | ||||
| 					// we saved some file space. remove original and replace with resized image. | ||||
| 					unlink( $oldpath ); | ||||
| 					rename( $newpath, $oldpath ); | ||||
| 					$meta['width']  = $neww; | ||||
| 					$meta['height'] = $newh; | ||||
|  | ||||
| 					wp_update_attachment_metadata( $id, $meta ); | ||||
|  | ||||
| 					$results = array( | ||||
| 						'success' => true, | ||||
| 						'id'      => $id, | ||||
| 						/* translators: %s: File-name of the image */ | ||||
| 						'message' => sprintf( esc_html__( 'OK: %s', 'imsanity' ), $oldpath ), | ||||
| 					); | ||||
| 				} elseif ( $newpath !== $oldpath ) { | ||||
| 					// the resized image is actually bigger in filesize (most likely due to jpg quality). | ||||
| 					// keep the old one and just get rid of the resized image. | ||||
| 					if ( is_file( $newpath ) ) { | ||||
| 						unlink( $newpath ); | ||||
| 					} | ||||
| 					$results = array( | ||||
| 						'success' => false, | ||||
| 						'id'      => $id, | ||||
| 						/* translators: 1: File-name of the image 2: the error message, translated elsewhere */ | ||||
| 						'message' => sprintf( esc_html__( 'ERROR: %1$s (%2$s)', 'imsanity' ), $oldpath, esc_html__( 'Resized image was larger than the original', 'imsanity' ) ), | ||||
| 					); | ||||
| 				} else { | ||||
| 					$results = array( | ||||
| 						'success' => false, | ||||
| 						'id'      => $id, | ||||
| 						/* translators: 1: File-name of the image 2: the error message, translated elsewhere */ | ||||
| 						'message' => sprintf( esc_html__( 'ERROR: %1$s (%2$s)', 'imsanity' ), $oldpath, esc_html__( 'Unknown error, resizing function returned the same filename', 'imsanity' ) ), | ||||
| 					); | ||||
| 				} | ||||
| 			} elseif ( false === $resizeresult ) { | ||||
| 				$results = array( | ||||
| 					'success' => false, | ||||
| 					'id'      => $id, | ||||
| 					/* translators: 1: File-name of the image 2: the error message, translated elsewhere */ | ||||
| 					'message' => sprintf( esc_html__( 'ERROR: %1$s (%2$s)', 'imsanity' ), $oldpath, esc_html__( 'wp_get_image_editor missing', 'imsanity' ) ), | ||||
| 				); | ||||
| 			} else { | ||||
| 				$results = array( | ||||
| 					'success' => false, | ||||
| 					'id'      => $id, | ||||
| 					/* translators: 1: File-name of the image 2: the error message, translated elsewhere */ | ||||
| 					'message' => sprintf( esc_html__( 'ERROR: %1$s (%2$s)', 'imsanity' ), $oldpath, htmlentities( $resizeresult->get_error_message() ) ), | ||||
| 				); | ||||
| 			} | ||||
| 		} else { | ||||
| 			$results = array( | ||||
| 				'success' => true, | ||||
| 				'id'      => $id, | ||||
| 				/* translators: %s: File-name of the image */ | ||||
| 				'message' => sprintf( esc_html__( 'SKIPPED: %s (Resize not required)', 'imsanity' ), $oldpath ) . " -- $oldw x $oldh", | ||||
| 			); | ||||
| 			if ( empty( $meta['width'] ) || empty( $meta['height'] ) ) { | ||||
| 				if ( empty( $meta['width'] ) || $meta['width'] > $oldw ) { | ||||
| 					$meta['width'] = $oldw; | ||||
| 				} | ||||
| 				if ( empty( $meta['height'] ) || $meta['height'] > $oldh ) { | ||||
| 					$meta['height'] = $oldh; | ||||
| 				} | ||||
| 				wp_update_attachment_metadata( $id, $meta ); | ||||
| 			} | ||||
| 		} | ||||
| 	} else { | ||||
| 		$results = array( | ||||
| 			'success' => false, | ||||
| 			'id'      => $id, | ||||
| 			/* translators: %s: ID number of the image */ | ||||
| 			'message' => sprintf( esc_html__( 'ERROR: Attachment with ID of %d not found', 'imsanity' ), intval( $id ) ), | ||||
| 		); | ||||
| 	} | ||||
|  | ||||
| 	// If there is a quota we need to reset the directory size cache so it will re-calculate. | ||||
| 	delete_transient( 'dirsize_cache' ); | ||||
|  | ||||
| 	die( json_encode( $results ) ); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user