Version Description
Release date: August 17th 2020 * New - Also display files size in the replacement windows; * Fix - Replacing image with pdf file would cause noticesi; * Fix - Compensation for faulty WordPress installation that return empty error string on wp_upload_dir and falsely return relative paths and urls on WP core functions; * Fix - When choosing 'replace file and update names' and then uploading a file with identical name as source, it would postfix the duplicate name. This is no longer the case; * Fix - Wording clarification for the situation when the filename is changed, which will lead to broken links from external sites; * Fix - Added hard paths to require_once satements in order to prevent WP-CLI errrors; * Fix - If source image doesn't exist or in error state, replacement would be prevented by Javascript issue.
Release Info
Developer | petredobrescu |
Plugin | Enable Media Replace |
Version | 3.4.2 |
Comparing to | |
See all releases |
Code changes from version 3.4.1 to 3.4.2
- build/shortpixel/autoload.php +0 -1
- classes/file.php +5 -0
- classes/replacer.php +70 -13
- classes/uihelper.php +37 -12
- css/admin.css +5 -0
- enable-media-replace.php +15 -13
- js/emr_admin.js +21 -0
- readme.txt +14 -2
- scss/admin.scss +7 -0
- views/popup.php +7 -6
- views/upload.php +0 -2
@@ -2,4 +2,3 @@
|
|
2 |
require_once (dirname(__FILE__) . "/PackageLoader.php");
|
3 |
$loader = new EnableMediaReplace\Build\PackageLoader();
|
4 |
$loader->load(__DIR__);
|
5 |
-
|
2 |
require_once (dirname(__FILE__) . "/PackageLoader.php");
|
3 |
$loader = new EnableMediaReplace\Build\PackageLoader();
|
4 |
$loader->load(__DIR__);
|
|
@@ -66,6 +66,11 @@ class emrFile
|
|
66 |
@chmod($this->file, $permissions);
|
67 |
}
|
68 |
|
|
|
|
|
|
|
|
|
|
|
69 |
public function getFilePath()
|
70 |
{
|
71 |
return $this->filePath;
|
66 |
@chmod($this->file, $permissions);
|
67 |
}
|
68 |
|
69 |
+
public function getFileSize()
|
70 |
+
{
|
71 |
+
return filesize($this->file);
|
72 |
+
}
|
73 |
+
|
74 |
public function getFilePath()
|
75 |
{
|
76 |
return $this->filePath;
|
@@ -49,6 +49,16 @@ class Replacer
|
|
49 |
else
|
50 |
$source_file = trim(get_attached_file($post_id, apply_filters( 'emr_unfiltered_get_attached_file', true )));
|
51 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
Log::addDebug('SourceFile ' . $source_file);
|
53 |
$this->sourceFile = new File($source_file);
|
54 |
|
@@ -92,9 +102,7 @@ class Replacer
|
|
92 |
public function replaceWith($file, $fileName)
|
93 |
{
|
94 |
global $wpdb;
|
95 |
-
//$this->targetFile = new File($file);
|
96 |
$this->targetName = $fileName;
|
97 |
-
//$this->targetFile = new File($file); // this will point to /tmp!
|
98 |
|
99 |
$targetFile = $this->getTargetFile();
|
100 |
|
@@ -105,8 +113,6 @@ class Replacer
|
|
105 |
// throw new \RuntimeException($ex);
|
106 |
}
|
107 |
|
108 |
-
|
109 |
-
|
110 |
$targetFileObj = new File($targetFile);
|
111 |
$result = $targetFileObj->checkAndCreateFolder();
|
112 |
if ($result === false)
|
@@ -134,8 +140,11 @@ class Replacer
|
|
134 |
}
|
135 |
|
136 |
// update the file attached. This is required for wp_get_attachment_url to work.
|
137 |
-
update_attached_file($this->post_id, $this->targetFile->getFullFilePath() );
|
138 |
-
|
|
|
|
|
|
|
139 |
|
140 |
// Run the filter, so other plugins can hook if needed.
|
141 |
$filtered = apply_filters( 'wp_handle_upload', array(
|
@@ -156,6 +165,7 @@ class Replacer
|
|
156 |
wp_update_attachment_metadata( $this->post_id, $metadata );
|
157 |
$this->target_metadata = $metadata;
|
158 |
|
|
|
159 |
/** If author is different from replacer, note this */
|
160 |
$author_id = get_post_meta($this->post_id, '_emr_replace_author', true);
|
161 |
|
@@ -177,10 +187,11 @@ class Replacer
|
|
177 |
$update_ar = array('ID' => $this->post_id);
|
178 |
$update_ar['post_title'] = $title;
|
179 |
$update_ar['post_name'] = sanitize_title($title);
|
180 |
-
|
181 |
$update_ar['post_mime_type'] = $this->targetFile->getFileMime();
|
182 |
$post_id = \wp_update_post($update_ar, true);
|
183 |
|
|
|
184 |
// update post doesn't update GUID on updates.
|
185 |
$wpdb->update( $wpdb->posts, array( 'guid' => $this->target_url), array('ID' => $this->post_id) );
|
186 |
//enable-media-replace-upload-done
|
@@ -293,8 +304,19 @@ class Replacer
|
|
293 |
}
|
294 |
$path = $this->target_location; // if all went well.
|
295 |
}
|
296 |
-
|
|
|
297 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
298 |
$new_filename = apply_filters( 'emr_unique_filename', $unique, $path, $this->post_id );
|
299 |
$targetFile = trailingslashit($path) . $new_filename;
|
300 |
}
|
@@ -315,10 +337,37 @@ class Replacer
|
|
315 |
return null;
|
316 |
}
|
317 |
}
|
318 |
-
|
319 |
return $targetFile;
|
320 |
}
|
321 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
322 |
/** Tries to remove all of the old image, without touching the metadata in database
|
323 |
* This might fail on certain files, but this is not an indication of success ( remove might fail, but overwrite can still work)
|
324 |
*/
|
@@ -328,7 +377,7 @@ class Replacer
|
|
328 |
$backup_sizes = get_post_meta( $this->post_id, '_wp_attachment_backup_sizes', true );
|
329 |
|
330 |
// this must be -scaled if that exists, since wp_delete_attachment_files checks for original_files but doesn't recheck if scaled is included since that the one 'that exists' in WP . $this->source_file replaces original image, not the -scaled one.
|
331 |
-
$file =
|
332 |
$result = \wp_delete_attachment_files($this->post_id, $meta, $backup_sizes, $file );
|
333 |
|
334 |
}
|
@@ -433,6 +482,8 @@ class Replacer
|
|
433 |
}
|
434 |
}
|
435 |
|
|
|
|
|
436 |
/* If on the other hand, some sizes are available in source, but not in target, try to replace them with something closeby. */
|
437 |
foreach($search_urls as $size => $url)
|
438 |
{
|
@@ -459,7 +510,7 @@ class Replacer
|
|
459 |
*/
|
460 |
foreach($search_urls as $size => $url)
|
461 |
{
|
462 |
-
$replace_url = $replace_urls[$size];
|
463 |
if ($url == $replace_url) // if source and target as the same, no need for replacing.
|
464 |
{
|
465 |
unset($search_urls[$size]);
|
@@ -477,7 +528,7 @@ class Replacer
|
|
477 |
}
|
478 |
|
479 |
Log::addDebug('Doing meta search and replace -', array($search_urls, $replace_urls) );
|
480 |
-
Log::addDebug('Searching with BaseuRL' . $current_base_url);
|
481 |
|
482 |
/* Search and replace in WP_POSTS */
|
483 |
// Removed $wpdb->remove_placeholder_escape from here, not compatible with WP 4.8
|
@@ -557,6 +608,7 @@ class Replacer
|
|
557 |
{
|
558 |
Log::addDebug('Found JSON Content');
|
559 |
$content = json_decode($content);
|
|
|
560 |
}
|
561 |
|
562 |
if (is_string($content)) // let's check the normal one first.
|
@@ -588,7 +640,7 @@ class Replacer
|
|
588 |
{
|
589 |
Log::addDebug('Value was found to be JSON, encoding');
|
590 |
// wp-slash -> WP does stripslashes_deep which destroys JSON
|
591 |
-
$content =
|
592 |
Log::addDebug('Content returning', array($content));
|
593 |
}
|
594 |
|
@@ -662,7 +714,12 @@ class Replacer
|
|
662 |
*/
|
663 |
private function findNearestSize($sizeName)
|
664 |
{
|
|
|
665 |
|
|
|
|
|
|
|
|
|
666 |
$old_width = $this->source_metadata['sizes'][$sizeName]['width']; // the width from size not in new image
|
667 |
$new_width = $this->target_metadata['width']; // default check - the width of the main image
|
668 |
|
49 |
else
|
50 |
$source_file = trim(get_attached_file($post_id, apply_filters( 'emr_unfiltered_get_attached_file', true )));
|
51 |
|
52 |
+
/* It happens that the SourceFile returns relative / incomplete when something messes up get_upload_dir with an error something.
|
53 |
+
This case shoudl be detected here and create a non-relative path anyhow..
|
54 |
+
*/
|
55 |
+
if (! file_exists($source_file) && $source_file && 0 !== strpos( $source_file, '/' ) && ! preg_match( '|^.:\\\|', $source_file ) )
|
56 |
+
{
|
57 |
+
$file = get_post_meta( $post_id, '_wp_attached_file', true );
|
58 |
+
$uploads = wp_get_upload_dir();
|
59 |
+
$source_file = $uploads['basedir'] . "/$source_file";
|
60 |
+
}
|
61 |
+
|
62 |
Log::addDebug('SourceFile ' . $source_file);
|
63 |
$this->sourceFile = new File($source_file);
|
64 |
|
102 |
public function replaceWith($file, $fileName)
|
103 |
{
|
104 |
global $wpdb;
|
|
|
105 |
$this->targetName = $fileName;
|
|
|
106 |
|
107 |
$targetFile = $this->getTargetFile();
|
108 |
|
113 |
// throw new \RuntimeException($ex);
|
114 |
}
|
115 |
|
|
|
|
|
116 |
$targetFileObj = new File($targetFile);
|
117 |
$result = $targetFileObj->checkAndCreateFolder();
|
118 |
if ($result === false)
|
140 |
}
|
141 |
|
142 |
// update the file attached. This is required for wp_get_attachment_url to work.
|
143 |
+
$updated = update_attached_file($this->post_id, $this->targetFile->getFullFilePath() );
|
144 |
+
if (! $updated)
|
145 |
+
Log::addError('Update Attached File reports as not updated');
|
146 |
+
|
147 |
+
$this->target_url = $this->getTargetURL(); //wp_get_attachment_url($this->post_id);
|
148 |
|
149 |
// Run the filter, so other plugins can hook if needed.
|
150 |
$filtered = apply_filters( 'wp_handle_upload', array(
|
165 |
wp_update_attachment_metadata( $this->post_id, $metadata );
|
166 |
$this->target_metadata = $metadata;
|
167 |
|
168 |
+
|
169 |
/** If author is different from replacer, note this */
|
170 |
$author_id = get_post_meta($this->post_id, '_emr_replace_author', true);
|
171 |
|
187 |
$update_ar = array('ID' => $this->post_id);
|
188 |
$update_ar['post_title'] = $title;
|
189 |
$update_ar['post_name'] = sanitize_title($title);
|
190 |
+
$update_ar['guid'] = $this->target_url; //wp_get_attachment_url($this->post_id);
|
191 |
$update_ar['post_mime_type'] = $this->targetFile->getFileMime();
|
192 |
$post_id = \wp_update_post($update_ar, true);
|
193 |
|
194 |
+
|
195 |
// update post doesn't update GUID on updates.
|
196 |
$wpdb->update( $wpdb->posts, array( 'guid' => $this->target_url), array('ID' => $this->post_id) );
|
197 |
//enable-media-replace-upload-done
|
304 |
}
|
305 |
$path = $this->target_location; // if all went well.
|
306 |
}
|
307 |
+
//if ($this->sourceFile->getFileName() == $this->targetName)
|
308 |
+
$targetpath = $path . $this->targetName;
|
309 |
|
310 |
+
// If the source and target path AND filename are identical, user has wrong mode, just overwrite the sourceFile.
|
311 |
+
if ($targetpath == $this->sourceFile->getFullFilePath())
|
312 |
+
{
|
313 |
+
$unique = $this->sourceFile->getFileName();
|
314 |
+
$this->replaceMode == self::MODE_REPLACE;
|
315 |
+
}
|
316 |
+
else
|
317 |
+
{
|
318 |
+
$unique = wp_unique_filename($path, $this->targetName);
|
319 |
+
}
|
320 |
$new_filename = apply_filters( 'emr_unique_filename', $unique, $path, $this->post_id );
|
321 |
$targetFile = trailingslashit($path) . $new_filename;
|
322 |
}
|
337 |
return null;
|
338 |
}
|
339 |
}
|
|
|
340 |
return $targetFile;
|
341 |
}
|
342 |
|
343 |
+
/** Since WP functions also can't be trusted here in certain cases, create the URL by ourselves */
|
344 |
+
protected function getTargetURL()
|
345 |
+
{
|
346 |
+
//$uploads['baseurl']
|
347 |
+
$url = wp_get_attachment_url($this->post_id);
|
348 |
+
$url_basename = basename($url);
|
349 |
+
|
350 |
+
// Seems all worked as normal.
|
351 |
+
if (strpos($url, '://') >= 0 && $this->targetFile->getFileName() == $url_basename)
|
352 |
+
return $url;
|
353 |
+
|
354 |
+
// Relative path for some reason
|
355 |
+
if (strpos($url, '://') === false)
|
356 |
+
{
|
357 |
+
$uploads = wp_get_upload_dir();
|
358 |
+
$url = str_replace($uploads['basedir'], $uploads['baseurl'], $this->targetFile->getFullFilePath());
|
359 |
+
}
|
360 |
+
// This can happen when WordPress is not taking from attached file, but wrong /old GUID. Try to replace it to the new one.
|
361 |
+
elseif ($this->targetFile->getFileName() != $url_basename)
|
362 |
+
{
|
363 |
+
$url = str_replace($url_basename, $this->targetFile->getFileName(), $url);
|
364 |
+
}
|
365 |
+
|
366 |
+
return $url;
|
367 |
+
//$this->targetFile
|
368 |
+
|
369 |
+
}
|
370 |
+
|
371 |
/** Tries to remove all of the old image, without touching the metadata in database
|
372 |
* This might fail on certain files, but this is not an indication of success ( remove might fail, but overwrite can still work)
|
373 |
*/
|
377 |
$backup_sizes = get_post_meta( $this->post_id, '_wp_attachment_backup_sizes', true );
|
378 |
|
379 |
// this must be -scaled if that exists, since wp_delete_attachment_files checks for original_files but doesn't recheck if scaled is included since that the one 'that exists' in WP . $this->source_file replaces original image, not the -scaled one.
|
380 |
+
$file = $this->sourceFile->getFullFilePath();
|
381 |
$result = \wp_delete_attachment_files($this->post_id, $meta, $backup_sizes, $file );
|
382 |
|
383 |
}
|
482 |
}
|
483 |
}
|
484 |
|
485 |
+
Log::addDebug('Source', $this->source_metadata);
|
486 |
+
Log::addDebug('Target', $this->target_metadata);
|
487 |
/* If on the other hand, some sizes are available in source, but not in target, try to replace them with something closeby. */
|
488 |
foreach($search_urls as $size => $url)
|
489 |
{
|
510 |
*/
|
511 |
foreach($search_urls as $size => $url)
|
512 |
{
|
513 |
+
$replace_url = isset($replace_urls[$size]) ? $replace_urls[$size] : false;
|
514 |
if ($url == $replace_url) // if source and target as the same, no need for replacing.
|
515 |
{
|
516 |
unset($search_urls[$size]);
|
528 |
}
|
529 |
|
530 |
Log::addDebug('Doing meta search and replace -', array($search_urls, $replace_urls) );
|
531 |
+
Log::addDebug('Searching with BaseuRL ' . $current_base_url);
|
532 |
|
533 |
/* Search and replace in WP_POSTS */
|
534 |
// Removed $wpdb->remove_placeholder_escape from here, not compatible with WP 4.8
|
608 |
{
|
609 |
Log::addDebug('Found JSON Content');
|
610 |
$content = json_decode($content);
|
611 |
+
|
612 |
}
|
613 |
|
614 |
if (is_string($content)) // let's check the normal one first.
|
640 |
{
|
641 |
Log::addDebug('Value was found to be JSON, encoding');
|
642 |
// wp-slash -> WP does stripslashes_deep which destroys JSON
|
643 |
+
$content = (json_encode($content, JSON_UNESCAPED_SLASHES));
|
644 |
Log::addDebug('Content returning', array($content));
|
645 |
}
|
646 |
|
714 |
*/
|
715 |
private function findNearestSize($sizeName)
|
716 |
{
|
717 |
+
Log::addDebug('Find Nearest: '. $sizeName);
|
718 |
|
719 |
+
if (! isset($this->source_metadata['sizes'][$sizeName]) || ! isset($this->target_metadata['width'])) // This can happen with non-image files like PDF.
|
720 |
+
{
|
721 |
+
return false;
|
722 |
+
}
|
723 |
$old_width = $this->source_metadata['sizes'][$sizeName]['width']; // the width from size not in new image
|
724 |
$new_width = $this->target_metadata['width']; // default check - the width of the main image
|
725 |
|
@@ -98,7 +98,7 @@ class UIHelper
|
|
98 |
public function setSourceSizes($attach_id)
|
99 |
{
|
100 |
$data = $this->getImageSizes($attach_id, 'full'); // wp_get_attachment_image_src($attach_id, 'full');
|
101 |
-
|
102 |
|
103 |
if (is_array($data))
|
104 |
{
|
@@ -110,22 +110,29 @@ class UIHelper
|
|
110 |
}
|
111 |
|
112 |
// Returns Preview Image HTML Output.
|
113 |
-
public function getPreviewImage($attach_id)
|
114 |
{
|
115 |
$data = false;
|
116 |
|
117 |
if ($attach_id > 0)
|
118 |
{
|
119 |
$data = $this->getImageSizes($attach_id, $this->preview_size); //wp_get_attachment_image_src($attach_id, $this->preview_size);
|
120 |
-
|
121 |
-
Log::addDebug('Attached File ' . $file, $data);
|
122 |
-
|
123 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
}
|
125 |
|
126 |
$mime_type = get_post_mime_type($attach_id);
|
127 |
|
128 |
-
if (! is_array($data) || !
|
129 |
{
|
130 |
// if attachid higher than zero ( exists ) but not the image, fail, that's an error state.
|
131 |
$icon = ($attach_id < 0) ? '' : 'dashicons-no';
|
@@ -137,17 +144,21 @@ class UIHelper
|
|
137 |
'is_image' => false,
|
138 |
'is_document' => $is_document,
|
139 |
'icon' => $icon,
|
|
|
140 |
);
|
141 |
|
|
|
|
|
142 |
// failed, it might be this server doens't support PDF thumbnails. Fallback to File preview.
|
143 |
if ($mime_type == 'application/pdf')
|
144 |
{
|
145 |
-
return $this->getPreviewFile($attach_id);
|
146 |
}
|
147 |
|
148 |
return $this->getPlaceHolder($args);
|
149 |
}
|
150 |
|
|
|
151 |
$url = $data[0];
|
152 |
$width = $data[1];
|
153 |
$height = $data[2];
|
@@ -171,6 +182,7 @@ class UIHelper
|
|
171 |
'height' => $height,
|
172 |
'image' => $image,
|
173 |
'mime_type' => $mime_type,
|
|
|
174 |
);
|
175 |
|
176 |
$output = $this->getPlaceHolder($args);
|
@@ -221,18 +233,18 @@ class UIHelper
|
|
221 |
return $output;
|
222 |
}
|
223 |
|
224 |
-
public function getPreviewFile($attach_id)
|
225 |
{
|
226 |
if ($attach_id > 0)
|
227 |
{
|
228 |
-
|
229 |
-
$filename =
|
230 |
}
|
231 |
else {
|
232 |
$filename = false;
|
233 |
}
|
234 |
|
235 |
-
$mime_type =
|
236 |
|
237 |
$args = array(
|
238 |
'width' => 300,
|
@@ -241,6 +253,7 @@ class UIHelper
|
|
241 |
'is_document' => true,
|
242 |
'layer' => $filename,
|
243 |
'mime_type' => $mime_type,
|
|
|
244 |
);
|
245 |
$output = $this->getPlaceHolder($args);
|
246 |
return $output;
|
@@ -279,9 +292,11 @@ class UIHelper
|
|
279 |
'is_image' => true,
|
280 |
'is_document' => false,
|
281 |
'mime_type' => false,
|
|
|
282 |
);
|
283 |
|
284 |
$args = wp_parse_args($args, $defaults);
|
|
|
285 |
$w = $args['width'];
|
286 |
$h = $args['height'];
|
287 |
|
@@ -311,16 +326,26 @@ class UIHelper
|
|
311 |
$filetype = 'data-filetype="' . $args['mime_type'] . '"';
|
312 |
}
|
313 |
|
|
|
|
|
314 |
|
315 |
$output = "<div class='image_placeholder $placeholder_class' $filetype style='width:" . $w . "px; height:". $h ."px'> ";
|
316 |
$output .= $args['image'];
|
317 |
$output .= "<div class='dashicons $icon'> </div>";
|
318 |
$output .= "<span class='textlayer'>" . $args['layer'] . "</span>";
|
|
|
319 |
$output .= "</div>";
|
320 |
|
|
|
|
|
321 |
return $output;
|
322 |
}
|
323 |
|
|
|
|
|
|
|
|
|
|
|
324 |
/**
|
325 |
* Get size information for all currently-registered image sizes.
|
326 |
* Directly stolen from - https://codex.wordpress.org/Function_Reference/get_intermediate_image_sizes
|
@@ -353,7 +378,7 @@ class UIHelper
|
|
353 |
{
|
354 |
$uploadDir = wp_upload_dir();
|
355 |
if (isset($uploadDir['subdir']))
|
356 |
-
return ltrim($uploadDir['subdir'], '/');
|
357 |
else
|
358 |
return false;
|
359 |
}
|
98 |
public function setSourceSizes($attach_id)
|
99 |
{
|
100 |
$data = $this->getImageSizes($attach_id, 'full'); // wp_get_attachment_image_src($attach_id, 'full');
|
101 |
+
// $file = get_attached_file($attach_id);
|
102 |
|
103 |
if (is_array($data))
|
104 |
{
|
110 |
}
|
111 |
|
112 |
// Returns Preview Image HTML Output.
|
113 |
+
public function getPreviewImage($attach_id,$file)
|
114 |
{
|
115 |
$data = false;
|
116 |
|
117 |
if ($attach_id > 0)
|
118 |
{
|
119 |
$data = $this->getImageSizes($attach_id, $this->preview_size); //wp_get_attachment_image_src($attach_id, $this->preview_size);
|
120 |
+
/*$file = get_attached_file($attach_id);
|
|
|
|
|
121 |
|
122 |
+
// If the file is relative, prepend upload dir.
|
123 |
+
if (! file_exists($file) && $file && 0 !== strpos( $file, '/' ) && ! preg_match( '|^.:\\\|', $file ) )
|
124 |
+
{
|
125 |
+
$file = get_post_meta( $attach_id, '_wp_attached_file', true );
|
126 |
+
$uploads = wp_get_upload_dir();
|
127 |
+
$file = $uploads['basedir'] . "/$file";
|
128 |
+
}
|
129 |
+
*/
|
130 |
+
Log::addDebug('Attached File ' . $file->getFullFilePath(), $data);
|
131 |
}
|
132 |
|
133 |
$mime_type = get_post_mime_type($attach_id);
|
134 |
|
135 |
+
if (! is_array($data) || ! $file->exists() )
|
136 |
{
|
137 |
// if attachid higher than zero ( exists ) but not the image, fail, that's an error state.
|
138 |
$icon = ($attach_id < 0) ? '' : 'dashicons-no';
|
144 |
'is_image' => false,
|
145 |
'is_document' => $is_document,
|
146 |
'icon' => $icon,
|
147 |
+
'mime_type' => null,
|
148 |
);
|
149 |
|
150 |
+
|
151 |
+
|
152 |
// failed, it might be this server doens't support PDF thumbnails. Fallback to File preview.
|
153 |
if ($mime_type == 'application/pdf')
|
154 |
{
|
155 |
+
return $this->getPreviewFile($attach_id, $file);
|
156 |
}
|
157 |
|
158 |
return $this->getPlaceHolder($args);
|
159 |
}
|
160 |
|
161 |
+
|
162 |
$url = $data[0];
|
163 |
$width = $data[1];
|
164 |
$height = $data[2];
|
182 |
'height' => $height,
|
183 |
'image' => $image,
|
184 |
'mime_type' => $mime_type,
|
185 |
+
'file_size' => $file->getFileSize(),
|
186 |
);
|
187 |
|
188 |
$output = $this->getPlaceHolder($args);
|
233 |
return $output;
|
234 |
}
|
235 |
|
236 |
+
public function getPreviewFile($attach_id, $file)
|
237 |
{
|
238 |
if ($attach_id > 0)
|
239 |
{
|
240 |
+
//$filepath = get_attached_file($attach_id);
|
241 |
+
$filename = $file->getFileName();
|
242 |
}
|
243 |
else {
|
244 |
$filename = false;
|
245 |
}
|
246 |
|
247 |
+
$mime_type = $file->getFileMime();
|
248 |
|
249 |
$args = array(
|
250 |
'width' => 300,
|
253 |
'is_document' => true,
|
254 |
'layer' => $filename,
|
255 |
'mime_type' => $mime_type,
|
256 |
+
'file_size' => $file->getFileSize(),
|
257 |
);
|
258 |
$output = $this->getPlaceHolder($args);
|
259 |
return $output;
|
292 |
'is_image' => true,
|
293 |
'is_document' => false,
|
294 |
'mime_type' => false,
|
295 |
+
'file_size' => false,
|
296 |
);
|
297 |
|
298 |
$args = wp_parse_args($args, $defaults);
|
299 |
+
|
300 |
$w = $args['width'];
|
301 |
$h = $args['height'];
|
302 |
|
326 |
$filetype = 'data-filetype="' . $args['mime_type'] . '"';
|
327 |
}
|
328 |
|
329 |
+
$filesize = ($args['file_size']) ? $args['file_size'] : '';
|
330 |
+
|
331 |
|
332 |
$output = "<div class='image_placeholder $placeholder_class' $filetype style='width:" . $w . "px; height:". $h ."px'> ";
|
333 |
$output .= $args['image'];
|
334 |
$output .= "<div class='dashicons $icon'> </div>";
|
335 |
$output .= "<span class='textlayer'>" . $args['layer'] . "</span>";
|
336 |
+
$output .= "<div class='image_size'>" . $this->convertFileSize($filesize). "</div>";
|
337 |
$output .= "</div>";
|
338 |
|
339 |
+
|
340 |
+
|
341 |
return $output;
|
342 |
}
|
343 |
|
344 |
+
private function convertFileSize($filesize)
|
345 |
+
{
|
346 |
+
return size_format($filesize);
|
347 |
+
}
|
348 |
+
|
349 |
/**
|
350 |
* Get size information for all currently-registered image sizes.
|
351 |
* Directly stolen from - https://codex.wordpress.org/Function_Reference/get_intermediate_image_sizes
|
378 |
{
|
379 |
$uploadDir = wp_upload_dir();
|
380 |
if (isset($uploadDir['subdir']))
|
381 |
+
return ltrim($uploadDir['subdir'], '/');
|
382 |
else
|
383 |
return false;
|
384 |
}
|
@@ -836,6 +836,11 @@
|
|
836 |
left: 50%;
|
837 |
margin-left: -30px;
|
838 |
opacity: 0.5; }
|
|
|
|
|
|
|
|
|
|
|
839 |
.emr_upload_form .image_chooser.wrapper .image_previews .image_placeholder.is_image .dashicons::before, .emr_upload_form .image_chooser.wrapper .image_previews .image_placeholder.is_image .dashicons {
|
840 |
display: none; }
|
841 |
.emr_upload_form .image_chooser.wrapper .image_previews .image_placeholder.not_image img {
|
836 |
left: 50%;
|
837 |
margin-left: -30px;
|
838 |
opacity: 0.5; }
|
839 |
+
.emr_upload_form .image_chooser.wrapper .image_previews .image_placeholder .image_size {
|
840 |
+
text-align: center;
|
841 |
+
position: absolute;
|
842 |
+
bottom: -25px;
|
843 |
+
width: 100%; }
|
844 |
.emr_upload_form .image_chooser.wrapper .image_previews .image_placeholder.is_image .dashicons::before, .emr_upload_form .image_chooser.wrapper .image_previews .image_placeholder.is_image .dashicons {
|
845 |
display: none; }
|
846 |
.emr_upload_form .image_chooser.wrapper .image_previews .image_placeholder.not_image img {
|
@@ -2,8 +2,8 @@
|
|
2 |
/*
|
3 |
Plugin Name: Enable Media Replace
|
4 |
Plugin URI: https://wordpress.org/plugins/enable-media-replace/
|
5 |
-
Description: Enable replacing media files by uploading a new file in the "Edit Media" section of the WordPress Media Library
|
6 |
-
Version: 3.4.
|
7 |
Author: ShortPixel
|
8 |
Author URI: https://shortpixel.com
|
9 |
Text Domain: enable-media-replace
|
@@ -26,7 +26,7 @@ http://www.gnu.org/licenses/gpl.html
|
|
26 |
|
27 |
namespace EnableMediaReplace;
|
28 |
|
29 |
-
define('EMR_VERSION', '3.4.
|
30 |
|
31 |
if ( ! defined( 'ABSPATH' ) ) {
|
32 |
exit; // Exit if accessed directly.
|
@@ -45,15 +45,17 @@ if(!defined("SHORTPIXEL_AFFILIATE_CODE")) {
|
|
45 |
define("SHORTPIXEL_AFFILIATE_CODE", 'VKG6LYN28044');
|
46 |
}
|
47 |
|
48 |
-
|
49 |
-
|
50 |
-
require_once('
|
51 |
-
require_once('classes/
|
52 |
-
require_once('classes/
|
53 |
-
require_once('classes/
|
54 |
-
require_once('classes/
|
55 |
-
require_once('classes/
|
56 |
-
require_once('classes/
|
57 |
-
require_once('
|
|
|
|
|
58 |
|
59 |
$emr_plugin = EnableMediaReplacePlugin::get();
|
2 |
/*
|
3 |
Plugin Name: Enable Media Replace
|
4 |
Plugin URI: https://wordpress.org/plugins/enable-media-replace/
|
5 |
+
Description: Enable replacing media files by uploading a new file in the "Edit Media" section of the WordPress Media Library
|
6 |
+
Version: 3.4.2
|
7 |
Author: ShortPixel
|
8 |
Author URI: https://shortpixel.com
|
9 |
Text Domain: enable-media-replace
|
26 |
|
27 |
namespace EnableMediaReplace;
|
28 |
|
29 |
+
define('EMR_VERSION', '3.4.2');
|
30 |
|
31 |
if ( ! defined( 'ABSPATH' ) ) {
|
32 |
exit; // Exit if accessed directly.
|
45 |
define("SHORTPIXEL_AFFILIATE_CODE", 'VKG6LYN28044');
|
46 |
}
|
47 |
|
48 |
+
$plugin_path = plugin_dir_path(EMR_ROOT_FILE);
|
49 |
+
|
50 |
+
require_once($plugin_path . 'build/shortpixel/autoload.php');
|
51 |
+
require_once($plugin_path . 'classes/compat.php');
|
52 |
+
require_once($plugin_path . 'classes/functions.php');
|
53 |
+
require_once($plugin_path . 'classes/replacer.php');
|
54 |
+
require_once($plugin_path . 'classes/uihelper.php');
|
55 |
+
require_once($plugin_path . 'classes/file.php');
|
56 |
+
require_once($plugin_path . 'classes/cache.php');
|
57 |
+
require_once($plugin_path . 'classes/emr-plugin.php');
|
58 |
+
require_once($plugin_path . 'classes/externals.php');
|
59 |
+
require_once($plugin_path . 'thumbnail_updater.php');
|
60 |
|
61 |
$emr_plugin = EnableMediaReplacePlugin::get();
|
@@ -38,6 +38,9 @@
|
|
38 |
source_type = $(source).data('filetype').trim();
|
39 |
this.debug('detected type - ' + source_type);
|
40 |
}
|
|
|
|
|
|
|
41 |
if (source.hasClass('is_image'))
|
42 |
{
|
43 |
source_is_image = true;
|
@@ -98,6 +101,7 @@
|
|
98 |
|
99 |
var status = this.checkUpload(file);
|
100 |
this.debug('check upload status ' + status);
|
|
|
101 |
|
102 |
if (status)
|
103 |
{
|
@@ -143,6 +147,7 @@
|
|
143 |
height = img.height;
|
144 |
// $(preview).find('.textlayer').text(img.naturalWidth + ' x ' + img.naturalHeight );
|
145 |
self.updateTextLayer(preview, width + ' x ' + height);
|
|
|
146 |
});
|
147 |
|
148 |
$(preview).prepend(img);
|
@@ -154,6 +159,7 @@
|
|
154 |
$(preview).find('.dashicons').removeClass().addClass('dashicons dashicons-no');
|
155 |
//$(preview).find('.textlayer').text('');
|
156 |
this.updateTextLayer(preview, '');
|
|
|
157 |
this.debug('File is null');
|
158 |
}
|
159 |
else { // not an image
|
@@ -161,6 +167,7 @@
|
|
161 |
$(preview).find('.dashicons').removeClass().addClass('dashicons dashicons-media-document');
|
162 |
//$(preview).find('.textlayer').text(file.name);
|
163 |
this.updateTextLayer(preview, file.name);
|
|
|
164 |
this.debug('Not image, media document');
|
165 |
}
|
166 |
|
@@ -208,6 +215,20 @@
|
|
208 |
}
|
209 |
|
210 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
211 |
this.checkSubmit = function()
|
212 |
{
|
213 |
var check = ($('input[name="userfile"]').val().length > 0) ? true : false;
|
38 |
source_type = $(source).data('filetype').trim();
|
39 |
this.debug('detected type - ' + source_type);
|
40 |
}
|
41 |
+
else
|
42 |
+
source_type = ''; // error state
|
43 |
+
|
44 |
if (source.hasClass('is_image'))
|
45 |
{
|
46 |
source_is_image = true;
|
101 |
|
102 |
var status = this.checkUpload(file);
|
103 |
this.debug('check upload status ' + status);
|
104 |
+
this.debug(file.size);
|
105 |
|
106 |
if (status)
|
107 |
{
|
147 |
height = img.height;
|
148 |
// $(preview).find('.textlayer').text(img.naturalWidth + ' x ' + img.naturalHeight );
|
149 |
self.updateTextLayer(preview, width + ' x ' + height);
|
150 |
+
self.updateFileSize(preview, file);
|
151 |
});
|
152 |
|
153 |
$(preview).prepend(img);
|
159 |
$(preview).find('.dashicons').removeClass().addClass('dashicons dashicons-no');
|
160 |
//$(preview).find('.textlayer').text('');
|
161 |
this.updateTextLayer(preview, '');
|
162 |
+
this.updateFileSize(preview, null);
|
163 |
this.debug('File is null');
|
164 |
}
|
165 |
else { // not an image
|
167 |
$(preview).find('.dashicons').removeClass().addClass('dashicons dashicons-media-document');
|
168 |
//$(preview).find('.textlayer').text(file.name);
|
169 |
this.updateTextLayer(preview, file.name);
|
170 |
+
this.updateFileSize(preview, file);
|
171 |
this.debug('Not image, media document');
|
172 |
}
|
173 |
|
215 |
}
|
216 |
|
217 |
},
|
218 |
+
this.updateFileSize = function(preview, file)
|
219 |
+
{
|
220 |
+
if (file === null)
|
221 |
+
{
|
222 |
+
$(preview).find('.image_size').text('');
|
223 |
+
return;
|
224 |
+
}
|
225 |
+
var bytes = file.size;
|
226 |
+
if (bytes == 0) { return "0.00 B"; }
|
227 |
+
var e = Math.floor(Math.log(bytes) / Math.log(1024));
|
228 |
+
var size = (bytes/Math.pow(1024, e)).toFixed(2)+' '+' KMGTP'.charAt(e)+'B';
|
229 |
+
|
230 |
+
$(preview).find('.image_size').text(size);
|
231 |
+
}
|
232 |
this.checkSubmit = function()
|
233 |
{
|
234 |
var check = ($('input[name="userfile"]').val().length > 0) ? true : false;
|
@@ -5,7 +5,7 @@ Tags: replace, attachment, media, files, replace image, replace jpg, change medi
|
|
5 |
Requires at least: 4.9.7
|
6 |
Tested up to: 5.5
|
7 |
Requires PHP: 5.6
|
8 |
-
Stable tag: 3.4.
|
9 |
|
10 |
Easily replace any attached image/file by simply uploading a new file in the Media Library edit view - a real time saver!
|
11 |
|
@@ -47,6 +47,18 @@ If you want more control over the format used to display the time, you can use t
|
|
47 |
|
48 |
== Changelog ==
|
49 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
= 3.4.1 =
|
51 |
|
52 |
Release date: June 18th 2020
|
@@ -55,7 +67,7 @@ Release date: June 18th 2020
|
|
55 |
= 3.4.0 =
|
56 |
|
57 |
Release date: June 9th 2020
|
58 |
-
* New - In edit media screen EMR notes user who replaced file if this was not uploader;
|
59 |
* New - Added Drag and Drop area for files;
|
60 |
* New - When replacing with new file name, now also possible to update upload path;
|
61 |
* Fix - Various minor CSS tweaks and fixes;
|
5 |
Requires at least: 4.9.7
|
6 |
Tested up to: 5.5
|
7 |
Requires PHP: 5.6
|
8 |
+
Stable tag: 3.4.2
|
9 |
|
10 |
Easily replace any attached image/file by simply uploading a new file in the Media Library edit view - a real time saver!
|
11 |
|
47 |
|
48 |
== Changelog ==
|
49 |
|
50 |
+
|
51 |
+
= 3.4.2 =
|
52 |
+
|
53 |
+
Release date: August 17th 2020
|
54 |
+
* New - Also display files size in the replacement windows;
|
55 |
+
* Fix - Replacing image with pdf file would cause noticesi;
|
56 |
+
* Fix - Compensation for faulty WordPress installation that return empty error string on wp_upload_dir and falsely return relative paths and urls on WP core functions;
|
57 |
+
* Fix - When choosing 'replace file and update names' and then uploading a file with identical name as source, it would postfix the duplicate name. This is no longer the case;
|
58 |
+
* Fix - Wording clarification for the situation when the filename is changed, which will lead to broken links from external sites;
|
59 |
+
* Fix - Added hard paths to require_once satements in order to prevent WP-CLI errrors;
|
60 |
+
* Fix - If source image doesn't exist or in error state, replacement would be prevented by Javascript issue.
|
61 |
+
|
62 |
= 3.4.1 =
|
63 |
|
64 |
Release date: June 18th 2020
|
67 |
= 3.4.0 =
|
68 |
|
69 |
Release date: June 9th 2020
|
70 |
+
* New - In edit media screen EMR notes user who replaced file if this was not uploader;
|
71 |
* New - Added Drag and Drop area for files;
|
72 |
* New - When replacing with new file name, now also possible to update upload path;
|
73 |
* Fix - Various minor CSS tweaks and fixes;
|
@@ -111,6 +111,13 @@
|
|
111 |
opacity: 0.5;
|
112 |
|
113 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
&.is_image
|
115 |
{
|
116 |
.dashicons::before, .dashicons { display: none }
|
111 |
opacity: 0.5;
|
112 |
|
113 |
}
|
114 |
+
.image_size
|
115 |
+
{
|
116 |
+
text-align: center;
|
117 |
+
position: absolute;
|
118 |
+
bottom: -25px;
|
119 |
+
width: 100%;
|
120 |
+
}
|
121 |
&.is_image
|
122 |
{
|
123 |
.dashicons::before, .dashicons { display: none }
|
@@ -88,18 +88,19 @@ $url = $uiHelper->getFormUrl($attachment_id);
|
|
88 |
<div class='image_previews'>
|
89 |
<?php if (wp_attachment_is('image', $attachment_id) || $source_mime == 'application/pdf')
|
90 |
{
|
91 |
-
echo $uiHelper->getPreviewImage($attachment_id);
|
92 |
-
echo $uiHelper->getPreviewImage(-1);
|
93 |
}
|
94 |
else {
|
|
|
95 |
if (strlen($filepath) == 0) // check if image in error state.
|
96 |
{
|
97 |
echo $uiHelper->getPreviewError(-1);
|
98 |
-
echo $uiHelper->getPreviewImage(-1);
|
99 |
}
|
100 |
else {
|
101 |
-
echo $uiHelper->getPreviewFile($attachment_id);
|
102 |
-
echo $uiHelper->getPreviewFile(-1);
|
103 |
}
|
104 |
|
105 |
}
|
@@ -139,7 +140,7 @@ $url = $uiHelper->getFormUrl($attachment_id);
|
|
139 |
<label for="replace_type_2"><input id="replace_type_2" type="radio" name="replace_type" value="replace_and_search" <?php echo $searchreplace_disabled ?> > <?php echo __("Replace the file, use new file name and update all links", "enable-media-replace"); ?>
|
140 |
</label>
|
141 |
|
142 |
-
<p class="howto"><?php printf( esc_html__("Note: If you check this option, the name and type of the file you are about to upload will replace the old file. All links pointing to the current file (%s) will be updated to point to the new file name.", "enable-media-replace"), $filename ); ?></p>
|
143 |
|
144 |
<!-- <p class="howto"><?php echo esc_html__("Please note that if you upload a new image, only embeds/links of the original size image will be replaced in your posts.", "enable-media-replace"); ?></p> -->
|
145 |
|
88 |
<div class='image_previews'>
|
89 |
<?php if (wp_attachment_is('image', $attachment_id) || $source_mime == 'application/pdf')
|
90 |
{
|
91 |
+
echo $uiHelper->getPreviewImage($attachment_id, $file);
|
92 |
+
echo $uiHelper->getPreviewImage(-1, $file);
|
93 |
}
|
94 |
else {
|
95 |
+
|
96 |
if (strlen($filepath) == 0) // check if image in error state.
|
97 |
{
|
98 |
echo $uiHelper->getPreviewError(-1);
|
99 |
+
echo $uiHelper->getPreviewImage(-1, $file);
|
100 |
}
|
101 |
else {
|
102 |
+
echo $uiHelper->getPreviewFile($attachment_id, $file);
|
103 |
+
echo $uiHelper->getPreviewFile(-1, $file);
|
104 |
}
|
105 |
|
106 |
}
|
140 |
<label for="replace_type_2"><input id="replace_type_2" type="radio" name="replace_type" value="replace_and_search" <?php echo $searchreplace_disabled ?> > <?php echo __("Replace the file, use new file name and update all links", "enable-media-replace"); ?>
|
141 |
</label>
|
142 |
|
143 |
+
<p class="howto"><?php printf( esc_html__("Note: If you check this option, the name and type of the file you are about to upload will replace the old file. All links pointing to the current file (%s) will be updated to point to the new file name. (If any other websites link to the file directly, those links will no longer work. Be careful.)", "enable-media-replace"), $filename ); ?></p>
|
144 |
|
145 |
<!-- <p class="howto"><?php echo esc_html__("Please note that if you upload a new image, only embeds/links of the original size image will be replaced in your posts.", "enable-media-replace"); ?></p> -->
|
146 |
|
@@ -10,8 +10,6 @@ use EnableMediaReplace\Notices\NoticeController as Notices;
|
|
10 |
if (!current_user_can('upload_files'))
|
11 |
wp_die( esc_html__('You do not have permission to upload files.', 'enable-media-replace') );
|
12 |
|
13 |
-
|
14 |
-
|
15 |
/*require_once('classes/replacer.php');
|
16 |
require_once('classes/file.php'); */
|
17 |
|
10 |
if (!current_user_can('upload_files'))
|
11 |
wp_die( esc_html__('You do not have permission to upload files.', 'enable-media-replace') );
|
12 |
|
|
|
|
|
13 |
/*require_once('classes/replacer.php');
|
14 |
require_once('classes/file.php'); */
|
15 |
|