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 +353 -27 1.064.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
@@ -73,29 +84,51 @@
73 84 $pluswebp_settings = get_option( 'pluswebp' );
74 85 $replace = $pluswebp_settings['replace'];
75 86
76 87 $mime_type = get_post_mime_type( $attachment_id );
77 - if ( 'image/jpeg' === $mime_type || 'image/png' === $mime_type || 'image/bmp' === $mime_type || 'image/gif' === $mime_type ) {
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.
@@ -163,30 +393,43 @@
163 393 if ( file_exists( $filename_webp ) ) {
164 394 return false;
165 395 }
166 396
397 + $pluswebp_settings = get_option( 'pluswebp' );
398 + @set_time_limit( 60 );
399 + wp_raise_memory_limit( 'pluswebp' );
400 +
167 401 $ret = false;
168 402 switch ( $mime_type ) {
169 403 case 'image/jpeg':
170 404 $src = imagecreatefromjpeg( $filename );
405 + $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
406 + $bgcolor = imagecolorallocate( $img, 255, 255, 255 );
407 + imagefill( $img, 0, 0, $bgcolor );
408 + imagealphablending( $img, true );
171 409 break;
172 410 case 'image/png':
173 411 $src = imagecreatefrompng( $filename );
412 + $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
413 + imagealphablending( $img, false );
414 + imagesavealpha( $img, true );
415 + $bgcolor = imagecolorallocatealpha( $img, 0, 0, 0, 127 );
416 + imagefill( $img, 0, 0, $bgcolor );
417 + imagecolortransparent( $img, $bgcolor );
174 418 break;
175 419 case 'image/bmp':
176 420 $src = imagecreatefrombmp( $filename );
421 + $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
177 422 break;
178 423 case 'image/gif':
179 424 $src = imagecreatefromgif( $filename );
425 + $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
426 + $bgcolor = imagecolorallocatealpha( $img, 0, 0, 0, 127 );
427 + imagefill( $img, 0, 0, $bgcolor );
428 + imagecolortransparent( $img, $bgcolor );
180 429 break;
181 430 }
182 431
183 - $pluswebp_settings = get_option( 'pluswebp' );
184 - @set_time_limit( 60 );
185 -
186 - $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
187 - imagefill( $img, 0, 0, imagecolorallocate( $img, 255, 255, 255 ) );
188 - imagealphablending( $img, true );
189 432 imagecopy( $img, $src, 0, 0, 0, 0, imagesx( $src ), imagesy( $src ) );
190 433 imagedestroy( $src );
191 434 $ret = imagewebp( $img, $filename_webp, $pluswebp_settings['quality'] );
192 435 imagedestroy( $img );
@@ -191,9 +434,8 @@
191 434 $ret = imagewebp( $img, $filename_webp, $pluswebp_settings['quality'] );
192 435 imagedestroy( $img );
193 436
194 437 return $ret;
195 -
196 438 }
197 439
198 440 /** ==================================================
199 441 * Change ext
@@ -199,19 +441,24 @@
199 441 * Change ext
200 442 *
201 443 * @param string $before_file_name before_file_name.
202 444 * @param string $ext ext.
445 + * @param bool $addext addext.
203 446 * @return array $after_file_name after_file_name.
204 447 * @since 1.00
205 448 */
206 - private function change_ext( $before_file_name, $ext ) {
449 + private function change_ext( $before_file_name, $ext, $addext ) {
207 450
208 - $exts = explode( '.', wp_basename( $before_file_name ) );
209 - $file_ext = '.' . end( $exts );
210 - $after_file_name = rtrim( $before_file_name, $file_ext ) . '.' . $ext;
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 + }
211 459
212 460 return $after_file_name;
213 -
214 461 }
215 462
216 463 /** ==================================================
217 464 * Change DB
@@ -226,14 +473,19 @@
226 473
227 474 /* Replace */
228 475 $wpdb->query(
229 476 $wpdb->prepare(
230 - "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 + ",
231 481 $before_url,
232 482 $after_url
233 483 )
234 484 );
235 485
486 + /* Advanced change database */
487 + list( $before_url, $after_url ) = apply_filters( 'plus_webp_advanced_change_db', $before_url, $after_url );
236 488 }
237 489
238 490 /** ==================================================
239 491 * Upload Path
@@ -270,10 +522,84 @@
270 522 $upload_url = untrailingslashit( $upload_url );
271 523 $upload_path = untrailingslashit( $upload_path );
272 524
273 525 return array( $upload_dir, $upload_url, $upload_path );
526 + }
274 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 + }
275 576 }
276 577
277 -}
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 ) {
278 586
587 + return '256M';
588 + }
279 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 +}