diff --git a/plugins/fipfcard_plugin/fipfcard_plugin.php b/plugins/fipfcard_plugin/fipfcard_plugin.php index c359a46..67269e0 100644 --- a/plugins/fipfcard_plugin/fipfcard_plugin.php +++ b/plugins/fipfcard_plugin/fipfcard_plugin.php @@ -39,7 +39,7 @@ inclusions */ include_once(PLGNTLS_class::get_path() . '/php/utils/globals.php'); include_once(PLGNTLS_class::get_path() . '/php/menu/example_menu.php'); -//include_once(PLGNTLS_class::get_path() . '/php/images/image-edit.php'); +include_once(PLGNTLS_class::get_path() . '/php/images/image-edit.php'); @@ -131,11 +131,70 @@ $test2 = "you"; ) ); /* + if ( ! has_action( "wp_ajax_{$action}" ) ) { + it returns error 400 + */ } add_shortcode('fipfcard_image_editor', 'fipfcard_image_editor'); +/** + * Handles image editing via AJAX. + * from wp-admin/includes/ajax-action.php + */ +function wp_ajax_image_editor_PLGNTLS() { + $attachment_id = (int) $_POST['postid']; +// $attachment_id = 33555; + +// if ( empty( $attachment_id ) || ! current_user_can( 'edit_post', $attachment_id ) ) { +// wp_die( -1 ); +// } + +// check_ajax_referer( "image_editor-$attachment_id" ); +// require_once ABSPATH . 'wp-admin/includes/image-edit.php'; + + $msg = false; + + switch ( $_POST['do'] ) { + case 'save': + $msg = wp_save_image( $attachment_id ); + if ( ! empty( $msg->error ) ) { + wp_send_json_error( $msg ); + } + + wp_send_json_success( $msg ); + break; + case 'scale': + $msg = wp_save_image( $attachment_id ); + break; + case 'restore': + $msg = wp_restore_image( $attachment_id ); + break; + } + + ob_start(); + wp_image_editor( $attachment_id, $msg ); + $html = ob_get_clean(); + + if ( ! empty( $msg->error ) ) { + wp_send_json_error( + array( + 'message' => $msg, + 'html' => $html, + ) + ); + } + + wp_send_json_success( + array( + 'message' => $msg, + 'html' => $html, + ) + ); +} +add_action( 'wp_ajax_image_editor_PLGNTLS', 'wp_ajax_image_editor_PLGNTLS' ); + /* add_action('init', 'custom_action_handler'); diff --git a/plugins/fipfcard_plugin/html/image_editor.html b/plugins/fipfcard_plugin/html/image_editor.html index accfa51..ac3d300 100644 --- a/plugins/fipfcard_plugin/html/image_editor.html +++ b/plugins/fipfcard_plugin/html/image_editor.html @@ -1,2 +1,3 @@ - + +
diff --git a/plugins/fipfcard_plugin/js/image_editor.js b/plugins/fipfcard_plugin/js/image_editor.js index 8816fee..8c4d589 100644 --- a/plugins/fipfcard_plugin/js/image_editor.js +++ b/plugins/fipfcard_plugin/js/image_editor.js @@ -2,18 +2,380 @@ console.log("---------------inside image_editor.js--------------"); const edit_image_button = document.getElementById('edit_image'); const image_id_field = document.getElementById('image_id'); +const media_editor = document.getElementById('media_editor'); edit_image_button.addEventListener('click', () => { const image_id = image_id_field.value; - PLGNTLS_ajax("postid", image_id, 'image_editor') + //PLGNTLS_ajax("postid", image_id, 'image-editor') + const data_obj = { + 'postid': image_id, + }; + PLGNTLS_ajax(data_obj, 'image_editor_PLGNTLS') .then((response) => response.json()) .then((data) => { console.log("data: "); console.log(data); + media_editor.innerHTML = data.data.html; }) .catch((error) => { console.log("error: "); console.log(error); }); }); + +/* +open: function (e, t, i) { // t: nonce + this._view = i; // div: #media-editor-114 + var a = c('#image-editor-' + e), // e: image id + o = c('#media-head-' + e), + r = c('#imgedit-open-btn-' + e), + s = r.siblings('.spinner'); + if (!r.hasClass('button-activated')) return s.addClass('is-active'), + c.ajax({ + url: ajaxurl, + type: 'post', + data: { + action: 'image-editor', + _ajax_nonce: t, + postid: e, + do : 'open'}, + beforeSend: function () { + r.addClass('button-activated') + } + }).done( + function (t) { + var i; + '-1' === t && + ( + i = n('Could not load the preview image.'), + a.html( + '' + ) + ), + t.data && + t.data.html && + a.html(t.data.html), + o.fadeOut( + 'fast', + function () { + a.fadeIn( + 'fast', + function () { + i && + c(document).trigger('image-editor-ui-ready') + } + ), + r.removeClass('button-activated'), + s.removeClass('is-active') + } + ), + l.init(e) + } + ) }, + imgLoaded: function (t) { + var i = c('#image-preview-' + t), + e = c('#imgedit-crop-' + t); + void 0 === this.hold.sizer && + this.init(t), + this.initCrop(t, i, e), + this.setCropSelection( + t, + { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + width: i.innerWidth(), + height: i.innerHeight() + } + ), + this.toggleEditor(t, 0, !0) + }, + focusManager: function () { + setTimeout( + function () { + var t = c('.notice[role="alert"]'); + (t = t.length ? t : c('.imgedit-wrap').find(':tabbable:first')).attr('tabindex', '-1').trigger('focus') + }, + 100 + ) + }, + initCrop: function (a, t, i) { + var o = this, + r = c('#imgedit-sel-width-' + a), + s = c('#imgedit-sel-height-' + a), + n = c('#imgedit-start-x-' + a), + d = c('#imgedit-start-y-' + a), + t = c(t); + t.data('imgAreaSelect') || + ( + o.iasapi = t.imgAreaSelect({ + parent: i, + instance: !0, + handles: !0, + keys: !0, + minWidth: 3, + minHeight: 3, + onInit: function (t) { + c(t).next().css('position', 'absolute').nextAll('.imgareaselect-outer').css('position', 'absolute'), + i.children().on( + 'mousedown, touchstart', + function (t) { + var i, + e = !1; + t.shiftKey && + ( + t = o.iasapi.getSelection(), + i = o.getSelRatio(a), + e = t && + t.width && + t.height ? t.width + ':' + t.height : i + ), + o.iasapi.setOptions({ + aspectRatio: e + }) + } + ) + }, + onSelectStart: function () { + l.setDisabled(c('#imgedit-crop-sel-' + a), 1), + l.setDisabled(c('.imgedit-crop-clear'), 1), + l.setDisabled(c('.imgedit-crop-apply'), 1) + }, + onSelectEnd: function (t, i) { + l.setCropSelection(a, i), + c('#imgedit-crop > *').is(':visible') || + l.toggleControls(c('.imgedit-crop.button')) + }, + onSelectChange: function (t, i) { + var e = l.hold.sizer; + r.val(l.round(i.width / e)), + s.val(l.round(i.height / e)), + n.val(l.round(i.x1 / e)), + d.val(l.round(i.y1 / e)) + } + }) + ) + }, + setCropSelection: function (t, i) { + if (!(i = i || 0) || i.width < 3 && i.height < 3) return this.setDisabled(c('.imgedit-crop', '#imgedit-panel-' + t), 1), + this.setDisabled(c('#imgedit-crop-sel-' + t), 1), + c('#imgedit-sel-width-' + t).val(''), + c('#imgedit-sel-height-' + t).val(''), + c('#imgedit-start-x-' + t).val('0'), + c('#imgedit-start-y-' + t).val('0'), + c('#imgedit-selection-' + t).val(''), + !1; + i = { + x: i.x1, + y: i.y1, + w: i.width, + h: i.height + }, + this.setDisabled(c('.imgedit-crop', '#imgedit-panel-' + t), 1), + c('#imgedit-selection-' + t).val(JSON.stringify(i)) + }, + close: function (t, i) { + if ((i = i || !1) && this.notsaved(t)) return !1; + this.iasapi = {}, + this.hold = {}, + this._view ? this._view.back() : c('#image-editor-' + t).fadeOut( + 'fast', + function () { + c('#media-head-' + t).fadeIn( + 'fast', + function () { + c('#imgedit-open-btn-' + t).trigger('focus') + } + ), + c(this).empty() + } + ) + }, + notsaved: function (t) { + var i = c('#imgedit-history-' + t).val(), + i = '' !== i ? JSON.parse(i) : []; + return this.intval(c('#imgedit-undone-' + t).val()) < i.length && + !confirm(c('#imgedit-leaving-' + t).text()) + }, + addStep: function (t, i, e) { + for ( + var a = this, + o = c('#imgedit-history-' + i), + r = '' !== o.val() ? JSON.parse(o.val()) : [], + s = c('#imgedit-undone-' + i), + n = a.intval(s.val()); + 0 < n; + ) r.pop(), + n--; + s.val(0), + r.push(t), + o.val(JSON.stringify(r)), + a.refreshEditor( + i, + e, + function () { + a.setDisabled(c('#image-undo-' + i), !0), + a.setDisabled(c('#image-redo-' + i), !1) + } + ) + }, + rotate: function (t, i, e, a) { + if (c(a).hasClass('disabled')) return !1; + this.closePopup(a), + this.addStep({ + r: { + r: t, + fw: this.hold.h, + fh: this.hold.w + } + }, i, e) + }, + flip: function (t, i, e, a) { + if (c(a).hasClass('disabled')) return !1; + this.closePopup(a), + this.addStep({ + f: { + f: t, + fw: this.hold.w, + fh: this.hold.h + } + }, i, e) + }, + crop: function (t, i, e) { + var a = c('#imgedit-selection-' + t).val(), + o = this.intval(c('#imgedit-sel-width-' + t).val()), + r = this.intval(c('#imgedit-sel-height-' + t).val()); + if (c(e).hasClass('disabled') || '' === a) return !1; + 0 < (a = JSON.parse(a)).w && + 0 < a.h && + 0 < o && + 0 < r && + (a.fw = o, a.fh = r, this.addStep({ + c: a + }, t, i)), + c('#imgedit-sel-width-' + t).val(''), + c('#imgedit-sel-height-' + t).val(''), + c('#imgedit-start-x-' + t).val('0'), + c('#imgedit-start-y-' + t).val('0') + }, + undo: function (i, t) { + var e = this, + a = c('#image-undo-' + i), + o = c('#imgedit-undone-' + i), + r = e.intval(o.val()) + 1; + a.hasClass('disabled') || + ( + o.val(r), + e.refreshEditor( + i, + t, + function () { + var t = c('#imgedit-history-' + i), + t = '' !== t.val() ? JSON.parse(t.val()) : []; + e.setDisabled(c('#image-redo-' + i), !0), + e.setDisabled(a, r < t.length), + t.length === r && + c('#image-redo-' + i).trigger('focus') + } + ) + ) + }, + redo: function (t, i) { + var e = this, + a = c('#image-redo-' + t), + o = c('#imgedit-undone-' + t), + r = e.intval(o.val()) - 1; + a.hasClass('disabled') || + ( + o.val(r), + e.refreshEditor( + t, + i, + function () { + e.setDisabled(c('#image-undo-' + t), !0), + e.setDisabled(a, 0 < r), + 0 == r && + c('#image-undo-' + t).trigger('focus') + } + ) + ) + }, + setNumSelection: function (t, i) { + var e = c('#imgedit-sel-width-' + t), + a = c('#imgedit-sel-height-' + t), + o = c('#imgedit-start-x-' + t), + r = c('#imgedit-start-y-' + t), + o = this.intval(o.val()), + r = this.intval(r.val()), + s = this.intval(e.val()), + n = this.intval(a.val()), + d = c('#image-preview-' + t), + l = d.height(), + d = d.width(), + h = this.hold.sizer, + g = this.iasapi; + if (!1 !== this.validateNumeric(i)) return s < 1 ? (e.val(''), !1) : n < 1 ? (a.val(''), !1) : void ( + (s && n || o && r) && + (i = g.getSelection()) && + ( + s = i.x1 + Math.round(s * h), + n = i.y1 + Math.round(n * h), + o = o === i.x1 ? i.x1 : Math.round(o * h), + i = r === i.y1 ? i.y1 : Math.round(r * h), + d < s && + (o = 0, s = d, e.val(Math.round(s / h))), + l < n && + (i = 0, n = l, a.val(Math.round(n / h))), + g.setSelection(o, i, s, n), + g.update(), + this.setCropSelection(t, g.getSelection()) + ) + ) + }, + round: function (t) { + var i; + return t = Math.round(t), + 0.6 < this.hold.sizer ? t : '1' === (i = t.toString().slice( - 1)) ? t - 1 : '9' === i ? t + 1 : t + }, + setRatioSelection: function (t, i, e) { + var a = this.intval(c('#imgedit-crop-width-' + t).val()), + o = this.intval(c('#imgedit-crop-height-' + t).val()), + r = c('#image-preview-' + t).height(); + !1 === this.validateNumeric(e) ? this.iasapi.setOptions({ + aspectRatio: null + }) : a && + o && + ( + this.iasapi.setOptions({ + aspectRatio: a + ':' + o + }), + e = this.iasapi.getSelection(!0) + ) && + ( + r < (a = Math.ceil(e.y1 + (e.x2 - e.x1) / (a / o))) ? ( + a = r, + o = n( + 'Selected crop ratio exceeds the boundaries of the image. Try a different ratio.' + ), + c('#imgedit-crop-' + t).prepend( + '' + ), + wp.a11y.speak(o, 'assertive'), + c(i ? '#imgedit-crop-height-' + t : '#imgedit-crop-width-' + t).val('') + ) : void 0 !== (r = c('#imgedit-crop-' + t).find('.notice-error')) && + r.remove(), + this.iasapi.setSelection(e.x1, e.y1, e.x2, a), + this.iasapi.update() + ) + }, + validateNumeric: function (t) { + if (!1 === this.intval(c(t).val())) return c(t).val(''), + !1 + } + } +}(jQuery); + + +*/ diff --git a/plugins/fipfcard_plugin/php/images/image-edit.php b/plugins/fipfcard_plugin/php/images/image-edit.php new file mode 100644 index 0000000..7fd11df --- /dev/null +++ b/plugins/fipfcard_plugin/php/images/image-edit.php @@ -0,0 +1,1162 @@ + 600 ? 600 / $big : 1; + + $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true ); + $can_restore = false; + + if ( ! empty( $backup_sizes ) && isset( $backup_sizes['full-orig'], $meta['file'] ) ) { + $can_restore = wp_basename( $meta['file'] ) !== $backup_sizes['full-orig']['file']; + } + + if ( $msg ) { + if ( isset( $msg->error ) ) { + $note = ""; + } elseif ( isset( $msg->msg ) ) { + $note = ""; + } + } + + /** + * Shows the settings in the Image Editor that allow selecting to edit only the thumbnail of an image. + * + * @since 6.3.0 + * + * @param bool $show Whether to show the settings in the Image Editor. Default false. + */ + $edit_thumbnails_separately = (bool) apply_filters( 'image_edit_thumbnails_separately', false ); + +error_log("------3"); + + ?> +
+
+ +
+
+ + +
+ +
+ get_post_mime_type( $post_id ), + 'methods' => array( 'rotate' ), + ) + ) ) { + $note_no_rotate = ''; + ?> + + + + ' . __( 'Image rotation is not supported by your web host.' ) . '

'; + ?> + + + +
+ + + +
+
+
+
+ + + + +
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
+
+
+
+

+ +
+

+
+ +

+ ' . $meta['width'] . ' × ' . $meta['height'] . '' + ); + ?> +

+ +
+
+ +
+ + + + + + + +
+
+
+
+
+
+ + +
+
+

+
+

+ +

+
+ , 'restore')" class="button button-primary" value="" /> +
+
+
+
+ +
+
+
+

+ +
+

+


+

+ +


+

+
+
+
+ +
+ + + + + +
+
+
+ +
+ + + + + +
+
+
+ +
+ + + + + +
+
+
+ +
+
+
+
+ + + +
+
+

+ +
+

+
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+ +
+ +
+ stream( $mime_type ) ) ) { + return false; + } + + return true; + } else { + /* translators: 1: $image, 2: WP_Image_Editor */ + _deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( '%1$s needs to be a %2$s object.' ), '$image', 'WP_Image_Editor' ) ); + + /** + * Filters the GD image resource to be streamed to the browser. + * + * @since 2.9.0 + * @deprecated 3.5.0 Use {@see 'image_editor_save_pre'} instead. + * + * @param resource|GdImage $image Image resource to be streamed. + * @param int $attachment_id The attachment post ID. + */ + $image = apply_filters_deprecated( 'image_save_pre', array( $image, $attachment_id ), '3.5.0', 'image_editor_save_pre' ); + + switch ( $mime_type ) { + case 'image/jpeg': + header( 'Content-Type: image/jpeg' ); + return imagejpeg( $image, null, 90 ); + case 'image/png': + header( 'Content-Type: image/png' ); + return imagepng( $image ); + case 'image/gif': + header( 'Content-Type: image/gif' ); + return imagegif( $image ); + case 'image/webp': + if ( function_exists( 'imagewebp' ) ) { + header( 'Content-Type: image/webp' ); + return imagewebp( $image, null, 90 ); + } + return false; + default: + return false; + } + } +} + +/** + * Saves image to file. + * + * @since 2.9.0 + * @since 3.5.0 The `$image` parameter expects a `WP_Image_Editor` instance. + * @since 6.0.0 The `$filesize` value was added to the returned array. + * + * @param string $filename Name of the file to be saved. + * @param WP_Image_Editor $image The image editor instance. + * @param string $mime_type The mime type of the image. + * @param int $post_id Attachment post ID. + * @return array|WP_Error|bool { + * Array on success or WP_Error if the file failed to save. + * When called with a deprecated value for the `$image` parameter, + * i.e. a non-`WP_Image_Editor` image resource or `GdImage` instance, + * the function will return true on success, false on failure. + * + * @type string $path Path to the image file. + * @type string $file Name of the image file. + * @type int $width Image width. + * @type int $height Image height. + * @type string $mime-type The mime type of the image. + * @type int $filesize File size of the image. + * } + */ +function wp_save_image_file( $filename, $image, $mime_type, $post_id ) { +error_log("------1"); + + if ( $image instanceof WP_Image_Editor ) { + + /** This filter is documented in wp-admin/includes/image-edit.php */ + $image = apply_filters( 'image_editor_save_pre', $image, $post_id ); + + /** + * Filters whether to skip saving the image file. + * + * Returning a non-null value will short-circuit the save method, + * returning that value instead. + * + * @since 3.5.0 + * + * @param bool|null $override Value to return instead of saving. Default null. + * @param string $filename Name of the file to be saved. + * @param WP_Image_Editor $image The image editor instance. + * @param string $mime_type The mime type of the image. + * @param int $post_id Attachment post ID. + */ + $saved = apply_filters( 'wp_save_image_editor_file', null, $filename, $image, $mime_type, $post_id ); + + if ( null !== $saved ) { + return $saved; + } + + return $image->save( $filename, $mime_type ); + } else { + /* translators: 1: $image, 2: WP_Image_Editor */ + _deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( '%1$s needs to be a %2$s object.' ), '$image', 'WP_Image_Editor' ) ); + + /** This filter is documented in wp-admin/includes/image-edit.php */ + $image = apply_filters_deprecated( 'image_save_pre', array( $image, $post_id ), '3.5.0', 'image_editor_save_pre' ); + + /** + * Filters whether to skip saving the image file. + * + * Returning a non-null value will short-circuit the save method, + * returning that value instead. + * + * @since 2.9.0 + * @deprecated 3.5.0 Use {@see 'wp_save_image_editor_file'} instead. + * + * @param bool|null $override Value to return instead of saving. Default null. + * @param string $filename Name of the file to be saved. + * @param resource|GdImage $image Image resource or GdImage instance. + * @param string $mime_type The mime type of the image. + * @param int $post_id Attachment post ID. + */ + $saved = apply_filters_deprecated( + 'wp_save_image_file', + array( null, $filename, $image, $mime_type, $post_id ), + '3.5.0', + 'wp_save_image_editor_file' + ); + + if ( null !== $saved ) { + return $saved; + } + + switch ( $mime_type ) { + case 'image/jpeg': + /** This filter is documented in wp-includes/class-wp-image-editor.php */ + return imagejpeg( $image, $filename, apply_filters( 'jpeg_quality', 90, 'edit_image' ) ); + case 'image/png': + return imagepng( $image, $filename ); + case 'image/gif': + return imagegif( $image, $filename ); + case 'image/webp': + if ( function_exists( 'imagewebp' ) ) { + return imagewebp( $image, $filename ); + } + return false; + default: + return false; + } + } +} + +/** + * Image preview ratio. Internal use only. + * + * @since 2.9.0 + * + * @ignore + * @param int $w Image width in pixels. + * @param int $h Image height in pixels. + * @return float|int Image preview ratio. + */ +function _image_get_preview_ratio( $w, $h ) { +error_log("------1"); + + $max = max( $w, $h ); + return $max > 600 ? ( 600 / $max ) : 1; +} + +/** + * Returns an image resource. Internal use only. + * + * @since 2.9.0 + * @deprecated 3.5.0 Use WP_Image_Editor::rotate() + * @see WP_Image_Editor::rotate() + * + * @ignore + * @param resource|GdImage $img Image resource. + * @param float|int $angle Image rotation angle, in degrees. + * @return resource|GdImage|false GD image resource or GdImage instance, false otherwise. + */ +function _rotate_image_resource( $img, $angle ) { +error_log("------1"); + + _deprecated_function( __FUNCTION__, '3.5.0', 'WP_Image_Editor::rotate()' ); + + if ( function_exists( 'imagerotate' ) ) { + $rotated = imagerotate( $img, $angle, 0 ); + + if ( is_gd_image( $rotated ) ) { + imagedestroy( $img ); + $img = $rotated; + } + } + + return $img; +} + +/** + * Flips an image resource. Internal use only. + * + * @since 2.9.0 + * @deprecated 3.5.0 Use WP_Image_Editor::flip() + * @see WP_Image_Editor::flip() + * + * @ignore + * @param resource|GdImage $img Image resource or GdImage instance. + * @param bool $horz Whether to flip horizontally. + * @param bool $vert Whether to flip vertically. + * @return resource|GdImage (maybe) flipped image resource or GdImage instance. + */ +function _flip_image_resource( $img, $horz, $vert ) { +error_log("------1"); + + _deprecated_function( __FUNCTION__, '3.5.0', 'WP_Image_Editor::flip()' ); + + $w = imagesx( $img ); + $h = imagesy( $img ); + $dst = wp_imagecreatetruecolor( $w, $h ); + + if ( is_gd_image( $dst ) ) { + $sx = $vert ? ( $w - 1 ) : 0; + $sy = $horz ? ( $h - 1 ) : 0; + $sw = $vert ? -$w : $w; + $sh = $horz ? -$h : $h; + + if ( imagecopyresampled( $dst, $img, 0, 0, $sx, $sy, $w, $h, $sw, $sh ) ) { + imagedestroy( $img ); + $img = $dst; + } + } + + return $img; +} + +/** + * Crops an image resource. Internal use only. + * + * @since 2.9.0 + * + * @ignore + * @param resource|GdImage $img Image resource or GdImage instance. + * @param float $x Source point x-coordinate. + * @param float $y Source point y-coordinate. + * @param float $w Source width. + * @param float $h Source height. + * @return resource|GdImage (maybe) cropped image resource or GdImage instance. + */ +function _crop_image_resource( $img, $x, $y, $w, $h ) { +error_log("------1"); + + $dst = wp_imagecreatetruecolor( $w, $h ); + + if ( is_gd_image( $dst ) ) { + if ( imagecopy( $dst, $img, 0, 0, $x, $y, $w, $h ) ) { + imagedestroy( $img ); + $img = $dst; + } + } + + return $img; +} + +/** + * Performs group of changes on Editor specified. + * + * @since 2.9.0 + * + * @param WP_Image_Editor $image WP_Image_Editor instance. + * @param array $changes Array of change operations. + * @return WP_Image_Editor WP_Image_Editor instance with changes applied. + */ +function image_edit_apply_changes( $image, $changes ) { +error_log("------1"); + + if ( is_gd_image( $image ) ) { + /* translators: 1: $image, 2: WP_Image_Editor */ + _deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( '%1$s needs to be a %2$s object.' ), '$image', 'WP_Image_Editor' ) ); + } + + if ( ! is_array( $changes ) ) { + return $image; + } + + // Expand change operations. + foreach ( $changes as $key => $obj ) { + if ( isset( $obj->r ) ) { + $obj->type = 'rotate'; + $obj->angle = $obj->r; + unset( $obj->r ); + } elseif ( isset( $obj->f ) ) { + $obj->type = 'flip'; + $obj->axis = $obj->f; + unset( $obj->f ); + } elseif ( isset( $obj->c ) ) { + $obj->type = 'crop'; + $obj->sel = $obj->c; + unset( $obj->c ); + } + + $changes[ $key ] = $obj; + } + + // Combine operations. + if ( count( $changes ) > 1 ) { + $filtered = array( $changes[0] ); + + for ( $i = 0, $j = 1, $c = count( $changes ); $j < $c; $j++ ) { + $combined = false; + + if ( $filtered[ $i ]->type === $changes[ $j ]->type ) { + switch ( $filtered[ $i ]->type ) { + case 'rotate': + $filtered[ $i ]->angle += $changes[ $j ]->angle; + $combined = true; + break; + case 'flip': + $filtered[ $i ]->axis ^= $changes[ $j ]->axis; + $combined = true; + break; + } + } + + if ( ! $combined ) { + $filtered[ ++$i ] = $changes[ $j ]; + } + } + + $changes = $filtered; + unset( $filtered ); + } + + // Image resource before applying the changes. + if ( $image instanceof WP_Image_Editor ) { + + /** + * Filters the WP_Image_Editor instance before applying changes to the image. + * + * @since 3.5.0 + * + * @param WP_Image_Editor $image WP_Image_Editor instance. + * @param array $changes Array of change operations. + */ + $image = apply_filters( 'wp_image_editor_before_change', $image, $changes ); + } elseif ( is_gd_image( $image ) ) { + + /** + * Filters the GD image resource before applying changes to the image. + * + * @since 2.9.0 + * @deprecated 3.5.0 Use {@see 'wp_image_editor_before_change'} instead. + * + * @param resource|GdImage $image GD image resource or GdImage instance. + * @param array $changes Array of change operations. + */ + $image = apply_filters_deprecated( 'image_edit_before_change', array( $image, $changes ), '3.5.0', 'wp_image_editor_before_change' ); + } + + foreach ( $changes as $operation ) { + switch ( $operation->type ) { + case 'rotate': + if ( 0 !== $operation->angle ) { + if ( $image instanceof WP_Image_Editor ) { + $image->rotate( $operation->angle ); + } else { + $image = _rotate_image_resource( $image, $operation->angle ); + } + } + break; + case 'flip': + if ( 0 !== $operation->axis ) { + if ( $image instanceof WP_Image_Editor ) { + $image->flip( ( $operation->axis & 1 ) !== 0, ( $operation->axis & 2 ) !== 0 ); + } else { + $image = _flip_image_resource( $image, ( $operation->axis & 1 ) !== 0, ( $operation->axis & 2 ) !== 0 ); + } + } + break; + case 'crop': + $sel = $operation->sel; + + if ( $image instanceof WP_Image_Editor ) { + $size = $image->get_size(); + $w = $size['width']; + $h = $size['height']; + + $scale = 1 / _image_get_preview_ratio( $w, $h ); // Discard preview scaling. + $image->crop( $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale ); + } else { + $scale = 1 / _image_get_preview_ratio( imagesx( $image ), imagesy( $image ) ); // Discard preview scaling. + $image = _crop_image_resource( $image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale ); + } + break; + } + } + + return $image; +} + + +/** + * Streams image in post to browser, along with enqueued changes + * in `$_REQUEST['history']`. + * + * @since 2.9.0 + * + * @param int $post_id Attachment post ID. + * @return bool True on success, false on failure. + */ +function stream_preview_image( $post_id ) { +error_log("------1"); + + $post = get_post( $post_id ); + + wp_raise_memory_limit( 'admin' ); + + $img = wp_get_image_editor( _load_image_to_edit_path( $post_id ) ); + + if ( is_wp_error( $img ) ) { + return false; + } + + $changes = ! empty( $_REQUEST['history'] ) ? json_decode( wp_unslash( $_REQUEST['history'] ) ) : null; + if ( $changes ) { + $img = image_edit_apply_changes( $img, $changes ); + } + + // Scale the image. + $size = $img->get_size(); + $w = $size['width']; + $h = $size['height']; + + $ratio = _image_get_preview_ratio( $w, $h ); + $w2 = max( 1, $w * $ratio ); + $h2 = max( 1, $h * $ratio ); + + if ( is_wp_error( $img->resize( $w2, $h2 ) ) ) { + return false; + } + + return wp_stream_image( $img, $post->post_mime_type, $post_id ); +} + +/** + * Restores the metadata for a given attachment. + * + * @since 2.9.0 + * + * @param int $post_id Attachment post ID. + * @return stdClass Image restoration message object. + */ +function wp_restore_image( $post_id ) { +error_log("------1"); + + $meta = wp_get_attachment_metadata( $post_id ); + $file = get_attached_file( $post_id ); + $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true ); + $old_backup_sizes = $backup_sizes; + $restored = false; + $msg = new stdClass(); + + if ( ! is_array( $backup_sizes ) ) { + $msg->error = __( 'Cannot load image metadata.' ); + return $msg; + } + + $parts = pathinfo( $file ); + $suffix = time() . rand( 100, 999 ); + $default_sizes = get_intermediate_image_sizes(); + + if ( isset( $backup_sizes['full-orig'] ) && is_array( $backup_sizes['full-orig'] ) ) { + $data = $backup_sizes['full-orig']; + + if ( $parts['basename'] !== $data['file'] ) { + if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE ) { + // Delete only if it's an edited image. + if ( preg_match( '/-e[0-9]{13}\./', $parts['basename'] ) ) { + wp_delete_file( $file ); + } + } elseif ( isset( $meta['width'], $meta['height'] ) ) { + $backup_sizes[ "full-$suffix" ] = array( + 'width' => $meta['width'], + 'height' => $meta['height'], + 'file' => $parts['basename'], + ); + } + } + + $restored_file = path_join( $parts['dirname'], $data['file'] ); + $restored = update_attached_file( $post_id, $restored_file ); + + $meta['file'] = _wp_relative_upload_path( $restored_file ); + $meta['width'] = $data['width']; + $meta['height'] = $data['height']; + } + + foreach ( $default_sizes as $default_size ) { + if ( isset( $backup_sizes[ "$default_size-orig" ] ) ) { + $data = $backup_sizes[ "$default_size-orig" ]; + + if ( isset( $meta['sizes'][ $default_size ] ) && $meta['sizes'][ $default_size ]['file'] !== $data['file'] ) { + if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE ) { + // Delete only if it's an edited image. + if ( preg_match( '/-e[0-9]{13}-/', $meta['sizes'][ $default_size ]['file'] ) ) { + $delete_file = path_join( $parts['dirname'], $meta['sizes'][ $default_size ]['file'] ); + wp_delete_file( $delete_file ); + } + } else { + $backup_sizes[ "$default_size-{$suffix}" ] = $meta['sizes'][ $default_size ]; + } + } + + $meta['sizes'][ $default_size ] = $data; + } else { + unset( $meta['sizes'][ $default_size ] ); + } + } + + if ( ! wp_update_attachment_metadata( $post_id, $meta ) + || ( $old_backup_sizes !== $backup_sizes && ! update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes ) ) + ) { + $msg->error = __( 'Cannot save image metadata.' ); + return $msg; + } + + if ( ! $restored ) { + $msg->error = __( 'Image metadata is inconsistent.' ); + } else { + $msg->msg = __( 'Image restored successfully.' ); + + if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE ) { + delete_post_meta( $post_id, '_wp_attachment_backup_sizes' ); + } + } + + return $msg; +} + +/** + * Saves image to post, along with enqueued changes + * in `$_REQUEST['history']`. + * + * @since 2.9.0 + * + * @param int $post_id Attachment post ID. + * @return stdClass + */ +function wp_save_image( $post_id ) { +error_log("------1"); + + $_wp_additional_image_sizes = wp_get_additional_image_sizes(); + + $return = new stdClass(); + $success = false; + $delete = false; + $scaled = false; + $nocrop = false; + $post = get_post( $post_id ); + + $img = wp_get_image_editor( _load_image_to_edit_path( $post_id, 'full' ) ); + + if ( is_wp_error( $img ) ) { + $return->error = esc_js( __( 'Unable to create new image.' ) ); + return $return; + } + + $full_width = ! empty( $_REQUEST['fwidth'] ) ? (int) $_REQUEST['fwidth'] : 0; + $full_height = ! empty( $_REQUEST['fheight'] ) ? (int) $_REQUEST['fheight'] : 0; + $target = ! empty( $_REQUEST['target'] ) ? preg_replace( '/[^a-z0-9_-]+/i', '', $_REQUEST['target'] ) : ''; + $scale = ! empty( $_REQUEST['do'] ) && 'scale' === $_REQUEST['do']; + + /** This filter is documented in wp-admin/includes/image-edit.php */ + $edit_thumbnails_separately = (bool) apply_filters( 'image_edit_thumbnails_separately', false ); + + if ( $scale ) { + $size = $img->get_size(); + $original_width = $size['width']; + $original_height = $size['height']; + + if ( $full_width > $original_width || $full_height > $original_height ) { + $return->error = esc_js( __( 'Images cannot be scaled to a size larger than the original.' ) ); + return $return; + } + + if ( $full_width > 0 && $full_height > 0 ) { + // Check if it has roughly the same w / h ratio. + $diff = round( $original_width / $original_height, 2 ) - round( $full_width / $full_height, 2 ); + if ( -0.1 < $diff && $diff < 0.1 ) { + // Scale the full size image. + if ( $img->resize( $full_width, $full_height ) ) { + $scaled = true; + } + } + + if ( ! $scaled ) { + $return->error = esc_js( __( 'Error while saving the scaled image. Please reload the page and try again.' ) ); + return $return; + } + } + } elseif ( ! empty( $_REQUEST['history'] ) ) { + $changes = json_decode( wp_unslash( $_REQUEST['history'] ) ); + if ( $changes ) { + $img = image_edit_apply_changes( $img, $changes ); + } + } else { + $return->error = esc_js( __( 'Nothing to save, the image has not changed.' ) ); + return $return; + } + + $meta = wp_get_attachment_metadata( $post_id ); + $backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true ); + + if ( ! is_array( $meta ) ) { + $return->error = esc_js( __( 'Image data does not exist. Please re-upload the image.' ) ); + return $return; + } + + if ( ! is_array( $backup_sizes ) ) { + $backup_sizes = array(); + } + + // Generate new filename. + $path = get_attached_file( $post_id ); + + $basename = pathinfo( $path, PATHINFO_BASENAME ); + $dirname = pathinfo( $path, PATHINFO_DIRNAME ); + $ext = pathinfo( $path, PATHINFO_EXTENSION ); + $filename = pathinfo( $path, PATHINFO_FILENAME ); + $suffix = time() . rand( 100, 999 ); + + if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE + && isset( $backup_sizes['full-orig'] ) && $backup_sizes['full-orig']['file'] !== $basename + ) { + + if ( $edit_thumbnails_separately && 'thumbnail' === $target ) { + $new_path = "{$dirname}/{$filename}-temp.{$ext}"; + } else { + $new_path = $path; + } + } else { + while ( true ) { + $filename = preg_replace( '/-e([0-9]+)$/', '', $filename ); + $filename .= "-e{$suffix}"; + $new_filename = "{$filename}.{$ext}"; + $new_path = "{$dirname}/$new_filename"; + + if ( file_exists( $new_path ) ) { + ++$suffix; + } else { + break; + } + } + } + + // Save the full-size file, also needed to create sub-sizes. + if ( ! wp_save_image_file( $new_path, $img, $post->post_mime_type, $post_id ) ) { + $return->error = esc_js( __( 'Unable to save the image.' ) ); + return $return; + } + + if ( 'nothumb' === $target || 'all' === $target || 'full' === $target || $scaled ) { + $tag = false; + + if ( isset( $backup_sizes['full-orig'] ) ) { + if ( ( ! defined( 'IMAGE_EDIT_OVERWRITE' ) || ! IMAGE_EDIT_OVERWRITE ) + && $backup_sizes['full-orig']['file'] !== $basename + ) { + $tag = "full-$suffix"; + } + } else { + $tag = 'full-orig'; + } + + if ( $tag ) { + $backup_sizes[ $tag ] = array( + 'width' => $meta['width'], + 'height' => $meta['height'], + 'file' => $basename, + ); + } + + $success = ( $path === $new_path ) || update_attached_file( $post_id, $new_path ); + + $meta['file'] = _wp_relative_upload_path( $new_path ); + + $size = $img->get_size(); + $meta['width'] = $size['width']; + $meta['height'] = $size['height']; + + if ( $success && ( 'nothumb' === $target || 'all' === $target ) ) { + $sizes = get_intermediate_image_sizes(); + + if ( $edit_thumbnails_separately && 'nothumb' === $target ) { + $sizes = array_diff( $sizes, array( 'thumbnail' ) ); + } + } + + $return->fw = $meta['width']; + $return->fh = $meta['height']; + } elseif ( $edit_thumbnails_separately && 'thumbnail' === $target ) { + $sizes = array( 'thumbnail' ); + $success = true; + $delete = true; + $nocrop = true; + } + + /* + * We need to remove any existing resized image files because + * a new crop or rotate could generate different sizes (and hence, filenames), + * keeping the new resized images from overwriting the existing image files. + * https://core.trac.wordpress.org/ticket/32171 + */ + if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE && ! empty( $meta['sizes'] ) ) { + foreach ( $meta['sizes'] as $size ) { + if ( ! empty( $size['file'] ) && preg_match( '/-e[0-9]{13}-/', $size['file'] ) ) { + $delete_file = path_join( $dirname, $size['file'] ); + wp_delete_file( $delete_file ); + } + } + } + + if ( isset( $sizes ) ) { + $_sizes = array(); + + foreach ( $sizes as $size ) { + $tag = false; + + if ( isset( $meta['sizes'][ $size ] ) ) { + if ( isset( $backup_sizes[ "$size-orig" ] ) ) { + if ( ( ! defined( 'IMAGE_EDIT_OVERWRITE' ) || ! IMAGE_EDIT_OVERWRITE ) + && $backup_sizes[ "$size-orig" ]['file'] !== $meta['sizes'][ $size ]['file'] + ) { + $tag = "$size-$suffix"; + } + } else { + $tag = "$size-orig"; + } + + if ( $tag ) { + $backup_sizes[ $tag ] = $meta['sizes'][ $size ]; + } + } + + if ( isset( $_wp_additional_image_sizes[ $size ] ) ) { + $width = (int) $_wp_additional_image_sizes[ $size ]['width']; + $height = (int) $_wp_additional_image_sizes[ $size ]['height']; + $crop = ( $nocrop ) ? false : $_wp_additional_image_sizes[ $size ]['crop']; + } else { + $height = get_option( "{$size}_size_h" ); + $width = get_option( "{$size}_size_w" ); + $crop = ( $nocrop ) ? false : get_option( "{$size}_crop" ); + } + + $_sizes[ $size ] = array( + 'width' => $width, + 'height' => $height, + 'crop' => $crop, + ); + } + + $meta['sizes'] = array_merge( $meta['sizes'], $img->multi_resize( $_sizes ) ); + } + + unset( $img ); + + if ( $success ) { + wp_update_attachment_metadata( $post_id, $meta ); + update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes ); + + if ( 'thumbnail' === $target || 'all' === $target || 'full' === $target ) { + // Check if it's an image edit from attachment edit screen. + if ( ! empty( $_REQUEST['context'] ) && 'edit-attachment' === $_REQUEST['context'] ) { + $thumb_url = wp_get_attachment_image_src( $post_id, array( 900, 600 ), true ); + + $return->thumbnail = $thumb_url[0]; + } else { + $file_url = wp_get_attachment_url( $post_id ); + + if ( ! empty( $meta['sizes']['thumbnail'] ) ) { + $thumb = $meta['sizes']['thumbnail']; + $return->thumbnail = path_join( dirname( $file_url ), $thumb['file'] ); + } else { + $return->thumbnail = "$file_url?w=128&h=128"; + } + } + } + } else { + $delete = true; + } + + if ( $delete ) { + wp_delete_file( $new_path ); + } + + $return->msg = esc_js( __( 'Image saved' ) ); + + return $return; +} diff --git a/plugins/fipfcard_plugin/utils/plugin_ajax.js b/plugins/fipfcard_plugin/utils/plugin_ajax.js index a2ea328..9b6762c 100644 --- a/plugins/fipfcard_plugin/utils/plugin_ajax.js +++ b/plugins/fipfcard_plugin/utils/plugin_ajax.js @@ -5,11 +5,12 @@ */ console.log("PLGNTLS_data"); console.log(PLGNTLS_data); -function PLGNTLS_ajax(data_key, data_value, action) { +function PLGNTLS_ajax(data_obj, action) { const data = new FormData(); data.append("action", action); data.append("_ajax_nonce", PLGNTLS_data.ajax_nonce); - data.append(data_key, data_value); + for (const key in data_obj) + data.append(key, data_obj[key]); return fetch(PLGNTLS_data.ajax_url, { method: "POST",