PluginProbe
Plus WebP or AVIF / 4.11
Plus WebP or AVIF v4.11
5.21 5.20 5.12 5.11 trunk 1.00 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 1.11 1.12 1.13 2.00 2.01 2.02 2.03 2.04 2.05 All 47 releases
← All changes | lib/class-pluswebp.php +339 -22 1.084.11 View file →
@@ -33,16 +33,18 @@
33 33 *
34 34 * @var $upload_dir DIR.
35 35 */
36 36 private $upload_dir;
37 +
37 38 /** ==================================================
38 - * Dir
39 + * URL
39 40 *
40 41 * @var $upload_url URL.
41 42 */
42 43 private $upload_url;
44 +
43 45 /** ==================================================
44 - * Dir
46 + * Path
45 47 *
46 48 * @var $upload_path PATH.
47 49 */
48 50 private $upload_path;
@@ -55,10 +57,19 @@
55 57 public function __construct() {
56 58
57 59 list( $this->upload_dir, $this->upload_url, $this->upload_path ) = $this->upload_dir_url_path();
58 60
61 + /* Generate metadata */
59 62 add_filter( 'wp_generate_attachment_metadata', array( $this, 'generate_webp' ), 10, 2 );
63 + /* Original hook */
64 + add_filter( 'pluswebp_get_allimages', array( $this, 'get_allimages' ), 10, 1 );
65 + add_filter( 'pluswebp_mail_messages', array( $this, 'mail_messages' ), 10, 2 );
66 + add_action( 'pluswebp_mail_generate_message', array( $this, 'mail_generate_message' ), 10, 2 );
60 67
68 + /* Raise memory */
69 + add_filter( 'pluswebp_memory_limit', array( $this, 'raise_memory_limit' ) );
70 + /* webp generation control */
71 + add_filter( 'wp_upload_image_mime_transforms', array( $this, 'control_mime_type' ), 10, 2 );
61 72 }
62 73
63 74 /** ==================================================
64 75 * Webp generate
@@ -75,27 +86,49 @@
75 86
76 87 $mime_type = get_post_mime_type( $attachment_id );
77 88 if ( in_array( $mime_type, $pluswebp_settings['types'] ) ) {
78 89 $metadata_webp = $metadata;
79 - $file_webp = $this->change_ext( $metadata['file'], 'webp' );
90 + $file_webp = $this->change_ext( $metadata['file'], 'webp', $pluswebp_settings['addext'] );
80 91 $metadata_webp['file'] = $file_webp;
92 + if ( '.' === dirname( $file_webp ) ) {
93 + $dir_name_url = '/';
94 + $dir_name_path = wp_normalize_path( '/' );
95 + } else {
96 + $dir_name_url = '/' . dirname( $file_webp ) . '/';
97 + $dir_name_path = wp_normalize_path( $dir_name_url );
98 + }
99 + $url = $this->upload_url . $dir_name_url;
100 + $path = $this->upload_dir . $dir_name_path;
101 +
81 102 foreach ( (array) $metadata['sizes'] as $key => $value ) {
82 103 $file_thumb = $value['file'];
83 - $file_thumb_webp = $this->change_ext( $file_thumb, 'webp' );
84 - $path = $this->upload_dir . '/' . dirname( $file_webp ) . '/';
85 - $url = $this->upload_url . '/' . dirname( $file_webp ) . '/';
86 - $ret = $this->create_webp( $path . $file_thumb, $mime_type, $path . $file_thumb_webp );
104 + $file_thumb_webp = $this->change_ext( $file_thumb, 'webp', $pluswebp_settings['addext'] );
105 + $ret = $this->create_webp( $path . $file_thumb, $mime_type, $path . $file_thumb_webp );
87 106 if ( $ret ) {
88 107 $metadata_webp['sizes'][ $key ]['file'] = $file_thumb_webp;
89 108 $metadata_webp['sizes'][ $key ]['mime-type'] = 'image/webp';
109 + $webp_size = filesize( $path . wp_basename( $file_thumb_webp ) );
110 + $metadata_webp['sizes'][ $key ]['filesize'] = $webp_size;
90 111 if ( $replace ) {
91 - unlink( $path . $file_thumb );
112 + wp_delete_file( $path . $file_thumb );
92 113 $this->change_db( $url . $file_thumb, $url . $file_thumb_webp );
93 114 }
94 115 }
95 116 }
96 117
97 - $ret = $this->create_webp( $this->upload_dir . '/' . $metadata['file'], $mime_type, $this->upload_dir . '/' . $file_webp );
118 + $org_img_file = null;
119 + if ( array_key_exists( 'original_image', $metadata ) && ! empty( $metadata['original_image'] ) ) {
120 + $org_img_file = wp_normalize_path( wp_get_original_image_path( $attachment_id, false ) );
121 + $org_webp_file = $this->change_ext( $org_img_file, 'webp', $pluswebp_settings['addext'] );
122 + $ret = $this->create_webp( $org_img_file, $mime_type, $org_webp_file );
123 + if ( $ret ) {
124 + $metadata_webp['original_image'] = wp_basename( $org_webp_file );
125 + }
126 + }
127 +
128 + $ret = $this->create_webp( $this->upload_dir . '/' . $metadata['file'], $mime_type, $path . wp_basename( $file_webp ) );
129 + $webp_size = filesize( $path . wp_basename( $file_webp ) );
130 + $metadata_webp['filesize'] = $webp_size;
98 131 if ( $ret ) {
99 132 if ( $replace ) {
100 133 $up_post = array(
101 134 'ID' => $attachment_id,
@@ -106,16 +139,21 @@
106 139 update_post_meta( $attachment_id, '_wp_attached_file', $file_webp );
107 140 /* for bulk generate */
108 141 update_post_meta( $attachment_id, '_wp_attachment_metadata', $metadata_webp );
109 142 /* delete org file */
110 - unlink( $this->upload_dir . '/' . $metadata['file'] );
143 + wp_delete_file( $this->upload_dir . '/' . $metadata['file'] );
144 + if ( $org_img_file ) {
145 + wp_delete_file( $org_img_file );
146 + }
111 147 /* Replace */
112 148 $this->change_db( $this->upload_url . '/' . $metadata['file'], $this->upload_url . '/' . $file_webp );
113 149 /* for hook */
114 150 $metadata = $metadata_webp;
151 + /* for mail */
152 + $attach_id = $attachment_id;
115 153 } else {
116 154 $post = get_post( $attachment_id );
117 - $title = get_the_title( $post );
155 + $title = $post->post_title;
118 156 $attachment = array(
119 157 'guid' => $this->upload_url . '/' . $file_webp,
120 158 'post_mime_type' => 'image/webp',
121 159 'post_title' => $title,
@@ -121,9 +159,15 @@
121 159 'post_title' => $title,
122 160 'post_content' => '',
123 161 'post_status' => 'inherit',
124 162 );
125 - $attach_id = wp_insert_attachment( $attachment, $this->upload_dir . '/' . $file_webp );
163 + $file = $this->upload_dir . '/' . $file_webp;
164 + $attach_id = wp_insert_attachment( $attachment, $file );
165 +
166 + /* for XAMPP [ get_attached_file( $attach_id ): Unable to get correct value ] */
167 + $metapath_name = str_replace( $this->upload_dir . '/', '', $file );
168 + update_post_meta( $attach_id, '_wp_attached_file', $metapath_name );
169 +
126 170 wp_update_attachment_metadata( $attach_id, $metadata_webp );
127 171
128 172 $author = get_userdata( $post->post_author );
129 173 $userid = $author->ID;
@@ -138,16 +182,202 @@
138 182 'post_modified_gmt' => $postdategmt,
139 183 );
140 184 wp_update_post( $up_post );
141 185 }
186 +
187 + update_option( 'pluswebp_generate', $attach_id );
188 +
189 + /* for Media Library folders term by Organize Media Folder */
190 + do_action( 'omf_folders_term_update', $metadata_webp, $attach_id );
191 +
192 + /* for Term filter update by Organize Media Folder */
193 + do_action( 'omf_term_filter_update' );
194 +
142 195 }
143 196 }
144 197
145 198 return $metadata;
199 + }
146 200
201 + /** ==================================================
202 + * Thumbnail urls
203 + *
204 + * @param int $attach_id attach_id.
205 + * @param array $metadata metadata.
206 + * @param string $upload_url upload_url.
207 + * @return array $image_thumbnail(string), $imagethumburls(array)
208 + * @since 2.00
209 + */
210 + private function thumbnail_urls( $attach_id, $metadata, $upload_url ) {
211 +
212 + $image_attr_thumbnail = wp_get_attachment_image_src( $attach_id, 'thumbnail', true );
213 + $image_thumbnail = $image_attr_thumbnail[0];
214 +
215 + $imagethumburls = array();
216 + if ( ! empty( $metadata ) && array_key_exists( 'sizes', $metadata ) ) {
217 + $thumbnails = $metadata['sizes'];
218 + $path_file = get_post_meta( $attach_id, '_wp_attached_file', true );
219 + $filename = wp_basename( $path_file );
220 + $media_path = str_replace( $filename, '', $path_file );
221 + $media_url = $upload_url . '/' . $media_path;
222 + foreach ( $thumbnails as $key => $key2 ) {
223 + $imagethumburls[ $key ] = $media_url . $key2['file'];
224 + }
225 + }
226 +
227 + return array( $image_thumbnail, $imagethumburls );
147 228 }
148 229
149 230 /** ==================================================
231 + * Output datas
232 + *
233 + * @param int $attach_id attach_id.
234 + * @param array $metadata metadata.
235 + * @return array (string) $attachment_link, $attachment_url, $filename, $original_image_url, $original_filename, $mime_type(string), $stamptime, $file_size
236 + * @since 2.00
237 + */
238 + private function output_datas( $attach_id, $metadata ) {
239 +
240 + $attachment_link = get_attachment_link( $attach_id );
241 + $attachment_url = wp_get_attachment_url( $attach_id );
242 + $filename = wp_basename( $attachment_url );
243 + if ( ! empty( $metadata ) && array_key_exists( 'original_image', $metadata ) && ! empty( $metadata['original_image'] ) ) {
244 + $original_image_url = wp_get_original_image_url( $attach_id );
245 + $original_filename = wp_basename( $original_image_url );
246 + } else {
247 + $original_image_url = null;
248 + $original_filename = null;
249 + }
250 + $mime_type = get_post_mime_type( $attach_id );
251 +
252 + $stamptime = get_the_time( 'Y-n-j ', $attach_id ) . get_the_time( 'G:i:s', $attach_id );
253 + if ( ! empty( $metadata ) && array_key_exists( 'filesize', $metadata ) && ! empty( $metadata['filesize'] ) ) {
254 + $file_size = $metadata['filesize'];
255 + } else {
256 + $file_size = @filesize( get_attached_file( $attach_id ) );
257 + }
258 + if ( ! $file_size ) {
259 + $file_size = __( 'Could not retrieve.', 'plus-webp' );
260 + } else {
261 + $file_size = size_format( $file_size );
262 + }
263 +
264 + return array( $attachment_link, $attachment_url, $filename, $original_image_url, $original_filename, $mime_type, $stamptime, $file_size );
265 + }
266 +
267 + /** ==================================================
268 + * Get All Images
269 + *
270 + * @param array $types mime types.
271 + * @since 2.00
272 + */
273 + public function get_allimages( $types ) {
274 +
275 + $args = array(
276 + 'post_type' => 'attachment',
277 + 'post_status' => 'inherit',
278 + 'post_mime_type' => $types,
279 + 'posts_per_page' => -1,
280 + 'orderby' => 'date',
281 + 'order' => 'DESC',
282 + );
283 + $posts = get_posts( $args );
284 +
285 + global $wpdb;
286 + $webp_titles = $wpdb->get_col(
287 + "
288 + SELECT post_title
289 + FROM {$wpdb->prefix}posts
290 + WHERE post_type = 'attachment'
291 + AND post_mime_type IN ( 'image/webp' )
292 + AND post_status = 'inherit'
293 + "
294 + );
295 +
296 + $post_ids = array();
297 + $no_file_ids = array();
298 + $count = 0;
299 + foreach ( $posts as $post ) {
300 + if ( ! in_array( $post->post_title, $webp_titles ) ) {
301 + if ( file_exists( get_attached_file( $post->ID ) ) ) {
302 + $post_ids[] = $post->ID;
303 + } else {
304 + $no_file_ids[] = $post->ID;
305 + }
306 + }
307 + }
308 +
309 + return array( $post_ids, $no_file_ids );
310 + }
311 +
312 + /** ==================================================
313 + * Mail messages hook
314 + *
315 + * @param array $messages messages.
316 + * @param int $webp_id webp_id.
317 + *
318 + * @since 4.00
319 + */
320 + public function mail_messages( $messages, $webp_id ) {
321 +
322 + $metadata = wp_get_attachment_metadata( $webp_id );
323 +
324 + $message = null;
325 + if ( $metadata ) {
326 + /* Thumbnail urls */
327 + list( $image_thumbnail, $imagethumburls ) = $this->thumbnail_urls( $webp_id, $metadata, $this->upload_url );
328 + /* Output datas*/
329 + list( $attachment_link, $attachment_url, $filename, $original_image_url, $original_filename, $mime_type, $stamptime, $file_size ) = $this->output_datas( $webp_id, $metadata );
330 +
331 + $message = 'ID: ' . $webp_id . "\n";
332 + $message .= __( 'Title' ) . ': ' . get_the_title( $webp_id ) . "\n";
333 + $message .= __( 'Permalink:' ) . ' ' . $attachment_link . "\n";
334 + $message .= 'URL: ' . $attachment_url . "\n";
335 + $message .= __( 'File name:' ) . ' ' . $filename . "\n";
336 + if ( ! empty( $original_image_url ) ) {
337 + $message .= __( 'Original URL:', 'plus-webp' ) . ' ' . $original_image_url . "\n";
338 + $message .= __( 'Original File name:', 'plus-webp' ) . ' ' . $original_filename . "\n";
339 + }
340 + $message .= __( 'Date/Time' ) . ': ' . $stamptime . "\n";
341 + $message .= __( 'File size:' ) . ' ' . $file_size . "\n";
342 + if ( ! empty( $imagethumburls ) ) {
343 + foreach ( $imagethumburls as $thumbsize => $imagethumburl ) {
344 + $message .= $thumbsize . ': ' . $imagethumburl . "\n";
345 + }
346 + }
347 + $message .= "\n";
348 + $messages[] = $message;
349 + }
350 +
351 + return array( $message, $messages );
352 + }
353 +
354 + /** ==================================================
355 + * Mail sent for Generate Messages
356 + *
357 + * @param array $messages mail messages.
358 + * @param int $count convert count.
359 + * @since 4.02
360 + */
361 + public function mail_generate_message( $messages, $count ) {
362 +
363 + if ( function_exists( 'wp_date' ) ) {
364 + $now_date_time = wp_date( 'Y-m-d H:i:s' );
365 + } else {
366 + $now_date_time = date_i18n( 'Y-m-d H:i:s' );
367 + }
368 + /* translators: Date and Time */
369 + $message_head = sprintf( __( 'Plus WebP : %s', 'plus-webp' ), $now_date_time ) . "\r\n\r\n";
370 + /* translators: Generated count */
371 + $message_head .= sprintf( __( 'Webp generated %d.', 'plus-webp' ), $count ) . "\r\n\r\n";
372 +
373 + $to = get_option( 'admin_email' );
374 + /* translators: blogname for subject */
375 + $subject = sprintf( __( '[%s] WebP generate', 'plus-webp' ), get_option( 'blogname' ) );
376 + wp_mail( $to, $subject, $message_head . implode( $messages ) );
377 + }
378 +
379 + /** ==================================================
150 380 * Webp create
151 381 *
152 382 * @param string $filename input filename for pictures.
153 383 * @param string $mime_type mimetype.
@@ -165,8 +395,9 @@
165 395 }
166 396
167 397 $pluswebp_settings = get_option( 'pluswebp' );
168 398 @set_time_limit( 60 );
399 + wp_raise_memory_limit( 'pluswebp' );
169 400
170 401 $ret = false;
171 402 switch ( $mime_type ) {
172 403 case 'image/jpeg':
@@ -171,9 +402,10 @@
171 402 switch ( $mime_type ) {
172 403 case 'image/jpeg':
173 404 $src = imagecreatefromjpeg( $filename );
174 405 $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
175 - imagefill( $img, 0, 0, imagecolorallocate( $img, 255, 255, 255 ) );
406 + $bgcolor = imagecolorallocate( $img, 255, 255, 255 );
407 + imagefill( $img, 0, 0, $bgcolor );
176 408 imagealphablending( $img, true );
177 409 break;
178 410 case 'image/png':
179 411 $src = imagecreatefrompng( $filename );
@@ -179,8 +411,11 @@
179 411 $src = imagecreatefrompng( $filename );
180 412 $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
181 413 imagealphablending( $img, false );
182 414 imagesavealpha( $img, true );
415 + $bgcolor = imagecolorallocatealpha( $img, 0, 0, 0, 127 );
416 + imagefill( $img, 0, 0, $bgcolor );
417 + imagecolortransparent( $img, $bgcolor );
183 418 break;
184 419 case 'image/bmp':
185 420 $src = imagecreatefrombmp( $filename );
186 421 $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
@@ -199,9 +434,8 @@
199 434 $ret = imagewebp( $img, $filename_webp, $pluswebp_settings['quality'] );
200 435 imagedestroy( $img );
201 436
202 437 return $ret;
203 -
204 438 }
205 439
206 440 /** ==================================================
207 441 * Change ext
@@ -207,20 +441,24 @@
207 441 * Change ext
208 442 *
209 443 * @param string $before_file_name before_file_name.
210 444 * @param string $ext ext.
445 + * @param bool $addext addext.
211 446 * @return array $after_file_name after_file_name.
212 447 * @since 1.00
213 448 */
214 - private function change_ext( $before_file_name, $ext ) {
449 + private function change_ext( $before_file_name, $ext, $addext ) {
215 450
216 - $exts = explode( '.', $before_file_name );
217 - $before_ext = '.' . end( $exts );
218 - $after_ext = '.' . $ext;
219 - $after_file_name = str_replace( $before_ext, $after_ext, $before_file_name );
451 + if ( $addext ) {
452 + $after_file_name = $before_file_name . '.' . $ext;
453 + } else {
454 + $exts = explode( '.', $before_file_name );
455 + $before_ext = '.' . end( $exts );
456 + $after_ext = '.' . $ext;
457 + $after_file_name = str_replace( $before_ext, $after_ext, $before_file_name );
458 + }
220 459
221 460 return $after_file_name;
222 -
223 461 }
224 462
225 463 /** ==================================================
226 464 * Change DB
@@ -235,14 +473,19 @@
235 473
236 474 /* Replace */
237 475 $wpdb->query(
238 476 $wpdb->prepare(
239 - "UPDATE `$wpdb->posts` SET post_content = replace(post_content, %s, %s)",
477 + "
478 + UPDATE {$wpdb->prefix}posts
479 + SET post_content = replace( post_content, %s, %s )
480 + ",
240 481 $before_url,
241 482 $after_url
242 483 )
243 484 );
244 485
486 + /* Advanced change database */
487 + list( $before_url, $after_url ) = apply_filters( 'plus_webp_advanced_change_db', $before_url, $after_url );
245 488 }
246 489
247 490 /** ==================================================
248 491 * Upload Path
@@ -279,10 +522,84 @@
279 522 $upload_url = untrailingslashit( $upload_url );
280 523 $upload_path = untrailingslashit( $upload_path );
281 524
282 525 return array( $upload_dir, $upload_url, $upload_path );
526 + }
283 527
528 + /** ==================================================
529 + * Real Url
530 + *
531 + * @param string $base base.
532 + * @param string $relationalpath relationalpath.
533 + * @return string $realurl realurl.
534 + * @since 1.00
535 + */
536 + private function realurl( $base, $relationalpath ) {
537 +
538 + $parse = array(
539 + 'scheme' => null,
540 + 'user' => null,
541 + 'pass' => null,
542 + 'host' => null,
543 + 'port' => null,
544 + 'query' => null,
545 + 'fragment' => null,
546 + );
547 + $parse = wp_parse_url( $base );
548 +
549 + if ( strpos( $parse['path'], '/', ( strlen( $parse['path'] ) - 1 ) ) !== false ) {
550 + $parse['path'] .= '.';
551 + }
552 +
553 + if ( preg_match( '#^https?://#', $relationalpath ) ) {
554 + return $relationalpath;
555 + } elseif ( preg_match( '#^/.*$#', $relationalpath ) ) {
556 + return $parse['scheme'] . '://' . $parse['host'] . $relationalpath;
557 + } else {
558 + $base_path = explode( '/', dirname( $parse['path'] ) );
559 + $rel_path = explode( '/', $relationalpath );
560 + foreach ( $rel_path as $rel_dir_name ) {
561 + if ( '.' === $rel_dir_name ) {
562 + array_shift( $base_path );
563 + array_unshift( $base_path, '' );
564 + } elseif ( '..' === $rel_dir_name ) {
565 + array_pop( $base_path );
566 + if ( count( $base_path ) === 0 ) {
567 + $base_path = array( '' );
568 + }
569 + } else {
570 + array_push( $base_path, $rel_dir_name );
571 + }
572 + }
573 + $path = implode( '/', $base_path );
574 + return $parse['scheme'] . '://' . $parse['host'] . $path;
575 + }
284 576 }
285 577
286 -}
578 + /** ==================================================
579 + * Filter Raise Memory limit
580 + *
581 + * @since 3.00
582 + *
583 + * @param string $filtered_limit Memory limit.
584 + */
585 + public function raise_memory_limit( $filtered_limit ) {
287 586
587 + return '256M';
588 + }
288 589
590 + /** ==================================================
591 + * Filter the output mime types for a given input mime type and image size.
592 + *
593 + * @since 3.00
594 + *
595 + * @param array $image_mime_transforms A map with the valid mime transforms where the key is the source file mime type
596 + * and the value is one or more mime file types to generate.
597 + * @param int $attachment_id The ID of the attachment where the hook was dispatched.
598 + */
599 + public function control_mime_type( $image_mime_transforms, $attachment_id ) {
600 +
601 + $image_mime_transforms = array();
602 +
603 + return $image_mime_transforms;
604 + }
605 +}