Version Description
Release date: June 9th 2020 * New - In edit media screen EMR notes user who replaced file if this was not uploader; * New - Added Drag and Drop area for files; * New - When replacing with new file name, now also possible to update upload path; * Fix - Various minor CSS tweaks and fixes; * Update of Underlying libraries
Download this release
Release Info
| Developer | petredobrescu |
| Plugin | |
| Version | 3.4.0 |
| Comparing to | |
| See all releases | |
Code changes from version 3.3.12 to 3.4.0
- build/shortpixel/PackageLoader.php +24 -6
- build/shortpixel/log/src/ShortPixelLogger.php +6 -0
- build/shortpixel/notices/composer.json +1 -1
- build/shortpixel/notices/src/NoticeController.php +34 -14
- build/shortpixel/notices/src/NoticeModel.php +69 -4
- classes/emr-plugin.php +20 -9
- classes/replacer.php +55 -8
- classes/uihelper.php +10 -0
- css/admin.css +50 -9
- enable-media-replace.php +3 -2
- js/emr_admin.js +75 -4
- notice.php +0 -25
- popup.php +0 -156
- readme.txt +11 -2
- scss/admin.scss +55 -1
- upload.php +0 -412
- views/popup.php +43 -26
- views/upload.php +31 -3
build/shortpixel/PackageLoader.php
CHANGED
|
@@ -3,12 +3,26 @@ namespace EnableMediaReplace\Build;
|
|
| 3 |
|
| 4 |
class PackageLoader
|
| 5 |
{
|
| 6 |
-
|
|
|
|
| 7 |
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
|
| 13 |
public function load($dir)
|
| 14 |
{
|
|
@@ -61,7 +75,11 @@ class PackageLoader
|
|
| 61 |
if ($psr4) {
|
| 62 |
$classname = str_replace($namespace, "", $classname);
|
| 63 |
}
|
| 64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
|
| 66 |
foreach ($classpaths as $classpath) {
|
| 67 |
$fullpath = trailingslashit($dir) . trailingslashit($classpath) .$filename;
|
| 3 |
|
| 4 |
class PackageLoader
|
| 5 |
{
|
| 6 |
+
public $dir;
|
| 7 |
+
public $composerFile = false;
|
| 8 |
|
| 9 |
+
public function __construct()
|
| 10 |
+
{
|
| 11 |
+
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
public function setComposerFile($filePath)
|
| 15 |
+
{
|
| 16 |
+
$this->composerFile = json_decode(file_get_contents($filePath),1);
|
| 17 |
+
}
|
| 18 |
+
|
| 19 |
+
public function getComposerFile($filePath = false )
|
| 20 |
+
{
|
| 21 |
+
if (! $this->composerFile)
|
| 22 |
+
$this->composerFile = json_decode(file_get_contents($this->dir."/composer.json"), 1);
|
| 23 |
+
|
| 24 |
+
return $this->composerFile;
|
| 25 |
+
}
|
| 26 |
|
| 27 |
public function load($dir)
|
| 28 |
{
|
| 75 |
if ($psr4) {
|
| 76 |
$classname = str_replace($namespace, "", $classname);
|
| 77 |
}
|
| 78 |
+
|
| 79 |
+
// $filename = preg_replace("#\\\\#", "", $classname).".php";
|
| 80 |
+
// This is fix for nested classes which were losing a /
|
| 81 |
+
$filename = ltrim($classname .'.php', '\\');
|
| 82 |
+
$filename = str_replace('\\','/', $filename);
|
| 83 |
|
| 84 |
foreach ($classpaths as $classpath) {
|
| 85 |
$fullpath = trailingslashit($dir) . trailingslashit($classpath) .$filename;
|
build/shortpixel/log/src/ShortPixelLogger.php
CHANGED
|
@@ -250,6 +250,12 @@ namespace EnableMediaReplace\ShortPixelLogger;
|
|
| 250 |
$log->addLog($message, $level, $args);
|
| 251 |
}
|
| 252 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 253 |
public static function logLevel($level)
|
| 254 |
{
|
| 255 |
$log = self::getInstance();
|
| 250 |
$log->addLog($message, $level, $args);
|
| 251 |
}
|
| 252 |
|
| 253 |
+
/** These should be removed every release. They are temporary only for d'bugging the current release */
|
| 254 |
+
public static function addTemp($message, $args = array())
|
| 255 |
+
{
|
| 256 |
+
self::addDebug($message, $args);
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
public static function logLevel($level)
|
| 260 |
{
|
| 261 |
$log = self::getInstance();
|
build/shortpixel/notices/composer.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
{
|
| 2 |
"name": "shortpixel/notices",
|
| 3 |
"description": "ShortPixel WordPress Notice System",
|
| 4 |
-
"version": "1.
|
| 5 |
"type": "library",
|
| 6 |
"license": "MIT",
|
| 7 |
"authors": [
|
| 1 |
{
|
| 2 |
"name": "shortpixel/notices",
|
| 3 |
"description": "ShortPixel WordPress Notice System",
|
| 4 |
+
"version": "1.5",
|
| 5 |
"type": "library",
|
| 6 |
"license": "MIT",
|
| 7 |
"authors": [
|
build/shortpixel/notices/src/NoticeController.php
CHANGED
|
@@ -19,7 +19,6 @@ class NoticeController //extends ShortPixelController
|
|
| 19 |
/** For backward compat. Never call constructor directly. */
|
| 20 |
public function __construct()
|
| 21 |
{
|
| 22 |
-
// $this->loadModel('notice');
|
| 23 |
$ns = __NAMESPACE__;
|
| 24 |
$ns = substr($ns, 0, strpos($ns, '\\')); // try to get first part of namespace
|
| 25 |
$this->notice_option = $ns . '-notices';
|
|
@@ -65,8 +64,6 @@ class NoticeController //extends ShortPixelController
|
|
| 65 |
{
|
| 66 |
$notices = get_option($this->notice_option, false);
|
| 67 |
$cnotice = (is_array($notices)) ? count($notices) : 0;
|
| 68 |
-
if ($cnotice > 0)
|
| 69 |
-
Log::addDebug('Notice Control - #num notices' . $cnotice);
|
| 70 |
|
| 71 |
if ($notices !== false && is_array($notices))
|
| 72 |
{
|
|
@@ -90,7 +87,7 @@ class NoticeController //extends ShortPixelController
|
|
| 90 |
foreach(self::$notices as $nitem)
|
| 91 |
{
|
| 92 |
if ($nitem->message == $notice->message && $nitem->code == $notice->code) // same message.
|
| 93 |
-
return $
|
| 94 |
}
|
| 95 |
}
|
| 96 |
self::$notices[] = $notice;
|
|
@@ -141,6 +138,7 @@ class NoticeController //extends ShortPixelController
|
|
| 141 |
public function getNoticesForDisplay()
|
| 142 |
{
|
| 143 |
$newNotices = array();
|
|
|
|
| 144 |
foreach(self::$notices as $notice)
|
| 145 |
{
|
| 146 |
if ($notice->isDismissed()) // dismissed never displays.
|
|
@@ -256,7 +254,6 @@ class NoticeController //extends ShortPixelController
|
|
| 256 |
$noticeController = self::getInstance();
|
| 257 |
$notice = $noticeController->addNotice($message, NoticeModel::NOTICE_WARNING, $unique);
|
| 258 |
return $notice;
|
| 259 |
-
|
| 260 |
}
|
| 261 |
|
| 262 |
public static function addSuccess($message, $unique = false)
|
|
@@ -267,7 +264,23 @@ class NoticeController //extends ShortPixelController
|
|
| 267 |
|
| 268 |
}
|
| 269 |
|
| 270 |
-
public static function
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 271 |
{
|
| 272 |
$noticeController = self::getInstance();
|
| 273 |
$existing = $noticeController->getNoticeByID($key);
|
|
@@ -275,17 +288,24 @@ class NoticeController //extends ShortPixelController
|
|
| 275 |
// if this key already exists, don't allow the new notice to be entered into the array. Remove it since it's already created.
|
| 276 |
if ($existing)
|
| 277 |
{
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 285 |
}
|
| 286 |
else
|
| 287 |
{
|
| 288 |
-
$notice->setPersistent($key, $suppress); // set this notice persistent.
|
| 289 |
}
|
| 290 |
|
| 291 |
$noticeController->update();
|
| 19 |
/** For backward compat. Never call constructor directly. */
|
| 20 |
public function __construct()
|
| 21 |
{
|
|
|
|
| 22 |
$ns = __NAMESPACE__;
|
| 23 |
$ns = substr($ns, 0, strpos($ns, '\\')); // try to get first part of namespace
|
| 24 |
$this->notice_option = $ns . '-notices';
|
| 64 |
{
|
| 65 |
$notices = get_option($this->notice_option, false);
|
| 66 |
$cnotice = (is_array($notices)) ? count($notices) : 0;
|
|
|
|
|
|
|
| 67 |
|
| 68 |
if ($notices !== false && is_array($notices))
|
| 69 |
{
|
| 87 |
foreach(self::$notices as $nitem)
|
| 88 |
{
|
| 89 |
if ($nitem->message == $notice->message && $nitem->code == $notice->code) // same message.
|
| 90 |
+
return $nitem; // return the notice with the same message.
|
| 91 |
}
|
| 92 |
}
|
| 93 |
self::$notices[] = $notice;
|
| 138 |
public function getNoticesForDisplay()
|
| 139 |
{
|
| 140 |
$newNotices = array();
|
| 141 |
+
|
| 142 |
foreach(self::$notices as $notice)
|
| 143 |
{
|
| 144 |
if ($notice->isDismissed()) // dismissed never displays.
|
| 254 |
$noticeController = self::getInstance();
|
| 255 |
$notice = $noticeController->addNotice($message, NoticeModel::NOTICE_WARNING, $unique);
|
| 256 |
return $notice;
|
|
|
|
| 257 |
}
|
| 258 |
|
| 259 |
public static function addSuccess($message, $unique = false)
|
| 264 |
|
| 265 |
}
|
| 266 |
|
| 267 |
+
public static function addDetail($notice, $detail)
|
| 268 |
+
{
|
| 269 |
+
$noticeController = self::getInstance();
|
| 270 |
+
$notice->addDetail($detail);
|
| 271 |
+
|
| 272 |
+
// $notice_id = spl_object_id($notice);
|
| 273 |
+
|
| 274 |
+
$noticeController->update();
|
| 275 |
+
}
|
| 276 |
+
|
| 277 |
+
/** Make a regular notice persistent across multiple page loads
|
| 278 |
+
* @param $notice NoticeModel The Notice to make Persistent
|
| 279 |
+
* @param $key String Identifier of the persistent notice.
|
| 280 |
+
* @param $suppress Int When dismissed, time to stay dismissed
|
| 281 |
+
* @param $callback Function Callable function
|
| 282 |
+
*/
|
| 283 |
+
public static function makePersistent($notice, $key, $suppress = -1, $callback = null)
|
| 284 |
{
|
| 285 |
$noticeController = self::getInstance();
|
| 286 |
$existing = $noticeController->getNoticeByID($key);
|
| 288 |
// if this key already exists, don't allow the new notice to be entered into the array. Remove it since it's already created.
|
| 289 |
if ($existing)
|
| 290 |
{
|
| 291 |
+
for($i = 0; $i < count(self::$notices); $i++)
|
| 292 |
+
{
|
| 293 |
+
$item = self::$notices[$i];
|
| 294 |
+
|
| 295 |
+
if ($item->message == $notice->message && $item->getID() == null)
|
| 296 |
+
{
|
| 297 |
+
if ($item->message != $existing->message) // allow the persistent message to be updated, if something else is served on this ID
|
| 298 |
+
{
|
| 299 |
+
$existing->message = $item->message;
|
| 300 |
+
}
|
| 301 |
+
unset(self::$notices[$i]);
|
| 302 |
+
}
|
| 303 |
+
//if ($notice_item )
|
| 304 |
+
}
|
| 305 |
}
|
| 306 |
else
|
| 307 |
{
|
| 308 |
+
$notice->setPersistent($key, $suppress, $callback); // set this notice persistent.
|
| 309 |
}
|
| 310 |
|
| 311 |
$noticeController->update();
|
build/shortpixel/notices/src/NoticeModel.php
CHANGED
|
@@ -4,6 +4,7 @@ namespace EnableMediaReplace\Notices;
|
|
| 4 |
class NoticeModel //extends ShortPixelModel
|
| 5 |
{
|
| 6 |
public $message; // The message we want to convey.
|
|
|
|
| 7 |
public $code;
|
| 8 |
|
| 9 |
private $id = null; // used for persistent messages.
|
|
@@ -16,6 +17,7 @@ class NoticeModel //extends ShortPixelModel
|
|
| 16 |
public $messageType = self::NOTICE_NORMAL;
|
| 17 |
|
| 18 |
public $notice_action; // empty unless for display. Ajax action to talk back to controller.
|
|
|
|
| 19 |
|
| 20 |
public static $icons = array();
|
| 21 |
|
|
@@ -72,15 +74,43 @@ class NoticeModel //extends ShortPixelModel
|
|
| 72 |
$this->suppress_until = time() + $this->suppress_period;
|
| 73 |
}
|
| 74 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
/** Set a notice persistent. Meaning it shows every page load until dismissed.
|
| 76 |
* @param $key Unique Key of this message. Required
|
| 77 |
* @param $suppress When dismissed do not show this message again for X amount of time. When -1 it will just be dropped from the Notices and not suppressed
|
| 78 |
*/
|
| 79 |
-
public function setPersistent($key, $suppress = -1)
|
| 80 |
{
|
| 81 |
$this->id = $key;
|
| 82 |
$this->is_persistent = true;
|
| 83 |
$this->suppress_period = $suppress;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
}
|
| 85 |
|
| 86 |
public static function setIcon($notice_type, $icon)
|
|
@@ -111,6 +141,13 @@ class NoticeModel //extends ShortPixelModel
|
|
| 111 |
|
| 112 |
$icon = '';
|
| 113 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
switch($this->messageType)
|
| 115 |
{
|
| 116 |
case self::NOTICE_ERROR:
|
|
@@ -147,9 +184,24 @@ class NoticeModel //extends ShortPixelModel
|
|
| 147 |
$class .= 'is-persistent ';
|
| 148 |
}
|
| 149 |
|
| 150 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 151 |
|
| 152 |
-
$output = "<div $id class='$class'><span class='icon'> " . $icon . "</span> <span class='content'>" . $this->message . "</span></div>";
|
| 153 |
if ($this->is_persistent && $this->is_removable)
|
| 154 |
{
|
| 155 |
$output .= "<script type='text/javascript'>\n" . $this->getDismissJS() . "\n</script>";
|
|
@@ -158,6 +210,19 @@ class NoticeModel //extends ShortPixelModel
|
|
| 158 |
|
| 159 |
}
|
| 160 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 161 |
private function getDismissJS()
|
| 162 |
{
|
| 163 |
$url = wp_json_encode(admin_url('admin-ajax.php'));
|
|
@@ -168,7 +233,7 @@ class NoticeModel //extends ShortPixelModel
|
|
| 168 |
|
| 169 |
// $data_string = "{action:'$this->notice_action'}";
|
| 170 |
|
| 171 |
-
$js = "jQuery(document).on('click','#$this->id button',
|
| 172 |
function() {
|
| 173 |
var data = $data;
|
| 174 |
var url = $url;
|
| 4 |
class NoticeModel //extends ShortPixelModel
|
| 5 |
{
|
| 6 |
public $message; // The message we want to convey.
|
| 7 |
+
public $details = array(); // extra details, like the files involved. Something could be hideable in the future.
|
| 8 |
public $code;
|
| 9 |
|
| 10 |
private $id = null; // used for persistent messages.
|
| 17 |
public $messageType = self::NOTICE_NORMAL;
|
| 18 |
|
| 19 |
public $notice_action; // empty unless for display. Ajax action to talk back to controller.
|
| 20 |
+
protected $callback; // empty unless callback is needed
|
| 21 |
|
| 22 |
public static $icons = array();
|
| 23 |
|
| 74 |
$this->suppress_until = time() + $this->suppress_period;
|
| 75 |
}
|
| 76 |
|
| 77 |
+
public function unDismiss()
|
| 78 |
+
{
|
| 79 |
+
$this->is_dismissed = false;
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
public function setDismissedUntil($timestamp)
|
| 83 |
+
{
|
| 84 |
+
$this->suppress_until = $timestamp;
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
/** Support for extra information beyond the message.
|
| 88 |
+
* Can help to not overwhelm users w/ the same message but different file /circumstances.
|
| 89 |
+
*/
|
| 90 |
+
public function addDetail($detail, $clean = false)
|
| 91 |
+
{
|
| 92 |
+
if ($clean)
|
| 93 |
+
$this->details = array();
|
| 94 |
+
|
| 95 |
+
if (! in_array($detail, $this->details) )
|
| 96 |
+
$this->details[] = $detail;
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
|
| 101 |
/** Set a notice persistent. Meaning it shows every page load until dismissed.
|
| 102 |
* @param $key Unique Key of this message. Required
|
| 103 |
* @param $suppress When dismissed do not show this message again for X amount of time. When -1 it will just be dropped from the Notices and not suppressed
|
| 104 |
*/
|
| 105 |
+
public function setPersistent($key, $suppress = -1, $callback = null)
|
| 106 |
{
|
| 107 |
$this->id = $key;
|
| 108 |
$this->is_persistent = true;
|
| 109 |
$this->suppress_period = $suppress;
|
| 110 |
+
if ( ! is_null($callback) && is_callable($callback))
|
| 111 |
+
{
|
| 112 |
+
$this->callback = $callback;
|
| 113 |
+
}
|
| 114 |
}
|
| 115 |
|
| 116 |
public static function setIcon($notice_type, $icon)
|
| 141 |
|
| 142 |
$icon = '';
|
| 143 |
|
| 144 |
+
if ($this->callback)
|
| 145 |
+
{
|
| 146 |
+
$return = call_user_func($this->callback, $this);
|
| 147 |
+
if ($return === false) // don't display is callback returns false explicitly.
|
| 148 |
+
return;
|
| 149 |
+
}
|
| 150 |
+
|
| 151 |
switch($this->messageType)
|
| 152 |
{
|
| 153 |
case self::NOTICE_ERROR:
|
| 184 |
$class .= 'is-persistent ';
|
| 185 |
}
|
| 186 |
|
| 187 |
+
$id = ! is_null($this->id) ? $this->id : uniqid();
|
| 188 |
+
//'id="' . $this->id . '"'
|
| 189 |
+
$output = "<div id='$id' class='$class'><span class='icon'> " . $icon . "</span> <span class='content'>" . $this->message;
|
| 190 |
+
if ($this->hasDetails())
|
| 191 |
+
{
|
| 192 |
+
$output .= '<div class="details-wrapper">
|
| 193 |
+
<input type="checkbox" name="detailhider" id="check-' . $id .'">
|
| 194 |
+
<label for="check-' . $id . '" class="show-details"><span>' . __('See Details', 'shortpixel-image-optimiser') . '</span>
|
| 195 |
+
</label>';
|
| 196 |
+
|
| 197 |
+
$output .= "<div class='detail-content-wrapper'><p class='detail-content'>" . $this->parseDetails() . "</p></div>";
|
| 198 |
+
$output .= '<label for="check-' . $id . '" class="hide-details"><span>' . __('Hide Details', 'shortpixel-image-optimiser') . '</span></label>';
|
| 199 |
+
|
| 200 |
+
$output .= '</div>'; // detail rapper
|
| 201 |
+
|
| 202 |
+
}
|
| 203 |
+
$output .= "</span></div>";
|
| 204 |
|
|
|
|
| 205 |
if ($this->is_persistent && $this->is_removable)
|
| 206 |
{
|
| 207 |
$output .= "<script type='text/javascript'>\n" . $this->getDismissJS() . "\n</script>";
|
| 210 |
|
| 211 |
}
|
| 212 |
|
| 213 |
+
protected function hasDetails()
|
| 214 |
+
{
|
| 215 |
+
if (is_array($this->details) && count($this->details) > 0)
|
| 216 |
+
return true;
|
| 217 |
+
else
|
| 218 |
+
return false;
|
| 219 |
+
}
|
| 220 |
+
|
| 221 |
+
protected function parseDetails()
|
| 222 |
+
{
|
| 223 |
+
return implode('<BR>', $this->details);
|
| 224 |
+
}
|
| 225 |
+
|
| 226 |
private function getDismissJS()
|
| 227 |
{
|
| 228 |
$url = wp_json_encode(admin_url('admin-ajax.php'));
|
| 233 |
|
| 234 |
// $data_string = "{action:'$this->notice_action'}";
|
| 235 |
|
| 236 |
+
$js = "jQuery(document).on('click','#$this->id button.notice-dismiss',
|
| 237 |
function() {
|
| 238 |
var data = $data;
|
| 239 |
var url = $url;
|
classes/emr-plugin.php
CHANGED
|
@@ -283,7 +283,7 @@ class EnableMediaReplacePlugin
|
|
| 283 |
$form_fields["enable-media-replace"] = array(
|
| 284 |
"label" => esc_html__("Replace media", "enable-media-replace"),
|
| 285 |
"input" => "html",
|
| 286 |
-
"html" => "<
|
| 287 |
);
|
| 288 |
|
| 289 |
return $form_fields;
|
|
@@ -359,17 +359,28 @@ class EnableMediaReplacePlugin
|
|
| 359 |
return false;
|
| 360 |
|
| 361 |
$post_id = $post->ID;
|
| 362 |
-
if ( $post->post_modified
|
| 363 |
-
return;
|
| 364 |
-
}
|
| 365 |
|
| 366 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 367 |
|
| 368 |
-
?>
|
| 369 |
-
<div class="misc-pub-section curtime">
|
| 370 |
-
<span id="timestamp"><?php echo esc_html__( 'Revised', 'enable-media-replace' ); ?>: <b><?php echo $modified; ?></b></span>
|
| 371 |
-
</div>
|
| 372 |
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 373 |
}
|
| 374 |
|
| 375 |
/** When an image is just replaced, it can stuck in the browser cache making a look like it was not replaced. Try
|
| 283 |
$form_fields["enable-media-replace"] = array(
|
| 284 |
"label" => esc_html__("Replace media", "enable-media-replace"),
|
| 285 |
"input" => "html",
|
| 286 |
+
"html" => "<a class='button-secondary' $link>" . esc_html__("Upload a new file", "enable-media-replace") . "</a>", "helps" => esc_html__("To replace the current file, click the link and upload a replacement.", "enable-media-replace")
|
| 287 |
);
|
| 288 |
|
| 289 |
return $form_fields;
|
| 359 |
return false;
|
| 360 |
|
| 361 |
$post_id = $post->ID;
|
| 362 |
+
if ( $post->post_modified !== $post->post_date ) {
|
|
|
|
|
|
|
| 363 |
|
| 364 |
+
$modified = date_i18n( __( 'M j, Y @ H:i' ) , strtotime( $post->post_modified ) );
|
| 365 |
+
?>
|
| 366 |
+
<div class="misc-pub-section curtime">
|
| 367 |
+
<span id="timestamp"><?php echo esc_html__( 'Revised', 'enable-media-replace' ); ?>: <b><?php echo $modified; ?></b></span>
|
| 368 |
+
</div>
|
| 369 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 370 |
<?php
|
| 371 |
+
}
|
| 372 |
+
$author_id = get_post_meta($post_id, '_emr_replace_author', true);
|
| 373 |
+
|
| 374 |
+
if ($author_id)
|
| 375 |
+
{
|
| 376 |
+
$display_name = get_the_author_meta('display_name', $author_id);
|
| 377 |
+
?>
|
| 378 |
+
<div class="misc-pub-section replace_author">
|
| 379 |
+
<span><?php echo esc_html__( 'Replaced By', 'enable-media-replace' ); ?>: <b><?php echo $display_name; ?></b></span>
|
| 380 |
+
</div>
|
| 381 |
+
<?php
|
| 382 |
+
}
|
| 383 |
+
|
| 384 |
}
|
| 385 |
|
| 386 |
/** When an image is just replaced, it can stuck in the browser cache making a look like it was not replaced. Try
|
classes/replacer.php
CHANGED
|
@@ -21,6 +21,8 @@ class Replacer
|
|
| 21 |
protected $target_metadata;
|
| 22 |
protected $target_url;
|
| 23 |
|
|
|
|
|
|
|
| 24 |
protected $replaceMode = 1; // replace if nothing is set
|
| 25 |
protected $timeMode = 1;
|
| 26 |
protected $datetime = null;
|
|
@@ -94,20 +96,25 @@ class Replacer
|
|
| 94 |
$this->targetName = $fileName;
|
| 95 |
//$this->targetFile = new File($file); // this will point to /tmp!
|
| 96 |
|
| 97 |
-
$this->removeCurrent(); // tries to remove the current files.
|
| 98 |
$targetFile = $this->getTargetFile();
|
| 99 |
|
| 100 |
if (is_null($targetFile))
|
| 101 |
{
|
| 102 |
-
|
| 103 |
-
|
|
|
|
| 104 |
}
|
| 105 |
|
|
|
|
|
|
|
| 106 |
$targetFileObj = new File($targetFile);
|
| 107 |
$result = $targetFileObj->checkAndCreateFolder();
|
| 108 |
if ($result === false)
|
| 109 |
Log::addError('Directory creation for targetFile failed');
|
| 110 |
|
|
|
|
|
|
|
|
|
|
| 111 |
/* @todo See if wp_handle_sideload / wp_handle_upload can be more securely used for this */
|
| 112 |
$result_moved = move_uploaded_file($file,$targetFile);
|
| 113 |
|
|
@@ -123,7 +130,7 @@ class Replacer
|
|
| 123 |
if ($this->sourceFile->getPermissions() > 0)
|
| 124 |
chmod( $targetFile, $this->sourceFile->getPermissions() ); // restore permissions
|
| 125 |
else {
|
| 126 |
-
|
| 127 |
}
|
| 128 |
|
| 129 |
// update the file attached. This is required for wp_get_attachment_url to work.
|
|
@@ -149,6 +156,20 @@ class Replacer
|
|
| 149 |
wp_update_attachment_metadata( $this->post_id, $metadata );
|
| 150 |
$this->target_metadata = $metadata;
|
| 151 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 152 |
if ($this->replaceMode == self::MODE_SEARCHREPLACE)
|
| 153 |
{
|
| 154 |
// Write new image title.
|
|
@@ -205,6 +226,7 @@ class Replacer
|
|
| 205 |
|
| 206 |
do_action("enable-media-replace-upload-done", $this->target_url, $this->source_url);
|
| 207 |
|
|
|
|
| 208 |
}
|
| 209 |
|
| 210 |
protected function getNewTitle()
|
|
@@ -236,6 +258,20 @@ class Replacer
|
|
| 236 |
return $this->sourceFile;
|
| 237 |
}
|
| 238 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 239 |
/** Returns a full target path to place to new file. Including the file name! **/
|
| 240 |
protected function getTargetFile()
|
| 241 |
{
|
|
@@ -247,6 +283,16 @@ class Replacer
|
|
| 247 |
elseif ($this->replaceMode == self::MODE_SEARCHREPLACE)
|
| 248 |
{
|
| 249 |
$path = $this->sourceFile->getFilePath();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 250 |
$unique = wp_unique_filename($path, $this->targetName);
|
| 251 |
|
| 252 |
$new_filename = apply_filters( 'emr_unique_filename', $unique, $path, $this->post_id );
|
|
@@ -261,11 +307,12 @@ class Replacer
|
|
| 261 |
$targetFile = trailingslashit($upload_dir['path']) . wp_unique_filename($targetFile, $this->targetName);
|
| 262 |
}
|
| 263 |
else {
|
| 264 |
-
$err = 'EMR could not establish a proper destination for replacement';
|
|
|
|
| 265 |
Log::addError($err);
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
}
|
| 270 |
}
|
| 271 |
|
| 21 |
protected $target_metadata;
|
| 22 |
protected $target_url;
|
| 23 |
|
| 24 |
+
protected $target_location = false; // option for replacing to another target location
|
| 25 |
+
|
| 26 |
protected $replaceMode = 1; // replace if nothing is set
|
| 27 |
protected $timeMode = 1;
|
| 28 |
protected $datetime = null;
|
| 96 |
$this->targetName = $fileName;
|
| 97 |
//$this->targetFile = new File($file); // this will point to /tmp!
|
| 98 |
|
|
|
|
| 99 |
$targetFile = $this->getTargetFile();
|
| 100 |
|
| 101 |
if (is_null($targetFile))
|
| 102 |
{
|
| 103 |
+
return null;
|
| 104 |
+
// $ex = __('Target File could not be set. The source file might not be there. In case of search and replace, a filter might prevent this', "enable-media-replace");
|
| 105 |
+
// throw new \RuntimeException($ex);
|
| 106 |
}
|
| 107 |
|
| 108 |
+
|
| 109 |
+
|
| 110 |
$targetFileObj = new File($targetFile);
|
| 111 |
$result = $targetFileObj->checkAndCreateFolder();
|
| 112 |
if ($result === false)
|
| 113 |
Log::addError('Directory creation for targetFile failed');
|
| 114 |
|
| 115 |
+
|
| 116 |
+
$this->removeCurrent(); // tries to remove the current files.
|
| 117 |
+
|
| 118 |
/* @todo See if wp_handle_sideload / wp_handle_upload can be more securely used for this */
|
| 119 |
$result_moved = move_uploaded_file($file,$targetFile);
|
| 120 |
|
| 130 |
if ($this->sourceFile->getPermissions() > 0)
|
| 131 |
chmod( $targetFile, $this->sourceFile->getPermissions() ); // restore permissions
|
| 132 |
else {
|
| 133 |
+
Log::addWarning('Setting permissions failed');
|
| 134 |
}
|
| 135 |
|
| 136 |
// update the file attached. This is required for wp_get_attachment_url to work.
|
| 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 |
+
Log::addTemp('Previous Author ID', $author_id);
|
| 162 |
+
if ( intval($this->source_post->post_author) !== get_current_user_id())
|
| 163 |
+
{
|
| 164 |
+
Log::addTemp("THIS AUTHOR NOT THE SAME AS THE OTHER");
|
| 165 |
+
update_post_meta($this->post_id, '_emr_replace_author', get_current_user_id());
|
| 166 |
+
}
|
| 167 |
+
elseif ($author_id)
|
| 168 |
+
{
|
| 169 |
+
|
| 170 |
+
delete_post_meta($this->post_id, '_emr_replace_author');
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
if ($this->replaceMode == self::MODE_SEARCHREPLACE)
|
| 174 |
{
|
| 175 |
// Write new image title.
|
| 226 |
|
| 227 |
do_action("enable-media-replace-upload-done", $this->target_url, $this->source_url);
|
| 228 |
|
| 229 |
+
return true;
|
| 230 |
}
|
| 231 |
|
| 232 |
protected function getNewTitle()
|
| 258 |
return $this->sourceFile;
|
| 259 |
}
|
| 260 |
|
| 261 |
+
public function setNewTargetLocation($new_rel_location)
|
| 262 |
+
{
|
| 263 |
+
$uploadDir = wp_upload_dir();
|
| 264 |
+
$newPath = trailingslashit($uploadDir['basedir']) . $new_rel_location;
|
| 265 |
+
|
| 266 |
+
if (! is_dir($newPath))
|
| 267 |
+
{
|
| 268 |
+
Notices::addError(__('Specificed new directory does not exist. Path must be a relative path from the upload directory and exist', 'enable-media-replace'));
|
| 269 |
+
return false;
|
| 270 |
+
}
|
| 271 |
+
$this->target_location = trailingslashit($newPath);
|
| 272 |
+
return true;
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
/** Returns a full target path to place to new file. Including the file name! **/
|
| 276 |
protected function getTargetFile()
|
| 277 |
{
|
| 283 |
elseif ($this->replaceMode == self::MODE_SEARCHREPLACE)
|
| 284 |
{
|
| 285 |
$path = $this->sourceFile->getFilePath();
|
| 286 |
+
if ($this->target_location) // Replace to another path.
|
| 287 |
+
{
|
| 288 |
+
$otherTarget = new File($this->target_location . $this->targetName);
|
| 289 |
+
if ($otherTarget->exists())
|
| 290 |
+
{
|
| 291 |
+
Notices::addError(__('In specificied directory there is already a file with the same name. Can\'t replace.', 'enable-media-replace'));
|
| 292 |
+
return null;
|
| 293 |
+
}
|
| 294 |
+
$path = $this->target_location; // if all went well.
|
| 295 |
+
}
|
| 296 |
$unique = wp_unique_filename($path, $this->targetName);
|
| 297 |
|
| 298 |
$new_filename = apply_filters( 'emr_unique_filename', $unique, $path, $this->post_id );
|
| 307 |
$targetFile = trailingslashit($upload_dir['path']) . wp_unique_filename($targetFile, $this->targetName);
|
| 308 |
}
|
| 309 |
else {
|
| 310 |
+
$err = __('EMR could not establish a proper destination for replacement', 'enable-media-replace');
|
| 311 |
+
Notices::addError($err);
|
| 312 |
Log::addError($err);
|
| 313 |
+
// throw new \RuntimeException($err);
|
| 314 |
+
// exit($err); // fallback
|
| 315 |
+
return null;
|
| 316 |
}
|
| 317 |
}
|
| 318 |
|
classes/uihelper.php
CHANGED
|
@@ -348,4 +348,14 @@ class UIHelper
|
|
| 348 |
return $sizes;
|
| 349 |
}
|
| 350 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 351 |
} // class
|
| 348 |
return $sizes;
|
| 349 |
}
|
| 350 |
|
| 351 |
+
/** For Location Dir replacement. Get the Subdir that is in use now. */
|
| 352 |
+
public function getRelPathNow()
|
| 353 |
+
{
|
| 354 |
+
$uploadDir = wp_upload_dir();
|
| 355 |
+
if (isset($uploadDir['subdir']))
|
| 356 |
+
return ltrim($uploadDir['subdir'], '/');
|
| 357 |
+
else
|
| 358 |
+
return false;
|
| 359 |
+
}
|
| 360 |
+
|
| 361 |
} // class
|
css/admin.css
CHANGED
|
@@ -773,6 +773,39 @@
|
|
| 773 |
margin: 0 0 15px 0; }
|
| 774 |
.emr_upload_form .image_chooser.wrapper {
|
| 775 |
min-height: 350px; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 776 |
.emr_upload_form .image_chooser.wrapper .image_previews {
|
| 777 |
margin: 15px 0; }
|
| 778 |
.emr_upload_form .image_chooser.wrapper .image_previews .image_placeholder {
|
|
@@ -886,6 +919,12 @@
|
|
| 886 |
font-size: 20px;
|
| 887 |
vertical-align: top;
|
| 888 |
margin-right: 4px; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 889 |
.emr_upload_form .form_controls.wrapper {
|
| 890 |
clear: both;
|
| 891 |
margin: 8px 0 15px 0;
|
|
@@ -894,7 +933,9 @@
|
|
| 894 |
.emr_upload_form .form_controls.wrapper .button {
|
| 895 |
padding-left: 20px;
|
| 896 |
padding-right: 20px; }
|
| 897 |
-
.emr_upload_form .shortpixel
|
|
|
|
|
|
|
| 898 |
background: #fff;
|
| 899 |
width: 250px;
|
| 900 |
min-height: 270px;
|
|
@@ -903,27 +944,27 @@
|
|
| 903 |
margin-bottom: 25px;
|
| 904 |
float: right;
|
| 905 |
clear: both; }
|
| 906 |
-
.emr_upload_form .shortpixel-
|
| 907 |
line-height: 1.3em; }
|
| 908 |
-
.emr_upload_form .shortpixel-
|
| 909 |
background-color: #dcfdff; }
|
| 910 |
-
.emr_upload_form .shortpixel-
|
| 911 |
text-align: center;
|
| 912 |
margin: 0 0 25px 0; }
|
| 913 |
-
.emr_upload_form .shortpixel-
|
| 914 |
max-width: 140px;
|
| 915 |
max-height: 140px;
|
| 916 |
margin: 0; }
|
| 917 |
-
.emr_upload_form .shortpixel-
|
| 918 |
color: #00d0e5;
|
| 919 |
font-size: 20px;
|
| 920 |
text-align: center;
|
| 921 |
margin: 0;
|
| 922 |
line-height: 1.3em; }
|
| 923 |
-
.emr_upload_form .shortpixel-
|
| 924 |
text-align: center;
|
| 925 |
margin-top: 35px; }
|
| 926 |
-
.emr_upload_form .shortpixel-
|
| 927 |
background-color: #ff0000;
|
| 928 |
color: #fff;
|
| 929 |
display: inline-block;
|
|
@@ -931,7 +972,7 @@
|
|
| 931 |
text-decoration: none;
|
| 932 |
font-weight: 700;
|
| 933 |
font-size: 20px; }
|
| 934 |
-
.emr_upload_form .shortpixel-
|
| 935 |
color: #ff0000; }
|
| 936 |
@media (max-width: 1200px) {
|
| 937 |
.emr_upload_form .image_previews {
|
| 773 |
margin: 0 0 15px 0; }
|
| 774 |
.emr_upload_form .image_chooser.wrapper {
|
| 775 |
min-height: 350px; }
|
| 776 |
+
.emr_upload_form .image_chooser.wrapper .emr_drop_area {
|
| 777 |
+
border: 4px dashed #b4b9be;
|
| 778 |
+
max-width: 600px;
|
| 779 |
+
padding: 28px 14px;
|
| 780 |
+
text-align: center;
|
| 781 |
+
position: relative; }
|
| 782 |
+
.emr_upload_form .image_chooser.wrapper .emr_drop_area h1 {
|
| 783 |
+
display: none; }
|
| 784 |
+
.emr_upload_form .image_chooser.wrapper .emr_drop_area .drop-wrapper {
|
| 785 |
+
margin: 0 auto; }
|
| 786 |
+
.emr_upload_form .image_chooser.wrapper .emr_drop_area.drop_breakout {
|
| 787 |
+
position: fixed;
|
| 788 |
+
left: 0;
|
| 789 |
+
right: 0;
|
| 790 |
+
bottom: 0;
|
| 791 |
+
top: 0;
|
| 792 |
+
max-width: none;
|
| 793 |
+
border-color: #83b4d8;
|
| 794 |
+
border-width: 10px;
|
| 795 |
+
z-index: 999999;
|
| 796 |
+
background-color: rgba(68, 68, 68, 0.7); }
|
| 797 |
+
.emr_upload_form .image_chooser.wrapper .emr_drop_area.drop_breakout h1 {
|
| 798 |
+
color: #fff;
|
| 799 |
+
position: absolute;
|
| 800 |
+
font-size: 50px;
|
| 801 |
+
line-height: 50px;
|
| 802 |
+
margin-top: -25px;
|
| 803 |
+
top: 50%;
|
| 804 |
+
width: 100%;
|
| 805 |
+
text-align: center;
|
| 806 |
+
display: block; }
|
| 807 |
+
.emr_upload_form .image_chooser.wrapper .emr_drop_area.drop_breakout .drop-wrapper {
|
| 808 |
+
display: none; }
|
| 809 |
.emr_upload_form .image_chooser.wrapper .image_previews {
|
| 810 |
margin: 15px 0; }
|
| 811 |
.emr_upload_form .image_chooser.wrapper .image_previews .image_placeholder {
|
| 919 |
font-size: 20px;
|
| 920 |
vertical-align: top;
|
| 921 |
margin-right: 4px; }
|
| 922 |
+
.emr_upload_form .options.wrapper .location_option {
|
| 923 |
+
display: none;
|
| 924 |
+
margin-top: 12px; }
|
| 925 |
+
.emr_upload_form .options.wrapper .location_option label {
|
| 926 |
+
vertical-align: baseline;
|
| 927 |
+
margin-right: 8px; }
|
| 928 |
.emr_upload_form .form_controls.wrapper {
|
| 929 |
clear: both;
|
| 930 |
margin: 8px 0 15px 0;
|
| 933 |
.emr_upload_form .form_controls.wrapper .button {
|
| 934 |
padding-left: 20px;
|
| 935 |
padding-right: 20px; }
|
| 936 |
+
.emr_upload_form .shortpixel.notice {
|
| 937 |
+
padding: 12px; }
|
| 938 |
+
.emr_upload_form .shortpixel-offer {
|
| 939 |
background: #fff;
|
| 940 |
width: 250px;
|
| 941 |
min-height: 270px;
|
| 944 |
margin-bottom: 25px;
|
| 945 |
float: right;
|
| 946 |
clear: both; }
|
| 947 |
+
.emr_upload_form .shortpixel-offer h3 {
|
| 948 |
line-height: 1.3em; }
|
| 949 |
+
.emr_upload_form .shortpixel-offer.site-speed {
|
| 950 |
background-color: #dcfdff; }
|
| 951 |
+
.emr_upload_form .shortpixel-offer.site-speed .img-wrapper {
|
| 952 |
text-align: center;
|
| 953 |
margin: 0 0 25px 0; }
|
| 954 |
+
.emr_upload_form .shortpixel-offer.site-speed .img-wrapper img {
|
| 955 |
max-width: 140px;
|
| 956 |
max-height: 140px;
|
| 957 |
margin: 0; }
|
| 958 |
+
.emr_upload_form .shortpixel-offer.site-speed h3 {
|
| 959 |
color: #00d0e5;
|
| 960 |
font-size: 20px;
|
| 961 |
text-align: center;
|
| 962 |
margin: 0;
|
| 963 |
line-height: 1.3em; }
|
| 964 |
+
.emr_upload_form .shortpixel-offer.site-speed .button-wrapper {
|
| 965 |
text-align: center;
|
| 966 |
margin-top: 35px; }
|
| 967 |
+
.emr_upload_form .shortpixel-offer.site-speed .button-wrapper a {
|
| 968 |
background-color: #ff0000;
|
| 969 |
color: #fff;
|
| 970 |
display: inline-block;
|
| 972 |
text-decoration: none;
|
| 973 |
font-weight: 700;
|
| 974 |
font-size: 20px; }
|
| 975 |
+
.emr_upload_form .shortpixel-offer.site-speed .red {
|
| 976 |
color: #ff0000; }
|
| 977 |
@media (max-width: 1200px) {
|
| 978 |
.emr_upload_form .image_previews {
|
enable-media-replace.php
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 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.
|
| 7 |
Author: ShortPixel
|
| 8 |
Author URI: https://shortpixel.com
|
| 9 |
Text Domain: enable-media-replace
|
|
@@ -25,7 +25,8 @@ http://www.gnu.org/licenses/gpl.html
|
|
| 25 |
*/
|
| 26 |
|
| 27 |
namespace EnableMediaReplace;
|
| 28 |
-
|
|
|
|
| 29 |
|
| 30 |
if ( ! defined( 'ABSPATH' ) ) {
|
| 31 |
exit; // Exit if accessed directly.
|
| 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.0
|
| 7 |
Author: ShortPixel
|
| 8 |
Author URI: https://shortpixel.com
|
| 9 |
Text Domain: enable-media-replace
|
| 25 |
*/
|
| 26 |
|
| 27 |
namespace EnableMediaReplace;
|
| 28 |
+
|
| 29 |
+
define('EMR_VERSION', '3.4.0');
|
| 30 |
|
| 31 |
if ( ! defined( 'ABSPATH' ) ) {
|
| 32 |
exit; // Exit if accessed directly.
|
js/emr_admin.js
CHANGED
|
@@ -9,8 +9,11 @@
|
|
| 9 |
|
| 10 |
var is_debug = false;
|
| 11 |
|
|
|
|
|
|
|
| 12 |
this.init = function()
|
| 13 |
{
|
|
|
|
| 14 |
if ( emr_options.is_debug)
|
| 15 |
{
|
| 16 |
this.is_debug = true;
|
|
@@ -18,7 +21,14 @@
|
|
| 18 |
}
|
| 19 |
|
| 20 |
$('input[name="timestamp_replace"]').on('change', $.proxy(this.checkCustomDate, this));
|
|
|
|
| 21 |
$('input[name="userfile"]').on('change', $.proxy(this.handleImage, this));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
this.checkCustomDate();
|
| 23 |
this.loadDatePicker();
|
| 24 |
|
|
@@ -34,8 +44,9 @@
|
|
| 34 |
}
|
| 35 |
|
| 36 |
this.updateTextLayer(source, false);
|
|
|
|
| 37 |
|
| 38 |
-
}
|
| 39 |
this.loadDatePicker = function()
|
| 40 |
{
|
| 41 |
$('#emr_datepicker').datepicker({
|
|
@@ -156,17 +167,32 @@
|
|
| 156 |
if (! is_empty && target_type != source_type)
|
| 157 |
{
|
| 158 |
this.debug(target_type + ' not ' + source_type);
|
| 159 |
-
this.
|
|
|
|
|
|
|
| 160 |
}
|
| 161 |
|
| 162 |
if (! is_empty && emr_options.allowed_mime.indexOf(target_type) == -1)
|
| 163 |
{
|
| 164 |
this.debug(target_type + ' not ' + ' in allowed types ');
|
| 165 |
-
this.
|
|
|
|
|
|
|
|
|
|
| 166 |
}
|
| 167 |
// this.debug(emr_options.allowed_mime);
|
| 168 |
|
| 169 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 170 |
// replace the text, check if text is there ( or hide ), and fix the layout.
|
| 171 |
this.updateTextLayer = function (preview, newtext)
|
| 172 |
{
|
|
@@ -236,6 +262,51 @@
|
|
| 236 |
{
|
| 237 |
console.debug(message);
|
| 238 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 239 |
} // emrIf
|
| 240 |
|
| 241 |
jQuery(document).ready(function($)
|
| 9 |
|
| 10 |
var is_debug = false;
|
| 11 |
|
| 12 |
+
var is_dragging = false;
|
| 13 |
+
|
| 14 |
this.init = function()
|
| 15 |
{
|
| 16 |
+
|
| 17 |
if ( emr_options.is_debug)
|
| 18 |
{
|
| 19 |
this.is_debug = true;
|
| 21 |
}
|
| 22 |
|
| 23 |
$('input[name="timestamp_replace"]').on('change', $.proxy(this.checkCustomDate, this));
|
| 24 |
+
$('input[name="replace_type"]').on('change', $.proxy(this.showReplaceOptions, this));
|
| 25 |
$('input[name="userfile"]').on('change', $.proxy(this.handleImage, this));
|
| 26 |
+
|
| 27 |
+
// DragDrop
|
| 28 |
+
$('.wrap.emr_upload_form').on('dragover', $.proxy(this.dragOverArea, this));
|
| 29 |
+
$('.wrap.emr_upload_form').on('dragleave', $.proxy(this.dragOutArea, this));
|
| 30 |
+
$('.emr_drop_area').on('drop', $.proxy(this.fileDrop, this));
|
| 31 |
+
|
| 32 |
this.checkCustomDate();
|
| 33 |
this.loadDatePicker();
|
| 34 |
|
| 44 |
}
|
| 45 |
|
| 46 |
this.updateTextLayer(source, false);
|
| 47 |
+
this.showReplaceOptions();
|
| 48 |
|
| 49 |
+
}
|
| 50 |
this.loadDatePicker = function()
|
| 51 |
{
|
| 52 |
$('#emr_datepicker').datepicker({
|
| 167 |
if (! is_empty && target_type != source_type)
|
| 168 |
{
|
| 169 |
this.debug(target_type + ' not ' + source_type);
|
| 170 |
+
var falsePositive = this.checkFalsePositiveType(source_type, target_type);
|
| 171 |
+
if (! falsePositive)
|
| 172 |
+
this.warningFileType();
|
| 173 |
}
|
| 174 |
|
| 175 |
if (! is_empty && emr_options.allowed_mime.indexOf(target_type) == -1)
|
| 176 |
{
|
| 177 |
this.debug(target_type + ' not ' + ' in allowed types ');
|
| 178 |
+
var falsePositive = this.checkFalsePositiveType(source_type, target_type);
|
| 179 |
+
|
| 180 |
+
if (! falsePositive)
|
| 181 |
+
this.warningMimeType();
|
| 182 |
}
|
| 183 |
// this.debug(emr_options.allowed_mime);
|
| 184 |
|
| 185 |
+
}
|
| 186 |
+
this.checkFalsePositiveType = function(source_type, target_type)
|
| 187 |
+
{
|
| 188 |
+
// windows (sigh) reports application/zip as application/x-zip-compressed. Or something else, why not.
|
| 189 |
+
if (source_type.indexOf('zip') >= 0 && target_type.indexOf('zip') >= 0)
|
| 190 |
+
{
|
| 191 |
+
this.debug('Finding ' + source_type + ' ' + target_type + ' close enough, false positive');
|
| 192 |
+
return true;
|
| 193 |
+
}
|
| 194 |
+
return false;
|
| 195 |
+
}
|
| 196 |
// replace the text, check if text is there ( or hide ), and fix the layout.
|
| 197 |
this.updateTextLayer = function (preview, newtext)
|
| 198 |
{
|
| 262 |
{
|
| 263 |
console.debug(message);
|
| 264 |
}
|
| 265 |
+
this.showReplaceOptions = function(e)
|
| 266 |
+
{
|
| 267 |
+
$('section.options .location_option').hide();
|
| 268 |
+
var replace_option = $('input[name="replace_type"]:checked').val();
|
| 269 |
+
if (replace_option == 'replace_and_search')
|
| 270 |
+
{
|
| 271 |
+
$('section.options .location_option').show();
|
| 272 |
+
}
|
| 273 |
+
|
| 274 |
+
}
|
| 275 |
+
this.dragOverArea = function(e)
|
| 276 |
+
{
|
| 277 |
+
e.preventDefault();
|
| 278 |
+
e.stopPropagation();
|
| 279 |
+
|
| 280 |
+
if ( this.is_dragging)
|
| 281 |
+
return;
|
| 282 |
+
|
| 283 |
+
//this.debug('dragover');
|
| 284 |
+
//$('.emr_drop_area').css('border-color', '#83b4d8');
|
| 285 |
+
$('.emr_drop_area').addClass('drop_breakout');
|
| 286 |
+
this.is_dragging = true;
|
| 287 |
+
}
|
| 288 |
+
this.dragOutArea = function(e)
|
| 289 |
+
{
|
| 290 |
+
e.preventDefault();
|
| 291 |
+
e.stopPropagation();
|
| 292 |
+
// this.debug('dragout');
|
| 293 |
+
//$('.emr_drop_area').css('border-color', '#b4b9be');
|
| 294 |
+
$('.emr_drop_area').removeClass('drop_breakout');
|
| 295 |
+
this.is_dragging = false;
|
| 296 |
+
}
|
| 297 |
+
this.fileDrop = function (e)
|
| 298 |
+
{
|
| 299 |
+
var ev = e.originalEvent;
|
| 300 |
+
this.dragOutArea(e);
|
| 301 |
+
ev.preventDefault();
|
| 302 |
+
e.preventDefault();
|
| 303 |
+
|
| 304 |
+
if (ev.dataTransfer.items) {
|
| 305 |
+
// Use DataTransferItemList interface to access the file(s)
|
| 306 |
+
document.getElementById('userfile').files = ev.dataTransfer.files;
|
| 307 |
+
$('input[name="userfile"]').trigger('change');
|
| 308 |
+
}
|
| 309 |
+
}
|
| 310 |
} // emrIf
|
| 311 |
|
| 312 |
jQuery(document).ready(function($)
|
notice.php
DELETED
|
@@ -1,25 +0,0 @@
|
|
| 1 |
-
<div class='notice' id='emr-news' style="padding-top: 7px">
|
| 2 |
-
<div style="float:<?php echo (is_rtl()) ? 'left' : 'right' ?>;"><a href="javascript:emrDismissNews()" class="button" style="margin-top:10px;"><?php _e('Dismiss', 'enable-media-replace');?></a></div>
|
| 3 |
-
<a href="https://shortpixel.com/wp/af/VKG6LYN28044" target="_blank" style="float: <?php echo (is_rtl()) ? 'right' : 'left' ?>;margin-<?php echo (is_rtl()) ? 'left' : 'right' ?>: 10px;">
|
| 4 |
-
<img src="<?php echo plugins_url('img/sp.png', __FILE__ ); ?>" class="emr-sp"/>
|
| 5 |
-
</a>
|
| 6 |
-
<h3 style="margin:10px;"><?php echo esc_html__('Enable Media Replace is now compatible with ShortPixel!','enable-media-replace');?></h3>
|
| 7 |
-
<p style="margin-bottom:0px;">
|
| 8 |
-
<?php _e( '<a href="https://shortpixel.com/wp/af/VKG6LYN28044" target="_blank">ShortPixel</a> is an image optimization plugin and if you have it activated, upon replacing an image in Enable Media Replace, the image will be also automatically optimized.', 'enable-media-replace' ); ?>
|
| 9 |
-
</p>
|
| 10 |
-
<p style="text-align: <?php echo (is_rtl()) ? 'left' : 'right' ?>;margin-top: 0;">
|
| 11 |
-
<a href="https://shortpixel.com/wp/af/VKG6LYN28044" target="_blank">>> <?php _e( 'More info', 'enable-media-replace' ); ?></a>
|
| 12 |
-
</p>
|
| 13 |
-
</div>
|
| 14 |
-
<script>
|
| 15 |
-
function emrDismissNews() {
|
| 16 |
-
jQuery("#emr-news").hide();
|
| 17 |
-
var data = { action : 'emr_dismiss_notices'};
|
| 18 |
-
jQuery.get('<?php echo admin_url('admin-ajax.php'); ?>', data, function(response) {
|
| 19 |
-
data = JSON.parse(response);
|
| 20 |
-
if(data["Status"] == 0) {
|
| 21 |
-
console.log("dismissed");
|
| 22 |
-
}
|
| 23 |
-
});
|
| 24 |
-
}
|
| 25 |
-
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
popup.php
DELETED
|
@@ -1,156 +0,0 @@
|
|
| 1 |
-
<?php
|
| 2 |
-
/**
|
| 3 |
-
* Uploadscreen for selecting and uploading new media file
|
| 4 |
-
*
|
| 5 |
-
* @author Måns Jonasson <http://www.mansjonasson.se>
|
| 6 |
-
* @copyright Måns Jonasson 13 sep 2010
|
| 7 |
-
* @version $Revision: 2303 $ | $Date: 2010-09-13 11:12:35 +0200 (ma, 13 sep 2010) $
|
| 8 |
-
* @package wordpress
|
| 9 |
-
* @subpackage enable-media-replace
|
| 10 |
-
*
|
| 11 |
-
*/
|
| 12 |
-
|
| 13 |
-
if ( ! defined( 'ABSPATH' ) )
|
| 14 |
-
exit; // Exit if accessed directly.
|
| 15 |
-
|
| 16 |
-
if (!current_user_can('upload_files'))
|
| 17 |
-
wp_die( esc_html__('You do not have permission to upload files.', 'enable-media-replace') );
|
| 18 |
-
|
| 19 |
-
global $wpdb;
|
| 20 |
-
|
| 21 |
-
$table_name = $wpdb->prefix . "posts";
|
| 22 |
-
|
| 23 |
-
$sql = "SELECT guid, post_mime_type FROM $table_name WHERE ID = " . (int) $_GET["attachment_id"];
|
| 24 |
-
|
| 25 |
-
list($current_filename, $current_filetype) = $wpdb->get_row($sql, ARRAY_N);
|
| 26 |
-
|
| 27 |
-
$current_fullpath = $current_filename;
|
| 28 |
-
$current_filename = substr($current_filename, (strrpos($current_filename, "/") + 1));
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
?>
|
| 32 |
-
<style>
|
| 33 |
-
.emr-plugin-button.emr-updating:before {
|
| 34 |
-
font: 400 20px/1 dashicons;
|
| 35 |
-
display: inline-block;
|
| 36 |
-
content: "\f463";
|
| 37 |
-
-webkit-animation: rotation 2s infinite linear;
|
| 38 |
-
animation: rotation 2s infinite linear;
|
| 39 |
-
margin: 3px 5px 0 -2px;
|
| 40 |
-
vertical-align: top
|
| 41 |
-
}
|
| 42 |
-
</style>
|
| 43 |
-
<div class="wrap">
|
| 44 |
-
<h1><?php echo esc_html__("Replace Media Upload", "enable-media-replace"); ?></h1>
|
| 45 |
-
|
| 46 |
-
<?php
|
| 47 |
-
$url = admin_url( "upload.php?page=enable-media-replace/enable-media-replace.php&noheader=true&action=media_replace_upload&attachment_id=" . (int) $_GET["attachment_id"]);
|
| 48 |
-
$action = "media_replace_upload";
|
| 49 |
-
$formurl = wp_nonce_url( $url, $action );
|
| 50 |
-
if (FORCE_SSL_ADMIN) {
|
| 51 |
-
$formurl = str_replace("http:", "https:", $formurl);
|
| 52 |
-
}
|
| 53 |
-
?>
|
| 54 |
-
|
| 55 |
-
<form enctype="multipart/form-data" method="post" action="<?php echo $formurl; ?>">
|
| 56 |
-
<?php
|
| 57 |
-
#wp_nonce_field('enable-media-replace');
|
| 58 |
-
$plugins = get_plugins();
|
| 59 |
-
$spInstalled = isset($plugins['shortpixel-image-optimiser/wp-shortpixel.php']);
|
| 60 |
-
$spActive = is_plugin_active('shortpixel-image-optimiser/wp-shortpixel.php');
|
| 61 |
-
?>
|
| 62 |
-
<input type="hidden" name="ID" value="<?php echo (int) $_GET["attachment_id"]; ?>" />
|
| 63 |
-
<div id="message" class="updated notice notice-success is-dismissible"><p><?php printf( esc_html__('NOTE: You are about to replace the media file "%s". There is no undo. Think about it!', "enable-media-replace"), $current_filename ); ?></p></div>
|
| 64 |
-
|
| 65 |
-
<?php if(!$spInstalled) {?>
|
| 66 |
-
<div style="background: #fff;width: 250px;min-height: 270px;border: 1px solid #ccc;float: <?php echo (is_rtl()) ? 'left' : 'right' ?>;padding: 15px;margin: 0 0 10px;">
|
| 67 |
-
<h3 class="" style="margin-top: 0;text-align: center;">
|
| 68 |
-
<a href="https://shortpixel.com/wp/af/VKG6LYN28044" target="_blank">
|
| 69 |
-
<?php echo esc_html__("Optimize your images with ShortPixel, get +50% credits!", "enable-media-replace"); ?>
|
| 70 |
-
</a>
|
| 71 |
-
</h3>
|
| 72 |
-
<div class="" style="text-align: center;">
|
| 73 |
-
<a href="https://shortpixel.com/wp/af/VKG6LYN28044" target="_blank">
|
| 74 |
-
<img src="https://optimizingmattersblog.files.wordpress.com/2016/10/shortpixel.png">
|
| 75 |
-
</a>
|
| 76 |
-
</div>
|
| 77 |
-
<div class="" style="margin-bottom: 10px;">
|
| 78 |
-
<?php echo esc_html__("Get more Google love by compressing your site's images! Check out how much ShortPixel can save your site and get +50% credits when signing up as an Enable Media Replace user! Forever!", "enable-media-replace"); ?>
|
| 79 |
-
</div>
|
| 80 |
-
<div class=""><div style="text-align: <?php echo (is_rtl()) ? 'left' : 'right' ?>;">
|
| 81 |
-
<a class="button button-primary" id="shortpixel-image-optimiser-info" href="https://shortpixel.com/wp/af/VKG6LYN28044" target="_blank">
|
| 82 |
-
<?php echo esc_html__("More info", "enable-media-replace"); ?></p>
|
| 83 |
-
</a>
|
| 84 |
-
</div>
|
| 85 |
-
</div>
|
| 86 |
-
</div>
|
| 87 |
-
<?php } ?>
|
| 88 |
-
|
| 89 |
-
<p><?php echo esc_html__("Choose a file to upload from your computer", "enable-media-replace"); ?></p>
|
| 90 |
-
|
| 91 |
-
<input type="file" name="userfile" id="userfile" onchange="imageHandle(event);" />
|
| 92 |
-
<div>
|
| 93 |
-
<img src="<?php echo $current_fullpath ?>" width="150px" height="150px" style="object-fit: cover"/>
|
| 94 |
-
<img id="previewImage" src="https://via.placeholder.com/150x150" width="150px" height="150px"/>
|
| 95 |
-
</div>
|
| 96 |
-
|
| 97 |
-
<?php do_action( 'emr_before_replace_type_options' ); ?>
|
| 98 |
-
|
| 99 |
-
<?php $s3pluginExist = class_exists('S3_Uploads'); ?>
|
| 100 |
-
<?php if ( apply_filters( 'emr_display_replace_type_options', true ) ) : ?>
|
| 101 |
-
<?php if ( ! $s3pluginExist) : ?>
|
| 102 |
-
<p><?php echo esc_html__("Select media replacement type:", "enable-media-replace"); ?></p>
|
| 103 |
-
|
| 104 |
-
<label for="replace_type_1"><input CHECKED id="replace_type_1" type="radio" name="replace_type" value="replace"> <?php echo esc_html__("Just replace the file", "enable-media-replace"); ?></label>
|
| 105 |
-
<p class="howto"><?php printf( esc_html__("Note: This option requires you to upload a file of the same type (%s) as the one you are replacing. The name of the attachment will stay the same (%s) no matter what the file you upload is called.", "enable-media-replace"), $current_filetype, $current_filename ); ?></p>
|
| 106 |
-
|
| 107 |
-
<?php endif; ?>
|
| 108 |
-
<?php if ( apply_filters( 'emr_enable_replace_and_search', true ) ) : ?>
|
| 109 |
-
<label for="replace_type_2"><input <?php echo $s3pluginExist ? 'CHECKED' : '' ?> id="replace_type_2" type="radio" name="replace_type" value="replace_and_search"> <?php echo __("Replace the file, use new file name and update all links", "enable-media-replace"); ?></label>
|
| 110 |
-
<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"), $current_filename ); ?></p>
|
| 111 |
-
<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>
|
| 112 |
-
<?php endif; ?>
|
| 113 |
-
<?php else : ?>
|
| 114 |
-
<?php if ( ! $s3pluginExist) : ?>
|
| 115 |
-
<input type="hidden" name="replace_type" value="replace" />
|
| 116 |
-
<?php else : ?>
|
| 117 |
-
<input type="hidden" name="replace_type" value="replace_and_search" />
|
| 118 |
-
<?php endif; ?>
|
| 119 |
-
<?php endif; ?>
|
| 120 |
-
<input id="submit" type="submit" class="button button-primary" disabled="disabled" value="<?php echo esc_attr__("Upload", "enable-media-replace"); ?>" />
|
| 121 |
-
<a href="#" class="button" onclick="history.back();"><?php echo esc_html__("Cancel", "enable-media-replace"); ?></a>
|
| 122 |
-
</form>
|
| 123 |
-
</div>
|
| 124 |
-
<script>
|
| 125 |
-
function imageHandle(event) {
|
| 126 |
-
var file = document.getElementById("userfile");
|
| 127 |
-
var submit = document.getElementById("submit");
|
| 128 |
-
var preview = document.getElementById("previewImage");
|
| 129 |
-
|
| 130 |
-
appendPreview(file, preview, event);
|
| 131 |
-
enableSubmitButton(file, submit);
|
| 132 |
-
}
|
| 133 |
-
|
| 134 |
-
function appendPreview(fileSource, preview, event) {
|
| 135 |
-
if (fileSource.value) {
|
| 136 |
-
var file = fileSource.files[0];
|
| 137 |
-
if (file.type.match("image/*")) {
|
| 138 |
-
preview.setAttribute("src", window.URL.createObjectURL(file));
|
| 139 |
-
preview.setAttribute("style", "object-fit: cover");
|
| 140 |
-
} else {
|
| 141 |
-
preview.setAttribute("src", "https://dummyimage.com/150x150/ccc/969696.gif&text=File");
|
| 142 |
-
preview.removeAttribute("style");
|
| 143 |
-
}
|
| 144 |
-
} else {
|
| 145 |
-
preview.setAttribute("src", "https://via.placeholder.com/150x150");
|
| 146 |
-
}
|
| 147 |
-
}
|
| 148 |
-
function enableSubmitButton(file, submit)
|
| 149 |
-
{
|
| 150 |
-
if (file.value) {
|
| 151 |
-
submit.removeAttribute("disabled");
|
| 152 |
-
} else {
|
| 153 |
-
submit.setAttribute("disabled", true);
|
| 154 |
-
}
|
| 155 |
-
}
|
| 156 |
-
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
readme.txt
CHANGED
|
@@ -3,9 +3,9 @@ Contributors: ShortPixel
|
|
| 3 |
Donate link: https://www.paypal.me/resizeImage
|
| 4 |
Tags: replace, attachment, media, files, replace image, replace jpg, change media, replace media, image, file
|
| 5 |
Requires at least: 4.9.7
|
| 6 |
-
Tested up to: 5.4
|
| 7 |
Requires PHP: 5.6
|
| 8 |
-
Stable tag: 3.
|
| 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,15 @@ If you want more control over the format used to display the time, you can use t
|
|
| 47 |
|
| 48 |
== Changelog ==
|
| 49 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
= 3.3.12 =
|
| 51 |
|
| 52 |
Release date: 27th April 2020
|
| 3 |
Donate link: https://www.paypal.me/resizeImage
|
| 4 |
Tags: replace, attachment, media, files, replace image, replace jpg, change media, replace media, image, file
|
| 5 |
Requires at least: 4.9.7
|
| 6 |
+
Tested up to: 5.4.1
|
| 7 |
Requires PHP: 5.6
|
| 8 |
+
Stable tag: 3.4.0
|
| 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 |
+
= 3.4.0 =
|
| 51 |
+
|
| 52 |
+
Release date: June 9th 2020
|
| 53 |
+
* New - In edit media screen EMR notes user who replaced file if this was not uploader;
|
| 54 |
+
* New - Added Drag and Drop area for files;
|
| 55 |
+
* New - When replacing with new file name, now also possible to update upload path;
|
| 56 |
+
* Fix - Various minor CSS tweaks and fixes;
|
| 57 |
+
* Update of Underlying libraries
|
| 58 |
+
|
| 59 |
= 3.3.12 =
|
| 60 |
|
| 61 |
Release date: 27th April 2020
|
scss/admin.scss
CHANGED
|
@@ -33,6 +33,46 @@
|
|
| 33 |
.image_chooser.wrapper
|
| 34 |
{
|
| 35 |
min-height: 350px;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
.image_previews
|
| 37 |
{
|
| 38 |
margin: 15px 0;
|
|
@@ -218,6 +258,16 @@
|
|
| 218 |
}
|
| 219 |
}
|
| 220 |
} // custom_date
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 221 |
}
|
| 222 |
|
| 223 |
.form_controls.wrapper
|
|
@@ -233,7 +283,11 @@
|
|
| 233 |
}
|
| 234 |
}
|
| 235 |
|
| 236 |
-
.shortpixel
|
|
|
|
|
|
|
|
|
|
|
|
|
| 237 |
{
|
| 238 |
background: #fff;
|
| 239 |
width: 250px;
|
| 33 |
.image_chooser.wrapper
|
| 34 |
{
|
| 35 |
min-height: 350px;
|
| 36 |
+
|
| 37 |
+
.emr_drop_area
|
| 38 |
+
{
|
| 39 |
+
border: 4px dashed #b4b9be;
|
| 40 |
+
max-width: 600px;
|
| 41 |
+
padding: 28px 14px;
|
| 42 |
+
text-align: center;
|
| 43 |
+
position: relative;
|
| 44 |
+
h1 { display: none; }
|
| 45 |
+
.drop-wrapper
|
| 46 |
+
{
|
| 47 |
+
margin: 0 auto;
|
| 48 |
+
|
| 49 |
+
}
|
| 50 |
+
&.drop_breakout
|
| 51 |
+
{
|
| 52 |
+
position: fixed;
|
| 53 |
+
left: 0;
|
| 54 |
+
right:0;
|
| 55 |
+
bottom: 0;
|
| 56 |
+
top: 0;
|
| 57 |
+
max-width: none;
|
| 58 |
+
border-color: #83b4d8;
|
| 59 |
+
border-width: 10px;
|
| 60 |
+
z-index: 999999;
|
| 61 |
+
background-color: rgba(#444, 0.7);
|
| 62 |
+
h1 {
|
| 63 |
+
color: #fff;
|
| 64 |
+
position: absolute;
|
| 65 |
+
font-size: 50px;
|
| 66 |
+
line-height: 50px;
|
| 67 |
+
margin-top: -25px;
|
| 68 |
+
top: 50%;
|
| 69 |
+
width: 100%;
|
| 70 |
+
text-align: center;
|
| 71 |
+
display: block;
|
| 72 |
+
}
|
| 73 |
+
.drop-wrapper { display: none; }
|
| 74 |
+
}
|
| 75 |
+
}
|
| 76 |
.image_previews
|
| 77 |
{
|
| 78 |
margin: 15px 0;
|
| 258 |
}
|
| 259 |
}
|
| 260 |
} // custom_date
|
| 261 |
+
.location_option
|
| 262 |
+
{
|
| 263 |
+
display: none;
|
| 264 |
+
margin-top: 12px;
|
| 265 |
+
label
|
| 266 |
+
{
|
| 267 |
+
vertical-align: baseline;
|
| 268 |
+
margin-right: 8px;
|
| 269 |
+
}
|
| 270 |
+
}
|
| 271 |
}
|
| 272 |
|
| 273 |
.form_controls.wrapper
|
| 283 |
}
|
| 284 |
}
|
| 285 |
|
| 286 |
+
.shortpixel.notice
|
| 287 |
+
{
|
| 288 |
+
padding: 12px;
|
| 289 |
+
}
|
| 290 |
+
.shortpixel-offer
|
| 291 |
{
|
| 292 |
background: #fff;
|
| 293 |
width: 250px;
|
upload.php
DELETED
|
@@ -1,412 +0,0 @@
|
|
| 1 |
-
<?php
|
| 2 |
-
if ( ! defined( 'ABSPATH' ) )
|
| 3 |
-
exit; // Exit if accessed directly.
|
| 4 |
-
|
| 5 |
-
if (!current_user_can('upload_files'))
|
| 6 |
-
wp_die( esc_html__('You do not have permission to upload files.', 'enable-media-replace') );
|
| 7 |
-
|
| 8 |
-
// Define DB table names
|
| 9 |
-
global $wpdb;
|
| 10 |
-
$table_name = $wpdb->prefix . "posts";
|
| 11 |
-
$postmeta_table_name = $wpdb->prefix . "postmeta";
|
| 12 |
-
|
| 13 |
-
require_once('thumbnail_updater.php');
|
| 14 |
-
|
| 15 |
-
/**
|
| 16 |
-
* Delete a media file and its thumbnails.
|
| 17 |
-
*
|
| 18 |
-
* @param string $current_file
|
| 19 |
-
* @param array|null $metadta
|
| 20 |
-
*/
|
| 21 |
-
function emr_delete_current_files( $current_file, $metadta = null ) {
|
| 22 |
-
// Delete old file
|
| 23 |
-
|
| 24 |
-
// Find path of current file
|
| 25 |
-
$current_path = substr($current_file, 0, (strrpos($current_file, "/")));
|
| 26 |
-
|
| 27 |
-
// Check if old file exists first
|
| 28 |
-
if (file_exists($current_file)) {
|
| 29 |
-
// Now check for correct file permissions for old file
|
| 30 |
-
clearstatcache();
|
| 31 |
-
if (is_writable($current_file)) {
|
| 32 |
-
// Everything OK; delete the file
|
| 33 |
-
unlink($current_file);
|
| 34 |
-
}
|
| 35 |
-
else {
|
| 36 |
-
// File exists, but has wrong permissions. Let the user know.
|
| 37 |
-
printf( esc_html__('The file %1$s can not be deleted by the web server, most likely because the permissions on the file are wrong.', "enable-media-replace"), $current_file);
|
| 38 |
-
exit;
|
| 39 |
-
}
|
| 40 |
-
}
|
| 41 |
-
|
| 42 |
-
// Delete old resized versions if this was an image
|
| 43 |
-
$suffix = substr($current_file, (strlen($current_file)-4));
|
| 44 |
-
$prefix = substr($current_file, 0, (strlen($current_file)-4));
|
| 45 |
-
|
| 46 |
-
if (strtolower($suffix) === ".pdf") {
|
| 47 |
-
$prefix .= "-pdf";
|
| 48 |
-
$suffix = ".jpg";
|
| 49 |
-
}
|
| 50 |
-
|
| 51 |
-
$imgAr = array(".png", ".gif", ".jpg");
|
| 52 |
-
if (in_array($suffix, $imgAr)) {
|
| 53 |
-
// It's a png/gif/jpg based on file name
|
| 54 |
-
// Get thumbnail filenames from metadata
|
| 55 |
-
if ( empty( $metadata ) ) {
|
| 56 |
-
$metadata = wp_get_attachment_metadata( $_POST["ID"] );
|
| 57 |
-
}
|
| 58 |
-
|
| 59 |
-
if (is_array($metadata)) { // Added fix for error messages when there is no metadata (but WHY would there not be? I don't know…)
|
| 60 |
-
foreach($metadata["sizes"] AS $thissize) {
|
| 61 |
-
// Get all filenames and do an unlink() on each one;
|
| 62 |
-
$thisfile = $thissize["file"];
|
| 63 |
-
// Create array with all old sizes for replacing in posts later
|
| 64 |
-
$oldfilesAr[] = $thisfile;
|
| 65 |
-
// Look for files and delete them
|
| 66 |
-
if (strlen($thisfile)) {
|
| 67 |
-
$thisfile = $current_path . "/" . $thissize["file"];
|
| 68 |
-
if (file_exists($thisfile)) {
|
| 69 |
-
unlink($thisfile);
|
| 70 |
-
}
|
| 71 |
-
}
|
| 72 |
-
}
|
| 73 |
-
}
|
| 74 |
-
// Old (brutal) method, left here for now
|
| 75 |
-
//$mask = $prefix . "-*x*" . $suffix;
|
| 76 |
-
//array_map( "unlink", glob( $mask ) );
|
| 77 |
-
}
|
| 78 |
-
}
|
| 79 |
-
|
| 80 |
-
/**
|
| 81 |
-
* Maybe remove query string from URL.
|
| 82 |
-
*
|
| 83 |
-
* @param string $url
|
| 84 |
-
*
|
| 85 |
-
* @return string
|
| 86 |
-
*/
|
| 87 |
-
function emr_maybe_remove_query_string( $url ) {
|
| 88 |
-
$parts = explode( '?', $url );
|
| 89 |
-
|
| 90 |
-
return reset( $parts );
|
| 91 |
-
}
|
| 92 |
-
|
| 93 |
-
/**
|
| 94 |
-
* Remove scheme from URL.
|
| 95 |
-
*
|
| 96 |
-
* @param string $url
|
| 97 |
-
*
|
| 98 |
-
* @return string
|
| 99 |
-
*/
|
| 100 |
-
function emr_remove_scheme( $url ) {
|
| 101 |
-
return preg_replace( '/^(?:http|https):/', '', $url );
|
| 102 |
-
}
|
| 103 |
-
|
| 104 |
-
/**
|
| 105 |
-
* Remove size from filename (image[-100x100].jpeg).
|
| 106 |
-
*
|
| 107 |
-
* @param string $url
|
| 108 |
-
* @param bool $remove_extension
|
| 109 |
-
*
|
| 110 |
-
* @return string
|
| 111 |
-
*/
|
| 112 |
-
function emr_remove_size_from_filename( $url, $remove_extension = false ) {
|
| 113 |
-
$url = preg_replace( '/^(\S+)-[0-9]{1,4}x[0-9]{1,4}(\.[a-zA-Z0-9\.]{2,})?/', '$1$2', $url );
|
| 114 |
-
|
| 115 |
-
if ( $remove_extension ) {
|
| 116 |
-
$ext = pathinfo( $url, PATHINFO_EXTENSION );
|
| 117 |
-
$url = str_replace( ".$ext", '', $url );
|
| 118 |
-
}
|
| 119 |
-
|
| 120 |
-
return $url;
|
| 121 |
-
}
|
| 122 |
-
|
| 123 |
-
/**
|
| 124 |
-
* Strip an image URL down to bare minimum for matching.
|
| 125 |
-
*
|
| 126 |
-
* @param string $url
|
| 127 |
-
*
|
| 128 |
-
* @return string
|
| 129 |
-
*/
|
| 130 |
-
function emr_get_match_url($url) {
|
| 131 |
-
$url = emr_remove_scheme($url);
|
| 132 |
-
$url = emr_maybe_remove_query_string($url);
|
| 133 |
-
$url = emr_remove_size_from_filename($url, true);
|
| 134 |
-
$url = emr_remove_domain_from_filename($url);
|
| 135 |
-
|
| 136 |
-
return $url;
|
| 137 |
-
}
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
function emr_remove_domain_from_filename($url) {
|
| 141 |
-
// Holding place for possible future function
|
| 142 |
-
$url = str_replace(emr_remove_scheme(get_bloginfo('url')), '', $url);
|
| 143 |
-
return $url;
|
| 144 |
-
}
|
| 145 |
-
|
| 146 |
-
/**
|
| 147 |
-
* Build an array of search or replace URLs for given attachment GUID and its metadata.
|
| 148 |
-
*
|
| 149 |
-
* @param string $guid
|
| 150 |
-
* @param array $metadata
|
| 151 |
-
*
|
| 152 |
-
* @return array
|
| 153 |
-
*/
|
| 154 |
-
function emr_get_file_urls( $guid, $metadata ) {
|
| 155 |
-
$urls = array();
|
| 156 |
-
|
| 157 |
-
$guid = emr_remove_scheme( $guid );
|
| 158 |
-
$guid= emr_remove_domain_from_filename($guid);
|
| 159 |
-
|
| 160 |
-
$urls['guid'] = $guid;
|
| 161 |
-
|
| 162 |
-
if ( empty( $metadata ) ) {
|
| 163 |
-
return $urls;
|
| 164 |
-
}
|
| 165 |
-
|
| 166 |
-
$base_url = dirname( $guid );
|
| 167 |
-
|
| 168 |
-
if ( ! empty( $metadata['file'] ) ) {
|
| 169 |
-
$urls['file'] = trailingslashit( $base_url ) . wp_basename( $metadata['file'] );
|
| 170 |
-
}
|
| 171 |
-
|
| 172 |
-
if ( ! empty( $metadata['sizes'] ) ) {
|
| 173 |
-
foreach ( $metadata['sizes'] as $key => $value ) {
|
| 174 |
-
$urls[ $key ] = trailingslashit( $base_url ) . wp_basename( $value['file'] );
|
| 175 |
-
}
|
| 176 |
-
}
|
| 177 |
-
|
| 178 |
-
return $urls;
|
| 179 |
-
}
|
| 180 |
-
|
| 181 |
-
/**
|
| 182 |
-
* Ensure new search URLs cover known sizes for old attachment.
|
| 183 |
-
* Falls back to full URL if size not covered (srcset or width/height attributes should compensate).
|
| 184 |
-
*
|
| 185 |
-
* @param array $old
|
| 186 |
-
* @param array $new
|
| 187 |
-
*
|
| 188 |
-
* @return array
|
| 189 |
-
*/
|
| 190 |
-
function emr_normalize_file_urls( $old, $new ) {
|
| 191 |
-
$result = array();
|
| 192 |
-
|
| 193 |
-
if ( empty( $new['guid'] ) ) {
|
| 194 |
-
return $result;
|
| 195 |
-
}
|
| 196 |
-
|
| 197 |
-
$guid = $new['guid'];
|
| 198 |
-
|
| 199 |
-
foreach ( $old as $key => $value ) {
|
| 200 |
-
$result[ $key ] = empty( $new[ $key ] ) ? $guid : $new[ $key ];
|
| 201 |
-
}
|
| 202 |
-
|
| 203 |
-
return $result;
|
| 204 |
-
}
|
| 205 |
-
|
| 206 |
-
// Get old guid and filetype from DB
|
| 207 |
-
$sql = "SELECT post_mime_type FROM $table_name WHERE ID = '" . (int) $_POST["ID"] . "'";
|
| 208 |
-
list($current_filetype) = $wpdb->get_row($sql, ARRAY_N);
|
| 209 |
-
|
| 210 |
-
// Massage a bunch of vars
|
| 211 |
-
$current_guid =wp_get_attachment_url($_POST['ID']);
|
| 212 |
-
|
| 213 |
-
$ID = (int) $_POST["ID"];
|
| 214 |
-
|
| 215 |
-
$current_file = get_attached_file($ID, apply_filters( 'emr_unfiltered_get_attached_file', true ));
|
| 216 |
-
$current_path = substr($current_file, 0, (strrpos($current_file, "/")));
|
| 217 |
-
$current_file = preg_replace("|(?<!:)/{2,}|", "/", $current_file);
|
| 218 |
-
$current_filename = wp_basename($current_file);
|
| 219 |
-
$current_metadata = wp_get_attachment_metadata( $_POST["ID"] );
|
| 220 |
-
|
| 221 |
-
$replace_type = $_POST["replace_type"];
|
| 222 |
-
// We have two types: replace / replace_and_search
|
| 223 |
-
|
| 224 |
-
if (is_uploaded_file($_FILES["userfile"]["tmp_name"])) {
|
| 225 |
-
|
| 226 |
-
// New method for validating that the uploaded file is allowed, using WP:s internal wp_check_filetype_and_ext() function.
|
| 227 |
-
$filedata = wp_check_filetype_and_ext($_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["name"]);
|
| 228 |
-
|
| 229 |
-
if ($filedata["ext"] == "") {
|
| 230 |
-
echo esc_html__("File type does not meet security guidelines. Try another.", 'enable-media-replace');
|
| 231 |
-
exit;
|
| 232 |
-
}
|
| 233 |
-
|
| 234 |
-
$thumbUpdater = new ThumbnailUpdater($ID);
|
| 235 |
-
$thumbUpdater->setOldMetadata($current_metadata);
|
| 236 |
-
|
| 237 |
-
$new_filename = $_FILES["userfile"]["name"];
|
| 238 |
-
$new_filesize = $_FILES["userfile"]["size"];
|
| 239 |
-
$new_filetype = $filedata["type"];
|
| 240 |
-
|
| 241 |
-
// save original file permissions
|
| 242 |
-
$original_file_perms = fileperms($current_file) & 0777;
|
| 243 |
-
|
| 244 |
-
if ($replace_type == "replace") {
|
| 245 |
-
// Drop-in replace and we don't even care if you uploaded something that is the wrong file-type.
|
| 246 |
-
// That's your own fault, because we warned you!
|
| 247 |
-
|
| 248 |
-
//call replace action to give a chance to plugins like ShortPixel to delete the metadata, backups and cleanup the cache on server
|
| 249 |
-
do_action('wp_handle_replace', array('post_id' => $ID));
|
| 250 |
-
|
| 251 |
-
emr_delete_current_files( $current_file, $current_metadata );
|
| 252 |
-
|
| 253 |
-
$new_filename = wp_unique_filename( $current_path, $current_filename );
|
| 254 |
-
$new_filename = apply_filters( 'emr_unique_filename', $current_filename, $current_path, $ID );
|
| 255 |
-
|
| 256 |
-
// Move new file to old location, new name
|
| 257 |
-
$new_file = $current_path . "/" . $current_filename;
|
| 258 |
-
move_uploaded_file($_FILES["userfile"]["tmp_name"], $new_file);
|
| 259 |
-
|
| 260 |
-
// Chmod new file to original file permissions
|
| 261 |
-
@chmod($current_file, $original_file_perms);
|
| 262 |
-
|
| 263 |
-
apply_filters( 'enable_media_replace_title', basename($new_file) ); // Thanks Jonas Lundman (http://wordpress.org/support/topic/add-filter-hook-suggestion-to)
|
| 264 |
-
|
| 265 |
-
// Update database file timestamp
|
| 266 |
-
$post_date = gmdate( 'Y-m-d H:i:s' );
|
| 267 |
-
$sql = $wpdb->prepare(
|
| 268 |
-
"UPDATE $table_name SET post_date = '$post_date', post_date_gmt = '$post_date' WHERE ID = %d;",
|
| 269 |
-
$ID
|
| 270 |
-
);
|
| 271 |
-
$wpdb->query($sql);
|
| 272 |
-
|
| 273 |
-
//call upload action to give a chance to plugins like Resize Image After Upload to handle the new image
|
| 274 |
-
do_action('wp_handle_upload', array('file' => $current_file, 'url' => wp_get_attachment_url($ID), 'type' => $new_filetype));
|
| 275 |
-
|
| 276 |
-
// Make thumb and/or update metadata
|
| 277 |
-
$metadata = wp_generate_attachment_metadata( $ID, $current_file );
|
| 278 |
-
wp_update_attachment_metadata( $ID, $metadata );
|
| 279 |
-
|
| 280 |
-
$thumbUpdater->setNewMetadata($metadata);
|
| 281 |
-
$thumbUpdater->updateThumbnails();
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
// Trigger possible updates on CDN and other plugins
|
| 285 |
-
update_attached_file( $ID, $current_file);
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
} elseif ( 'replace_and_search' == $replace_type && apply_filters( 'emr_enable_replace_and_search', true ) ) {
|
| 289 |
-
// Replace file, replace file name, update meta data, replace links pointing to old file name
|
| 290 |
-
|
| 291 |
-
//call replace action to give a chance to plugins like ShortPixel to delete the metadata, backups and cleanup the cache on server
|
| 292 |
-
do_action('wp_handle_replace', array('post_id' => $ID));
|
| 293 |
-
|
| 294 |
-
emr_delete_current_files( $current_file, $current_metadata );
|
| 295 |
-
|
| 296 |
-
// Massage new filename to adhere to WordPress standards
|
| 297 |
-
$new_filename = wp_unique_filename( $current_path, $new_filename );
|
| 298 |
-
$new_filename = apply_filters( 'emr_unique_filename', $new_filename, $current_path, $ID );
|
| 299 |
-
|
| 300 |
-
// Move new file to old location, new name
|
| 301 |
-
$new_file = $current_path . "/" . $new_filename;
|
| 302 |
-
move_uploaded_file($_FILES["userfile"]["tmp_name"], $new_file);
|
| 303 |
-
|
| 304 |
-
// Chmod new file to original file permissions
|
| 305 |
-
@chmod($current_file, $original_file_perms);
|
| 306 |
-
|
| 307 |
-
$new_filetitle = preg_replace('/\.[^.]+$/', '', basename($new_file));
|
| 308 |
-
$new_filetitle = apply_filters( 'enable_media_replace_title', $new_filetitle ); // Thanks Jonas Lundman (http://wordpress.org/support/topic/add-filter-hook-suggestion-to)
|
| 309 |
-
$new_guid = str_replace($current_filename, $new_filename, $current_guid);
|
| 310 |
-
|
| 311 |
-
//call upload action to give a chance to plugins like ShortPixel to handle the new image
|
| 312 |
-
//do_action('wp_handle_upload', array('file' => $new_file, 'url' => $new_guid, 'type' => $new_filetype));
|
| 313 |
-
|
| 314 |
-
$post_date = gmdate( 'Y-m-d H:i:s' );
|
| 315 |
-
|
| 316 |
-
// Update database file name
|
| 317 |
-
$sql = $wpdb->prepare(
|
| 318 |
-
"UPDATE $table_name SET post_title = '$new_filetitle', post_name = '$new_filetitle', guid = '$new_guid', post_mime_type = '$new_filetype', post_date = '$post_date', post_date_gmt = '$post_date' WHERE ID = %d;",
|
| 319 |
-
$ID
|
| 320 |
-
);
|
| 321 |
-
$wpdb->query($sql);
|
| 322 |
-
|
| 323 |
-
// Update the postmeta file name
|
| 324 |
-
|
| 325 |
-
// Get old postmeta _wp_attached_file
|
| 326 |
-
$sql = $wpdb->prepare(
|
| 327 |
-
"SELECT meta_value FROM $postmeta_table_name WHERE meta_key = '_wp_attached_file' AND post_id = %d;",
|
| 328 |
-
$ID
|
| 329 |
-
);
|
| 330 |
-
|
| 331 |
-
$old_meta_name = $wpdb->get_row($sql, ARRAY_A);
|
| 332 |
-
$old_meta_name = $old_meta_name["meta_value"];
|
| 333 |
-
|
| 334 |
-
// Make new postmeta _wp_attached_file
|
| 335 |
-
$new_meta_name = str_replace($current_filename, $new_filename, $old_meta_name);
|
| 336 |
-
$sql = $wpdb->prepare(
|
| 337 |
-
"UPDATE $postmeta_table_name SET meta_value = '$new_meta_name' WHERE meta_key = '_wp_attached_file' AND post_id = %d;",
|
| 338 |
-
$ID
|
| 339 |
-
);
|
| 340 |
-
$wpdb->query($sql);
|
| 341 |
-
|
| 342 |
-
// Make thumb and/or update metadata
|
| 343 |
-
$new_metadata = wp_generate_attachment_metadata( $ID, $new_file );
|
| 344 |
-
wp_update_attachment_metadata( $ID, $new_metadata );
|
| 345 |
-
|
| 346 |
-
// Search-and-replace filename in post database
|
| 347 |
-
$current_base_url = emr_get_match_url( $current_guid );
|
| 348 |
-
|
| 349 |
-
$sql = $wpdb->prepare(
|
| 350 |
-
"SELECT ID, post_content FROM $table_name WHERE post_status = 'publish' AND post_content LIKE %s;",
|
| 351 |
-
'%' . $current_base_url . '%'
|
| 352 |
-
);
|
| 353 |
-
|
| 354 |
-
|
| 355 |
-
$rs = $wpdb->get_results( $sql, ARRAY_A );
|
| 356 |
-
|
| 357 |
-
$number_of_updates = 0;
|
| 358 |
-
|
| 359 |
-
|
| 360 |
-
if ( ! empty( $rs ) ) {
|
| 361 |
-
$search_urls = emr_get_file_urls( $current_guid, $current_metadata );
|
| 362 |
-
$replace_urls = emr_get_file_urls( $new_guid, $new_metadata );
|
| 363 |
-
$replace_urls = emr_normalize_file_urls( $search_urls, $replace_urls );
|
| 364 |
-
|
| 365 |
-
|
| 366 |
-
foreach ( $rs AS $rows ) {
|
| 367 |
-
|
| 368 |
-
$number_of_updates = $number_of_updates + 1;
|
| 369 |
-
|
| 370 |
-
// replace old URLs with new URLs.
|
| 371 |
-
$post_content = $rows["post_content"];
|
| 372 |
-
$post_content = str_replace( $search_urls, $replace_urls, $post_content );
|
| 373 |
-
|
| 374 |
-
$sql = $wpdb->prepare(
|
| 375 |
-
"UPDATE $table_name SET post_content = %s WHERE ID = %d;",
|
| 376 |
-
array($post_content, $rows["ID"])
|
| 377 |
-
);
|
| 378 |
-
|
| 379 |
-
$wpdb->query( $sql );
|
| 380 |
-
}
|
| 381 |
-
}
|
| 382 |
-
|
| 383 |
-
$thumbUpdater->setNewMetadata($new_metadata);
|
| 384 |
-
$thumbUpdater->updateThumbnails();
|
| 385 |
-
|
| 386 |
-
// Trigger possible updates on CDN and other plugins
|
| 387 |
-
update_attached_file( $ID, $new_file );
|
| 388 |
-
}
|
| 389 |
-
|
| 390 |
-
#echo "Updated: " . $number_of_updates;
|
| 391 |
-
|
| 392 |
-
$returnurl = admin_url("/post.php?post={$_POST["ID"]}&action=edit&message=1");
|
| 393 |
-
|
| 394 |
-
// Execute hook actions - thanks rubious for the suggestion!
|
| 395 |
-
if (isset($new_guid)) { do_action("enable-media-replace-upload-done", $new_guid, $current_guid); }
|
| 396 |
-
|
| 397 |
-
} else {
|
| 398 |
-
//TODO Better error handling when no file is selected.
|
| 399 |
-
//For now just go back to media management
|
| 400 |
-
$returnurl = admin_url("upload.php");
|
| 401 |
-
}
|
| 402 |
-
|
| 403 |
-
if (FORCE_SSL_ADMIN) {
|
| 404 |
-
$returnurl = str_replace("http:", "https:", $returnurl);
|
| 405 |
-
}
|
| 406 |
-
|
| 407 |
-
// Allow developers to override $returnurl
|
| 408 |
-
$returnurl = apply_filters('emr_returnurl', $returnurl);
|
| 409 |
-
|
| 410 |
-
//save redirection
|
| 411 |
-
wp_redirect($returnurl);
|
| 412 |
-
?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
views/popup.php
CHANGED
|
@@ -42,6 +42,8 @@ $uiHelper->setSourceSizes($attachment_id);
|
|
| 42 |
|
| 43 |
$emr = EnableMediaReplacePlugin::get();
|
| 44 |
|
|
|
|
|
|
|
| 45 |
?>
|
| 46 |
|
| 47 |
<div class="wrap emr_upload_form">
|
|
@@ -62,8 +64,9 @@ $url = $uiHelper->getFormUrl($attachment_id);
|
|
| 62 |
<section class='image_chooser wrapper'>
|
| 63 |
<div class='section-header'> <?php _e('Choose Replacement Media', 'enable-replace-media'); ?></div>
|
| 64 |
|
|
|
|
|
|
|
| 65 |
<input type="hidden" name="ID" value="<?php echo $attachment_id ?>" />
|
| 66 |
-
<div id="message" class="updated notice notice-success is-dismissible"><p><?php printf( esc_html__('NOTE: You are about to replace the media file "%s". There is no undo. Think about it!', "enable-media-replace"), $filename ); ?></p></div>
|
| 67 |
|
| 68 |
<p><?php echo esc_html__("Choose a file to upload from your computer", "enable-media-replace"); ?></p>
|
| 69 |
<p><?php printf(__('Maximum file size: <strong>%s</strong>','enable-media-replace'), size_format(wp_max_upload_size() ) ) ?></p>
|
|
@@ -74,27 +77,34 @@ $url = $uiHelper->getFormUrl($attachment_id);
|
|
| 74 |
|
| 75 |
<div class='form-warning mimetype'><p><?php printf(__('Replacement file type doesn\'t seem to be allowed by WordPress. This might cause unexpected issues')); ?></p></div>
|
| 76 |
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
|
| 99 |
</section>
|
| 100 |
|
|
@@ -147,8 +157,8 @@ $url = $uiHelper->getFormUrl($attachment_id);
|
|
| 147 |
?>
|
| 148 |
<p><?php _e('When replacing the media, do you want to:', 'enable-media-replace'); ?></p>
|
| 149 |
<ul>
|
| 150 |
-
<li><label><input type='radio' name='timestamp_replace' value='1'
|
| 151 |
-
<li><label><input type='radio' name='timestamp_replace' value='2'
|
| 152 |
<li><label><input type='radio' name='timestamp_replace' value='3' /><?php _e('Set a Custom Date', 'enable-media-replace'); ?></label></li>
|
| 153 |
</ul>
|
| 154 |
<div class='custom_date'>
|
|
@@ -161,7 +171,14 @@ $url = $uiHelper->getFormUrl($attachment_id);
|
|
| 161 |
<input type="text" name="custom_minute" class='emr_minute' value="<?php echo $date->format('i'); ?>" />
|
| 162 |
<input type="hidden" name="custom_date_formatted" value="<?php echo $date->format('Y-m-d'); ?>" />
|
| 163 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 164 |
</div>
|
|
|
|
| 165 |
</section>
|
| 166 |
</div>
|
| 167 |
<section class='form_controls wrapper'>
|
|
@@ -180,7 +197,7 @@ $url = $uiHelper->getFormUrl($attachment_id);
|
|
| 180 |
|
| 181 |
<section class='upsell-wrapper'>
|
| 182 |
<?php if(! $spInstalled) {?>
|
| 183 |
-
<div class='shortpixel-
|
| 184 |
<h3 class="" style="margin-top: 0;text-align: center;">
|
| 185 |
<a href="https://shortpixel.com/wp/af/VKG6LYN28044" target="_blank">
|
| 186 |
<?php echo esc_html__("Optimize your images with ShortPixel, get +50% credits!", "enable-media-replace"); ?>
|
|
@@ -202,7 +219,7 @@ $url = $uiHelper->getFormUrl($attachment_id);
|
|
| 202 |
</div>
|
| 203 |
</div>
|
| 204 |
<?php } ?>
|
| 205 |
-
<div class='shortpixel-
|
| 206 |
<p class='img-wrapper'><img src="<?php echo $emr->getPluginURL('img/shortpixel.png'); ?>" alt='ShortPixel'></p>
|
| 207 |
<h3><?php printf(__('ARE YOU %s CONCERNED WITH %s YOUR %s %s SITE SPEED? %s', 'enable-media-replace'),'<br>', '<br>','<br>', '<span class="red">','</span>'); ?><br><br>
|
| 208 |
<?php printf(__('ALLOW ShortPixel %s SPECIALISTS TO %s FIND THE %s SOLUTION FOR YOU.', 'enable-media-replace'), '<br>','<br>','<br>'); ?></h3>
|
| 42 |
|
| 43 |
$emr = EnableMediaReplacePlugin::get();
|
| 44 |
|
| 45 |
+
|
| 46 |
+
|
| 47 |
?>
|
| 48 |
|
| 49 |
<div class="wrap emr_upload_form">
|
| 64 |
<section class='image_chooser wrapper'>
|
| 65 |
<div class='section-header'> <?php _e('Choose Replacement Media', 'enable-replace-media'); ?></div>
|
| 66 |
|
| 67 |
+
<div id="message" class=""><strong><?php printf( esc_html__('NOTE: You are about to replace the media file "%s". There is no undo. Think about it!', "enable-media-replace"), $filename ); ?></strong></div>
|
| 68 |
+
|
| 69 |
<input type="hidden" name="ID" value="<?php echo $attachment_id ?>" />
|
|
|
|
| 70 |
|
| 71 |
<p><?php echo esc_html__("Choose a file to upload from your computer", "enable-media-replace"); ?></p>
|
| 72 |
<p><?php printf(__('Maximum file size: <strong>%s</strong>','enable-media-replace'), size_format(wp_max_upload_size() ) ) ?></p>
|
| 77 |
|
| 78 |
<div class='form-warning mimetype'><p><?php printf(__('Replacement file type doesn\'t seem to be allowed by WordPress. This might cause unexpected issues')); ?></p></div>
|
| 79 |
|
| 80 |
+
<div class='emr_drop_area'>
|
| 81 |
+
<div class='drop-wrapper'>
|
| 82 |
+
|
| 83 |
+
<p><input type="file" name="userfile" id="userfile" /></p>
|
| 84 |
+
<h1><?php _e('Drop File Here', 'enable-media-replace'); ?></h1>
|
| 85 |
+
</div>
|
| 86 |
+
|
| 87 |
+
</div>
|
| 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 |
+
}
|
| 106 |
+
?>
|
| 107 |
+
</div>
|
| 108 |
|
| 109 |
</section>
|
| 110 |
|
| 157 |
?>
|
| 158 |
<p><?php _e('When replacing the media, do you want to:', 'enable-media-replace'); ?></p>
|
| 159 |
<ul>
|
| 160 |
+
<li><label><input type='radio' name='timestamp_replace' value='1' /><?php _e('Replace the date', 'enable-media-replace'); ?></label></li>
|
| 161 |
+
<li><label><input type='radio' name='timestamp_replace' value='2' checked /><?php printf(__('Keep the date %s(%s)%s', 'enable-media-replace'), "<span class='small'>", $attachment_current_date, "</span>"); ?></label></li>
|
| 162 |
<li><label><input type='radio' name='timestamp_replace' value='3' /><?php _e('Set a Custom Date', 'enable-media-replace'); ?></label></li>
|
| 163 |
</ul>
|
| 164 |
<div class='custom_date'>
|
| 171 |
<input type="text" name="custom_minute" class='emr_minute' value="<?php echo $date->format('i'); ?>" />
|
| 172 |
<input type="hidden" name="custom_date_formatted" value="<?php echo $date->format('Y-m-d'); ?>" />
|
| 173 |
</div>
|
| 174 |
+
<?php if ($subdir = $uiHelper->getRelPathNow()): ?>
|
| 175 |
+
<div class='location_option'>
|
| 176 |
+
<label><input type="checkbox" name="new_location" value="1" /> <?php _e('Put new Upload in Updated Folder: '); ?></label>
|
| 177 |
+
<input type="text" name="location_dir" value="<?php echo $subdir ?>" />
|
| 178 |
+
</div>
|
| 179 |
+
<?php endif; ?>
|
| 180 |
</div>
|
| 181 |
+
|
| 182 |
</section>
|
| 183 |
</div>
|
| 184 |
<section class='form_controls wrapper'>
|
| 197 |
|
| 198 |
<section class='upsell-wrapper'>
|
| 199 |
<?php if(! $spInstalled) {?>
|
| 200 |
+
<div class='shortpixel-offer'>
|
| 201 |
<h3 class="" style="margin-top: 0;text-align: center;">
|
| 202 |
<a href="https://shortpixel.com/wp/af/VKG6LYN28044" target="_blank">
|
| 203 |
<?php echo esc_html__("Optimize your images with ShortPixel, get +50% credits!", "enable-media-replace"); ?>
|
| 219 |
</div>
|
| 220 |
</div>
|
| 221 |
<?php } ?>
|
| 222 |
+
<div class='shortpixel-offer site-speed'>
|
| 223 |
<p class='img-wrapper'><img src="<?php echo $emr->getPluginURL('img/shortpixel.png'); ?>" alt='ShortPixel'></p>
|
| 224 |
<h3><?php printf(__('ARE YOU %s CONCERNED WITH %s YOUR %s %s SITE SPEED? %s', 'enable-media-replace'),'<br>', '<br>','<br>', '<span class="red">','</span>'); ?><br><br>
|
| 225 |
<?php printf(__('ALLOW ShortPixel %s SPECIALISTS TO %s FIND THE %s SOLUTION FOR YOU.', 'enable-media-replace'), '<br>','<br>','<br>'); ?></h3>
|
views/upload.php
CHANGED
|
@@ -11,6 +11,7 @@ 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 |
/*require_once('classes/replacer.php');
|
| 15 |
require_once('classes/file.php'); */
|
| 16 |
|
|
@@ -36,6 +37,9 @@ $timestamp_replace = intval($_POST['timestamp_replace']);
|
|
| 36 |
$redirect_error = $uihelper->getFailedRedirect($post_id);
|
| 37 |
$redirect_success = $uihelper->getSuccesRedirect($post_id);
|
| 38 |
|
|
|
|
|
|
|
|
|
|
| 39 |
switch($timestamp_replace)
|
| 40 |
{
|
| 41 |
case \EnableMediaReplace\Replacer::TIME_UPDATEALL:
|
|
@@ -73,10 +77,22 @@ switch($timestamp_replace)
|
|
| 73 |
if ($replace_type == 'replace')
|
| 74 |
{
|
| 75 |
$replacer->setMode(\EnableMediaReplace\Replacer::MODE_REPLACE);
|
|
|
|
| 76 |
}
|
| 77 |
elseif ( 'replace_and_search' == $replace_type && apply_filters( 'emr_enable_replace_and_search', true ) )
|
| 78 |
{
|
| 79 |
$replacer->setMode(\EnableMediaReplace\Replacer::MODE_SEARCHREPLACE);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
}
|
| 81 |
|
| 82 |
$replacer->setTimeMode($timestamp_replace, $datetime);
|
|
@@ -114,17 +130,29 @@ if (is_uploaded_file($_FILES["userfile"]["tmp_name"])) {
|
|
| 114 |
// Gather all functions that both options do.
|
| 115 |
do_action('wp_handle_replace', array('post_id' => $post_id));
|
| 116 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 117 |
try
|
| 118 |
{
|
| 119 |
-
$replacer->replaceWith($_FILES["userfile"]["tmp_name"], $new_filename);
|
| 120 |
}
|
| 121 |
catch(\RunTimeException $e)
|
| 122 |
{
|
| 123 |
Log::addError($e->getMessage());
|
| 124 |
-
|
| 125 |
}
|
| 126 |
|
| 127 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
|
| 129 |
// Execute hook actions - thanks rubious for the suggestion!
|
| 130 |
|
| 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 |
|
| 37 |
$redirect_error = $uihelper->getFailedRedirect($post_id);
|
| 38 |
$redirect_success = $uihelper->getSuccesRedirect($post_id);
|
| 39 |
|
| 40 |
+
$do_new_location = isset($_POST['new_location']) ? sanitize_text_field($_POST['new_location']) : false;
|
| 41 |
+
$new_location_dir = isset($_POST['location_dir']) ? sanitize_text_field($_POST['location_dir']) : null;
|
| 42 |
+
|
| 43 |
switch($timestamp_replace)
|
| 44 |
{
|
| 45 |
case \EnableMediaReplace\Replacer::TIME_UPDATEALL:
|
| 77 |
if ($replace_type == 'replace')
|
| 78 |
{
|
| 79 |
$replacer->setMode(\EnableMediaReplace\Replacer::MODE_REPLACE);
|
| 80 |
+
$mode = \EnableMediaReplace\Replacer::MODE_REPLACE;
|
| 81 |
}
|
| 82 |
elseif ( 'replace_and_search' == $replace_type && apply_filters( 'emr_enable_replace_and_search', true ) )
|
| 83 |
{
|
| 84 |
$replacer->setMode(\EnableMediaReplace\Replacer::MODE_SEARCHREPLACE);
|
| 85 |
+
$mode = \EnableMediaReplace\Replacer::MODE_SEARCHREPLACE;
|
| 86 |
+
|
| 87 |
+
if ($do_new_location && ! is_null($new_location_dir))
|
| 88 |
+
{
|
| 89 |
+
$result = $replacer->setNewTargetLocation($new_location_dir);
|
| 90 |
+
if (! $result)
|
| 91 |
+
{
|
| 92 |
+
wp_safe_redirect($redirect_error);
|
| 93 |
+
exit();
|
| 94 |
+
}
|
| 95 |
+
}
|
| 96 |
}
|
| 97 |
|
| 98 |
$replacer->setTimeMode($timestamp_replace, $datetime);
|
| 130 |
// Gather all functions that both options do.
|
| 131 |
do_action('wp_handle_replace', array('post_id' => $post_id));
|
| 132 |
|
| 133 |
+
|
| 134 |
+
/* if ($mode = \EnableMediaReplace\Replacer::MODE_SEARCHREPLACE && $do_new_location && ! is_null($new_location_dir))
|
| 135 |
+
{
|
| 136 |
+
exit($new_filename);
|
| 137 |
+
$newdirfile = $replacer->newTargetLocation($new_location_dir);
|
| 138 |
+
}
|
| 139 |
+
*/
|
| 140 |
try
|
| 141 |
{
|
| 142 |
+
$result = $replacer->replaceWith($_FILES["userfile"]["tmp_name"], $new_filename);
|
| 143 |
}
|
| 144 |
catch(\RunTimeException $e)
|
| 145 |
{
|
| 146 |
Log::addError($e->getMessage());
|
| 147 |
+
// exit($e->getMessage());
|
| 148 |
}
|
| 149 |
|
| 150 |
+
if (is_null($result))
|
| 151 |
+
{
|
| 152 |
+
wp_safe_redirect($redirect_error);
|
| 153 |
+
exit();
|
| 154 |
+
}
|
| 155 |
+
// $returnurl = admin_url("/post.php?post={$_POST["ID"]}&action=edit&message=1");
|
| 156 |
|
| 157 |
// Execute hook actions - thanks rubious for the suggestion!
|
| 158 |
|
