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 @@
-
+
edit image
+
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");
+
+ ?>
+
+ 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",