PluginProbe
Plus WebP or AVIF / 2.06
Plus WebP or AVIF v2.06
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
plus-webp / lib / class-pluswebp.php

class-pluswebp.php in Plus WebP or AVIF 2.06, at lib/class-pluswebp.php

701 lines 23.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plus WebP
4 *
5 * @package Plus WebP
6 * @subpackage PlusWebp Main function
7 /* Copyright (c) 2019- Katsushi Kawamori (email : dodesyoswift312@gmail.com)
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; version 2 of the License.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22 $pluswebp = new PlusWebp();
23
24 /** ==================================================
25 * Class Main function
26 *
27 * @since 1.00
28 */
29 class PlusWebp {
30
31 /** ==================================================
32 * Dir
33 *
34 * @var $upload_dir DIR.
35 */
36 private $upload_dir;
37
38 /** ==================================================
39 * URL
40 *
41 * @var $upload_url URL.
42 */
43 private $upload_url;
44
45 /** ==================================================
46 * Path
47 *
48 * @var $upload_path PATH.
49 */
50 private $upload_path;
51
52 /** ==================================================
53 * Construct
54 *
55 * @since 1.00
56 */
57 public function __construct() {
58
59 list( $this->upload_dir, $this->upload_url, $this->upload_path ) = $this->upload_dir_url_path();
60
61 add_filter( 'wp_generate_attachment_metadata', array( $this, 'generate_webp' ), 10, 2 );
62 add_action( 'pluswebp_mail_send', array( $this, 'mail_send' ), 10, 1 );
63
64 /* Ajax */
65 $action1 = 'bulkgeneratewebp-ajax-action';
66 $action2 = 'bulkgeneratewebp_message';
67 add_action( 'wp_ajax_' . $action1, array( $this, 'bulkgeneratewebp_update_callback' ) );
68 add_action( 'wp_ajax_' . $action2, array( $this, 'bulkgeneratewebp_message_callback' ) );
69
70 }
71
72 /** ==================================================
73 * Webp generate
74 *
75 * @param array $metadata metadata.
76 * @param int $attachment_id ID.
77 * @return array $metadata metadata.
78 * @since 1.00
79 */
80 public function generate_webp( $metadata, $attachment_id ) {
81
82 $pluswebp_settings = get_option( 'pluswebp' );
83 $replace = $pluswebp_settings['replace'];
84
85 $mime_type = get_post_mime_type( $attachment_id );
86 if ( in_array( $mime_type, $pluswebp_settings['types'] ) ) {
87 $metadata_webp = $metadata;
88 $file_webp = $this->change_ext( $metadata['file'], 'webp', $pluswebp_settings['addext'] );
89 $metadata_webp['file'] = $file_webp;
90 foreach ( (array) $metadata['sizes'] as $key => $value ) {
91 $file_thumb = $value['file'];
92 $file_thumb_webp = $this->change_ext( $file_thumb, 'webp', $pluswebp_settings['addext'] );
93 if ( '.' === dirname( $file_webp ) ) {
94 $dir_name_url = '/';
95 $dir_name_path = wp_normalize_path( '/' );
96 } else {
97 $dir_name_url = '/' . dirname( $file_webp ) . '/';
98 $dir_name_path = wp_normalize_path( $dir_name_url );
99 }
100 $url = $this->upload_url . $dir_name_url;
101 $path = $this->upload_dir . $dir_name_path;
102 $ret = $this->create_webp( $path . $file_thumb, $mime_type, $path . $file_thumb_webp );
103 if ( $ret ) {
104 $metadata_webp['sizes'][ $key ]['file'] = $file_thumb_webp;
105 $metadata_webp['sizes'][ $key ]['mime-type'] = 'image/webp';
106 if ( $replace ) {
107 unlink( $path . $file_thumb );
108 $this->change_db( $url . $file_thumb, $url . $file_thumb_webp );
109 }
110 }
111 }
112 $org_img_file = null;
113 if ( array_key_exists( 'original_image', $metadata ) && ! empty( $metadata['original_image'] ) ) {
114 $org_img_file = wp_normalize_path( wp_get_original_image_path( $attachment_id, false ) );
115 $org_webp_file = $this->change_ext( $org_img_file, 'webp', $pluswebp_settings['addext'] );
116 $ret = $this->create_webp( $org_img_file, $mime_type, $org_webp_file );
117 if ( $ret ) {
118 $metadata_webp['original_image'] = wp_basename( $org_webp_file );
119 }
120 }
121
122 $ret = $this->create_webp( $this->upload_dir . '/' . $metadata['file'], $mime_type, $this->upload_dir . '/' . $file_webp );
123 if ( $ret ) {
124 if ( $replace ) {
125 $up_post = array(
126 'ID' => $attachment_id,
127 'guid' => $this->upload_url . '/' . $file_webp,
128 'post_mime_type' => 'image/webp',
129 );
130 wp_update_post( $up_post );
131 update_post_meta( $attachment_id, '_wp_attached_file', $file_webp );
132 /* for bulk generate */
133 update_post_meta( $attachment_id, '_wp_attachment_metadata', $metadata_webp );
134 /* delete org file */
135 unlink( $this->upload_dir . '/' . $metadata['file'] );
136 if ( $org_img_file ) {
137 unlink( $org_img_file );
138 }
139 /* Replace */
140 $this->change_db( $this->upload_url . '/' . $metadata['file'], $this->upload_url . '/' . $file_webp );
141 /* for hook */
142 $metadata = $metadata_webp;
143 /* for mail */
144 $attach_id = $attachment_id;
145 } else {
146 $post = get_post( $attachment_id );
147 $title = get_the_title( $post );
148 $attachment = array(
149 'guid' => $this->upload_url . '/' . $file_webp,
150 'post_mime_type' => 'image/webp',
151 'post_title' => $title,
152 'post_content' => '',
153 'post_status' => 'inherit',
154 );
155 $file = $this->upload_dir . '/' . $file_webp;
156 $attach_id = wp_insert_attachment( $attachment, $file );
157
158 /* for XAMPP [ get_attached_file( $attach_id ): Unable to get correct value ] */
159 $metapath_name = str_replace( $this->upload_dir . '/', '', $file );
160 update_post_meta( $attach_id, '_wp_attached_file', $metapath_name );
161
162 wp_update_attachment_metadata( $attach_id, $metadata_webp );
163
164 $author = get_userdata( $post->post_author );
165 $userid = $author->ID;
166 $postdate = get_the_date( 'Y-m-d H:i:s', $attachment_id );
167 $postdategmt = get_gmt_from_date( $postdate );
168 $up_post = array(
169 'ID' => $attach_id,
170 'post_author' => $userid,
171 'post_date' => $postdate,
172 'post_date_gmt' => $postdategmt,
173 'post_modified' => $postdate,
174 'post_modified_gmt' => $postdategmt,
175 );
176 wp_update_post( $up_post );
177 }
178
179 $ids = get_option( 'pluswebp_generate' );
180 $ids[] = $attach_id;
181 update_option( 'pluswebp_generate', $ids );
182
183 }
184 }
185
186 return $metadata;
187
188 }
189
190 /** ==================================================
191 * IDs Callback
192 *
193 * @since 2.00
194 */
195 public function bulkgeneratewebp_update_callback() {
196
197 $action1 = 'bulkgeneratewebp-ajax-action';
198 if ( check_ajax_referer( $action1, 'nonce', false ) ) {
199 if ( current_user_can( 'manage_options' ) ) {
200 if ( ! empty( $_POST['id'] ) ) {
201 $id = absint( $_POST['id'] );
202 } else {
203 return;
204 }
205 if ( ! wp_get_attachment_url( $id ) ) {
206 $error_string = __( 'No media!', 'plus-webp' );
207 $output_html = '<div>ID: ' . $id . ' <span style="color: red;">' . $error_string . '</span></div>';
208 } else {
209 $output_html = $this->output_html( $id );
210 }
211 if ( ! empty( $output_html ) ) {
212 header( 'Content-type: text/html; charset=UTF-8' );
213 $allowed_output_html = array(
214 'a' => array(
215 'href' => array(),
216 'target' => array(),
217 'rel' => array(),
218 'style' => array(),
219 ),
220 'img' => array(
221 'src' => array(),
222 'width' => array(),
223 'height' => array(),
224 'style' => array(),
225 ),
226 'div' => array(
227 'style' => array(),
228 'class' => array(),
229 ),
230 'font' => array(
231 'color' => array(),
232 ),
233 'ul' => array(),
234 'li' => array(),
235 'span' => array(
236 'class' => array(),
237 'style' => array(),
238 ),
239 );
240 echo wp_kses( $output_html, $allowed_output_html );
241 }
242 }
243 } else {
244 status_header( '403' );
245 echo 'Forbidden';
246 }
247
248 wp_die();
249
250 }
251
252 /** ==================================================
253 * Output html for Ajax
254 *
255 * @param array $attach_id attach_id.
256 * @since 2.00
257 */
258 private function output_html( $attach_id ) {
259
260 include_once ABSPATH . 'wp-admin/includes/image.php';
261
262 /* Generate thumbnails */
263 $metadata_org = wp_get_attachment_metadata( $attach_id );
264 do_action( 'wp_generate_attachment_metadata', $metadata_org, $attach_id );
265 if ( get_option( 'pluswebp_generate' ) ) {
266 $ids = get_option( 'pluswebp_generate' );
267 delete_option( 'pluswebp_generate' );
268 $webp_id = $ids[0];
269 $metadata = wp_get_attachment_metadata( $webp_id );
270
271 /* Thumbnail urls */
272 list( $image_thumbnail, $imagethumburls ) = $this->thumbnail_urls( $webp_id, $metadata, $this->upload_url );
273 /* Output datas*/
274 list( $attachment_link, $attachment_url, $filename, $original_image_url, $original_filename, $mime_type, $stamptime, $file_size ) = $this->output_datas( $webp_id, $metadata );
275
276 $output_html = '<div style="border-bottom: 1px solid; padding-top: 5px; padding-bottom: 5px;">';
277 $output_html .= '<img width="40" height="40" src="' . $image_thumbnail . '" style="float: left; margin: 5px;">';
278 $output_html .= '<div style="overflow: hidden;">';
279 $output_html .= '<div>ID: ' . $webp_id . '</div>';
280 $output_html .= '<div>' . __( 'Title' ) . ': ' . get_the_title( $webp_id ) . '</div>';
281 $output_html .= '<div>' . __( 'Permalink:' ) . ' <a href="' . $attachment_link . '" target="_blank" rel="noopener noreferrer" style="text-decoration: none; word-break: break-all;">' . $attachment_link . '</a></div>';
282 $output_html .= '<div>URL: <a href="' . $attachment_url . '" target="_blank" rel="noopener noreferrer" style="text-decoration: none; word-break: break-all;">' . $attachment_url . '</a></div>';
283 $output_html .= '<div>' . __( 'File name:' ) . ' ' . $filename . '</div>';
284 if ( ! empty( $original_image_url ) ) {
285 $output_html .= '<div>' . __( 'Original URL', 'plus-webp' ) . ': <a href="' . $original_image_url . '" target="_blank" rel="noopener noreferrer" style="text-decoration: none; word-break: break-all;">' . $original_image_url . '</a></div>';
286 $output_html .= '<div>' . __( 'Original File name', 'plus-webp' ) . ': ' . $original_filename . '</div>';
287 }
288 $output_html .= '<div>' . __( 'Date/Time' ) . ': ' . $stamptime . '</div>';
289 $output_html .= '<div>' . __( 'File type:' ) . ' ' . $mime_type . '</div>';
290 $output_html .= '<div>' . __( 'File size:' ) . ' ' . $file_size . '</div>';
291 if ( ! empty( $imagethumburls ) ) {
292 $output_html .= '<div>' . __( 'Images' ) . ': ';
293 foreach ( $imagethumburls as $thumbsize => $imagethumburl ) {
294 $output_html .= '[<a href="' . $imagethumburl . '" target="_blank" rel="noopener noreferrer" style="text-decoration: none; word-break: break-all;">' . $thumbsize . '</a>]';
295 }
296 $output_html .= '</div>';
297 }
298 $output_html .= '</div></div>';
299 } else {
300 $output_html = null;
301 }
302
303 return $output_html;
304
305 }
306
307 /** ==================================================
308 * Thumbnail urls
309 *
310 * @param int $attach_id attach_id.
311 * @param array $metadata metadata.
312 * @param string $upload_url upload_url.
313 * @return array $image_thumbnail(string), $imagethumburls(array)
314 * @since 2.00
315 */
316 private function thumbnail_urls( $attach_id, $metadata, $upload_url ) {
317
318 $image_attr_thumbnail = wp_get_attachment_image_src( $attach_id, 'thumbnail', true );
319 $image_thumbnail = $image_attr_thumbnail[0];
320
321 $imagethumburls = array();
322 if ( ! empty( $metadata ) && array_key_exists( 'sizes', $metadata ) ) {
323 $thumbnails = $metadata['sizes'];
324 $path_file = get_post_meta( $attach_id, '_wp_attached_file', true );
325 $filename = wp_basename( $path_file );
326 $media_path = str_replace( $filename, '', $path_file );
327 $media_url = $upload_url . '/' . $media_path;
328 foreach ( $thumbnails as $key => $key2 ) {
329 $imagethumburls[ $key ] = $media_url . $key2['file'];
330 }
331 }
332
333 return array( $image_thumbnail, $imagethumburls );
334
335 }
336
337 /** ==================================================
338 * Output datas
339 *
340 * @param int $attach_id attach_id.
341 * @param array $metadata metadata.
342 * @return array (string) $attachment_link, $attachment_url, $filename, $original_image_url, $original_filename, $mime_type(string), $stamptime, $file_size
343 * @since 2.00
344 */
345 private function output_datas( $attach_id, $metadata ) {
346
347 $attachment_link = get_attachment_link( $attach_id );
348 $attachment_url = wp_get_attachment_url( $attach_id );
349 $filename = wp_basename( $attachment_url );
350 if ( ! empty( $metadata ) && array_key_exists( 'original_image', $metadata ) && ! empty( $metadata['original_image'] ) ) {
351 $original_image_url = wp_get_original_image_url( $attach_id );
352 $original_filename = wp_basename( $original_image_url );
353 } else {
354 $original_image_url = null;
355 $original_filename = null;
356 }
357 $mime_type = get_post_mime_type( $attach_id );
358
359 $stamptime = get_the_time( 'Y-n-j ', $attach_id ) . get_the_time( 'G:i:s', $attach_id );
360 if ( ! empty( $metadata ) && array_key_exists( 'filesize', $metadata ) && ! empty( $metadata['filesize'] ) ) {
361 $file_size = $metadata['filesize'];
362 } else {
363 $file_size = @filesize( get_attached_file( $attach_id ) );
364 }
365 if ( ! $file_size ) {
366 $file_size = __( 'Could not retrieve.', 'plus-webp' );
367 } else {
368 $file_size = size_format( $file_size );
369 }
370
371 return array( $attachment_link, $attachment_url, $filename, $original_image_url, $original_filename, $mime_type, $stamptime, $file_size );
372
373 }
374
375 /** ==================================================
376 * Messages Callback
377 *
378 * @since 2.00
379 */
380 public function bulkgeneratewebp_message_callback() {
381
382 $action2 = 'bulkgeneratewebp_message';
383 if ( check_ajax_referer( $action2, 'nonce', false ) ) {
384 $error_count = 0;
385 $error_update = null;
386 $success_count = 0;
387 if ( ! empty( $_POST['error_count'] ) ) {
388 $error_count = absint( $_POST['error_count'] );
389 }
390 if ( ! empty( $_POST['error_update'] ) ) {
391 $error_update = sanitize_text_field( wp_unslash( $_POST['error_update'] ) );
392 }
393 if ( ! empty( $_POST['success_count'] ) ) {
394 $success_count = absint( $_POST['success_count'] );
395 }
396
397 $back_html = '<strong><a style="text-decoration: none;" href="' . admin_url( 'tools.php?page=pluswebp' ) . '">' . __( 'Back' ) . '</a></strong>';
398
399 $output_html = null;
400 if ( $error_count > 0 ) {
401 /* translators: error message %1$d: media count %2$s: back link */
402 $error_message = sprintf( __( 'Errored to the generation of %1$d medias.', 'plus-webp' ), $error_count, $back_html );
403 $output_html .= '<div class="notice notice-error is-dismissible"><ul><li><div>' . $error_message . '</div>' . $error_update . '</li></ul></div>';
404 }
405 if ( $success_count > 0 ) {
406 /* translators: success message %1$d: media count %2$s: back link */
407 $success_message = sprintf( __( 'Succeeded to the generation webp of %1$d medias for Media Library. %2$s', 'plus-webp' ), $success_count, $back_html );
408 $output_html .= '<div class="notice notice-success is-dismissible"><ul><li><div>' . $success_message . '</li></ul></div>';
409 }
410
411 header( 'Content-type: text/html; charset=UTF-8' );
412 $allowed_output_html = array(
413 'div' => array(
414 'class' => array(),
415 ),
416 'ul' => array(),
417 'li' => array(),
418 'strong' => array(),
419 'a' => array(
420 'style' => array(),
421 'href' => array(),
422 ),
423 );
424 echo wp_kses( $output_html, $allowed_output_html );
425 }
426
427 wp_die();
428
429 }
430
431 /** ==================================================
432 * Mail send hook
433 *
434 * @param string $to to.
435 * @since 1.09
436 */
437 public function mail_send( $to ) {
438
439 $post_ids = get_option( 'pluswebp_generate' );
440 delete_option( 'pluswebp_generate' );
441
442 if ( function_exists( 'wp_date' ) ) {
443 $now_date_time = wp_date( 'Y-m-d H:i:s' );
444 } else {
445 $now_date_time = date_i18n( 'Y-m-d H:i:s' );
446 }
447 $pluswebp_mail_send = array();
448 $pluswebp_mail_send['datetime'] = $now_date_time;
449
450 /* translators: Date and Time */
451 $message = sprintf( __( 'Plus WebP : %s', 'plus-webp' ), $now_date_time ) . "\r\n\r\n";
452
453 if ( ! empty( $post_ids ) ) {
454
455 $message .= __( 'Generation of WebP is complete.', 'plus-webp' ) . "\r\n\r\n";
456 $pluswebp_mail_send['count'] = count( $post_ids );
457
458 $count = 0;
459 foreach ( $post_ids as $attach_id ) {
460 $metadata = wp_get_attachment_metadata( $attach_id );
461
462 /* Thumbnail urls */
463 list( $image_thumbnail, $imagethumburls ) = $this->thumbnail_urls( $attach_id, $metadata, $this->upload_url );
464 /* Output datas*/
465 list( $attachment_link, $attachment_url, $filename, $original_image_url, $original_filename, $mime_type, $stamptime, $file_size ) = $this->output_datas( $attach_id, $metadata );
466
467 $count++;
468 $message .= __( 'Count' ) . ': ' . $count . "\n";
469 $message .= 'ID: ' . $attach_id . "\n";
470 $message .= __( 'Title' ) . ': ' . get_the_title( $attach_id ) . "\n";
471 $message .= __( 'Permalink:' ) . ' ' . $attachment_link . "\n";
472 $message .= 'URL: ' . $attachment_url . "\n";
473 $message .= __( 'File name:' ) . ' ' . $filename . "\n";
474 if ( ! empty( $original_image_url ) ) {
475 $message .= __( 'Original URL:', 'plus-webp' ) . ' ' . $original_image_url . "\n";
476 $message .= __( 'Original File name:', 'plus-webp' ) . ' ' . $original_filename . "\n";
477 }
478 $message .= __( 'Date/Time' ) . ': ' . $stamptime . "\n";
479 $message .= __( 'File size:' ) . ' ' . $file_size . "\n";
480 if ( ! empty( $imagethumburls ) ) {
481 foreach ( $imagethumburls as $thumbsize => $imagethumburl ) {
482 $message .= $thumbsize . ': ' . $imagethumburl . "\n";
483 }
484 }
485 $message .= "\n";
486 }
487 } else {
488 $message .= __( 'WebP was not generated. A file with the same name already exists.', 'plus-webp' ) . "\r\n\r\n";
489 $pluswebp_mail_send['count'] = 0;
490 }
491
492 update_option( 'pluswebp_generate_mail', $pluswebp_mail_send );
493
494 /* translators: blogname for subject */
495 $subject = sprintf( __( '[%s] WebP generate', 'plus-webp' ), get_option( 'blogname' ) );
496 wp_mail( $to, $subject, $message );
497
498 }
499
500 /** ==================================================
501 * Webp create
502 *
503 * @param string $filename input filename for pictures.
504 * @param string $mime_type mimetype.
505 * @param string $filename_webp output filename for webp.
506 * @return bool $ret create bool.
507 * @since 1.00
508 */
509 private function create_webp( $filename, $mime_type, $filename_webp ) {
510
511 if ( ! file_exists( $filename ) ) {
512 return false;
513 }
514 if ( file_exists( $filename_webp ) ) {
515 return false;
516 }
517
518 $pluswebp_settings = get_option( 'pluswebp' );
519 @set_time_limit( 60 );
520 @ini_set( 'memory_limit', '256M' );
521
522 $ret = false;
523 switch ( $mime_type ) {
524 case 'image/jpeg':
525 $src = imagecreatefromjpeg( $filename );
526 $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
527 $bgcolor = imagecolorallocate( $img, 255, 255, 255 );
528 imagefill( $img, 0, 0, $bgcolor );
529 imagealphablending( $img, true );
530 break;
531 case 'image/png':
532 $src = imagecreatefrompng( $filename );
533 $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
534 imagealphablending( $img, false );
535 imagesavealpha( $img, true );
536 break;
537 case 'image/bmp':
538 $src = imagecreatefrombmp( $filename );
539 $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
540 break;
541 case 'image/gif':
542 $src = imagecreatefromgif( $filename );
543 $img = imagecreatetruecolor( imagesx( $src ), imagesy( $src ) );
544 $bgcolor = imagecolorallocatealpha( $img, 0, 0, 0, 127 );
545 imagefill( $img, 0, 0, $bgcolor );
546 imagecolortransparent( $img, $bgcolor );
547 break;
548 }
549
550 imagecopy( $img, $src, 0, 0, 0, 0, imagesx( $src ), imagesy( $src ) );
551 imagedestroy( $src );
552 $ret = imagewebp( $img, $filename_webp, $pluswebp_settings['quality'] );
553 imagedestroy( $img );
554
555 return $ret;
556
557 }
558
559 /** ==================================================
560 * Change ext
561 *
562 * @param string $before_file_name before_file_name.
563 * @param string $ext ext.
564 * @param bool $addext addext.
565 * @return array $after_file_name after_file_name.
566 * @since 1.00
567 */
568 private function change_ext( $before_file_name, $ext, $addext ) {
569
570 if ( $addext ) {
571 $after_file_name = $before_file_name . '.' . $ext;
572 } else {
573 $exts = explode( '.', $before_file_name );
574 $before_ext = '.' . end( $exts );
575 $after_ext = '.' . $ext;
576 $after_file_name = str_replace( $before_ext, $after_ext, $before_file_name );
577 }
578
579 return $after_file_name;
580
581 }
582
583 /** ==================================================
584 * Change DB
585 *
586 * @param string $before_url before_url.
587 * @param string $after_url after_url.
588 * @since 1.00
589 */
590 private function change_db( $before_url, $after_url ) {
591
592 global $wpdb;
593
594 /* Replace */
595 $wpdb->query(
596 $wpdb->prepare(
597 "
598 UPDATE {$wpdb->prefix}posts
599 SET post_content = replace( post_content, %s, %s )
600 ",
601 $before_url,
602 $after_url
603 )
604 );
605
606 }
607
608 /** ==================================================
609 * Upload Path
610 *
611 * @return array $upload_dir,$upload_url,$upload_path uploadpath.
612 * @since 1.00
613 */
614 public function upload_dir_url_path() {
615
616 $wp_uploads = wp_upload_dir();
617
618 $relation_path_true = strpos( $wp_uploads['baseurl'], '../' );
619 if ( $relation_path_true > 0 ) {
620 $relationalpath = substr( $wp_uploads['baseurl'], $relation_path_true );
621 $basepath = substr( $wp_uploads['baseurl'], 0, $relation_path_true );
622 $upload_url = $this->realurl( $basepath, $relationalpath );
623 $upload_dir = wp_normalize_path( realpath( $wp_uploads['basedir'] ) );
624 } else {
625 $upload_url = $wp_uploads['baseurl'];
626 $upload_dir = wp_normalize_path( $wp_uploads['basedir'] );
627 }
628
629 if ( is_ssl() ) {
630 $upload_url = str_replace( 'http:', 'https:', $upload_url );
631 }
632
633 if ( $relation_path_true > 0 ) {
634 $upload_path = $relationalpath;
635 } else {
636 $upload_path = str_replace( site_url( '/' ), '', $upload_url );
637 }
638
639 $upload_dir = untrailingslashit( $upload_dir );
640 $upload_url = untrailingslashit( $upload_url );
641 $upload_path = untrailingslashit( $upload_path );
642
643 return array( $upload_dir, $upload_url, $upload_path );
644
645 }
646
647 /** ==================================================
648 * Real Url
649 *
650 * @param string $base base.
651 * @param string $relationalpath relationalpath.
652 * @return string $realurl realurl.
653 * @since 1.00
654 */
655 private function realurl( $base, $relationalpath ) {
656
657 $parse = array(
658 'scheme' => null,
659 'user' => null,
660 'pass' => null,
661 'host' => null,
662 'port' => null,
663 'query' => null,
664 'fragment' => null,
665 );
666 $parse = wp_parse_url( $base );
667
668 if ( strpos( $parse['path'], '/', ( strlen( $parse['path'] ) - 1 ) ) !== false ) {
669 $parse['path'] .= '.';
670 }
671
672 if ( preg_match( '#^https?://#', $relationalpath ) ) {
673 return $relationalpath;
674 } elseif ( preg_match( '#^/.*$#', $relationalpath ) ) {
675 return $parse['scheme'] . '://' . $parse['host'] . $relationalpath;
676 } else {
677 $base_path = explode( '/', dirname( $parse['path'] ) );
678 $rel_path = explode( '/', $relationalpath );
679 foreach ( $rel_path as $rel_dir_name ) {
680 if ( '.' === $rel_dir_name ) {
681 array_shift( $base_path );
682 array_unshift( $base_path, '' );
683 } elseif ( '..' === $rel_dir_name ) {
684 array_pop( $base_path );
685 if ( count( $base_path ) === 0 ) {
686 $base_path = array( '' );
687 }
688 } else {
689 array_push( $base_path, $rel_dir_name );
690 }
691 }
692 $path = implode( '/', $base_path );
693 return $parse['scheme'] . '://' . $parse['host'] . $path;
694 }
695
696 }
697
698 }
699
700
701