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 +357 -30 1.054.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;
@@ -53,12 +55,21 @@
53 55 * @since 1.00
54 56 */
55 57 public function __construct() {
56 58
57 - list($this->upload_dir, $this->upload_url, $this->upload_path) = $this->upload_dir_url_path();
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,15 +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 + }
147 + /* Replace */
148 + $this->change_db( $this->upload_url . '/' . $metadata['file'], $this->upload_url . '/' . $file_webp );
111 149 /* for hook */
112 150 $metadata = $metadata_webp;
113 - $this->change_db( $this->upload_url . '/' . $metadata['file'], $this->upload_url . '/' . $file_webp );
151 + /* for mail */
152 + $attach_id = $attachment_id;
114 153 } else {
115 154 $post = get_post( $attachment_id );
116 - $title = get_the_title( $post );
155 + $title = $post->post_title;
117 156 $attachment = array(
118 157 'guid' => $this->upload_url . '/' . $file_webp,
119 158 'post_mime_type' => 'image/webp',
120 159 'post_title' => $title,
@@ -120,9 +159,15 @@
120 159 'post_title' => $title,
121 160 'post_content' => '',
122 161 'post_status' => 'inherit',
123 162 );
124 - $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 +
125 170 wp_update_attachment_metadata( $attach_id, $metadata_webp );
126 171
127 172 $author = get_userdata( $post->post_author );
128 173 $userid = $author->ID;
@@ -137,16 +182,202 @@
137 182 'post_modified_gmt' => $postdategmt,
138 183 );
139 184 wp_update_post( $up_post );
140 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 +
141 195 }
142 196 }
143 197
144 198 return $metadata;
199 + }
145 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 );
146 228 }
147 229
148 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 + /** ==================================================
149 380 * Webp create
150 381 *
151 382 * @param string $filename input filename for pictures.
152 383 * @param string $mime_type mimetype.
@@ -162,30 +393,43 @@
162 393 if ( file_exists( $filename_webp ) ) {
163 394 return false;
164 395 }
165 396
397 + $pluswebp_settings = get_option( 'pluswebp' );
398 + @set_time_limit( 60 );
399 + wp_raise_memory_limit( 'pluswebp' );
400 +
166 401 $ret = false;
167 402 switch ( $mime_type ) {
168 403 case 'image/jpeg':
169 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 );
170 409 break;
171 410 case 'image/png':
172 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 );
173 418 break;
174 419 case 'image/bmp':
175 420 $src = imagecreatefrombmp( $filename );
421 + $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
176 422 break;
177 423 case 'image/gif':
178 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 );
179 429 break;
180 430 }
181 431
182 - $pluswebp_settings = get_option( 'pluswebp' );
183 - @set_time_limit( 60 );
184 -
185 - $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
186 - imagefill( $img, 0, 0, imagecolorallocate( $img, 255, 255, 255 ) );
187 - imagealphablending( $img, true );
188 432 imagecopy( $img, $src, 0, 0, 0, 0, imagesx( $src ), imagesy( $src ) );
189 433 imagedestroy( $src );
190 434 $ret = imagewebp( $img, $filename_webp, $pluswebp_settings['quality'] );
191 435 imagedestroy( $img );
@@ -190,9 +434,8 @@
190 434 $ret = imagewebp( $img, $filename_webp, $pluswebp_settings['quality'] );
191 435 imagedestroy( $img );
192 436
193 437 return $ret;
194 -
195 438 }
196 439
197 440 /** ==================================================
198 441 * Change ext
@@ -198,19 +441,24 @@
198 441 * Change ext
199 442 *
200 443 * @param string $before_file_name before_file_name.
201 444 * @param string $ext ext.
445 + * @param bool $addext addext.
202 446 * @return array $after_file_name after_file_name.
203 447 * @since 1.00
204 448 */
205 - private function change_ext( $before_file_name, $ext ) {
449 + private function change_ext( $before_file_name, $ext, $addext ) {
206 450
207 - $exts = explode( '.', wp_basename( $before_file_name ) );
208 - $file_ext = '.' . end( $exts );
209 - $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 + }
210 459
211 460 return $after_file_name;
212 -
213 461 }
214 462
215 463 /** ==================================================
216 464 * Change DB
@@ -222,17 +470,22 @@
222 470 private function change_db( $before_url, $after_url ) {
223 471
224 472 global $wpdb;
225 473
226 - // Replace.
474 + /* Replace */
227 475 $wpdb->query(
228 476 $wpdb->prepare(
229 - "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 + ",
230 481 $before_url,
231 482 $after_url
232 483 )
233 484 );
234 485
486 + /* Advanced change database */
487 + list( $before_url, $after_url ) = apply_filters( 'plus_webp_advanced_change_db', $before_url, $after_url );
235 488 }
236 489
237 490 /** ==================================================
238 491 * Upload Path
@@ -269,10 +522,84 @@
269 522 $upload_url = untrailingslashit( $upload_url );
270 523 $upload_path = untrailingslashit( $upload_path );
271 524
272 525 return array( $upload_dir, $upload_url, $upload_path );
526 + }
273 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 + }
274 576 }
275 577
276 -}
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 ) {
277 586
587 + return '256M';
588 + }
278 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 +}