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