Plugin Directory

Changeset 3461881


Ignore:
Timestamp:
02/15/2026 02:48:38 PM (6 weeks ago)
Author:
devsabbirahmed
Message:

1.4.3

Location:
wc-bulk-order-generator
Files:
531 added
1 deleted
10 edited

Legend:

Unmodified
Added
Removed
  • wc-bulk-order-generator/trunk/build/js/generator.min.js

    r3315024 r3461881  
    1 jQuery(document).ready((function(t){var e=localStorage.getItem("activeTab");e?(t(".nav-tab").removeClass("nav-tab-active"),t(".tab-content").removeClass("active"),t('.nav-tab[href="'.concat(e,'"]')).addClass("nav-tab-active"),t(e).addClass("active")):(t(".nav-tab").first().addClass("nav-tab-active"),t(".tab-content").first().addClass("active")),t(".nav-tab").on("click",(function(e){e.preventDefault(),t(".nav-tab").removeClass("nav-tab-active"),t(this).addClass("nav-tab-active"),t(".tab-content").removeClass("active"),t(t(this).attr("href")).addClass("active"),localStorage.setItem("activeTab",t(this).attr("href"))}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>');var o,r=!1,n=0,a=0,c=0,s=0,i=!1;function d(t){var e=Math.floor(t/1e3),o=Math.floor(e/60),r=Math.floor(o/60);return"".concat(r,"h ").concat(o%60,"m ").concat(e%60,"s")}function p(){var e=a+c,r=e/n*100;t(".progress-bar").css("width",r+"%"),t("#total-processed").text(e),t("#success-count").text(a),t("#failed-count").text(c);var s=e/((Date.now()-o)/1e3);t("#processing-rate").text(s.toFixed(2));var i=(n-e)/s;t("#time-remaining").text(d(1e3*i)),t("#elapsed-time").text(d(Date.now()-o))}function u(){if(!r||i)return l("Order Generation stopped","warning"),void e("Order Generation stopped","warning");var o=n-(a+c);if(o<=0)return l("Order Generation complete!","success"),void e("Order Generation complete!","success");var d=Math.min(t("#batch_size").val(),o);t("#generation-status").text("Processing batch ".concat(s+1,"...")).removeClass().addClass("notice notice-info").show(),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"process_order_batch",nonce:wcOrderGenerator.nonce,batch_size:d,batch_number:s},success:function(t){t.success?(a+=t.data.success,c+=t.data.failed,s++,p(),i?(l("Generation stopped","warning"),e("Order Generation stopped","warning")):setTimeout(u,500)):(f("Error processing batch: "+t.data),e("Eror processing batch","error"))},error:function(t,o,r){i?(l("Generation stopped","warning"),e("Order Generation stopped","warning")):(f("Server error occurred: "+r),e("Server error occurred","error"))}})}function l(e,o){t("#generation-status").text(e).removeClass().addClass("notice notice-".concat(o)).show(),r=!1,i=!1,t("#start-generation").prop("disabled",!1),t("#stop-generation").prop("disabled",!0),t("#reset-generation").show()}function f(e){c+=0,p(),t("#time-remaining").text(d(c)),l(e,"error")}t("#order-generator-form").on("submit",(function(e){e.preventDefault();var d=parseInt(t("#num_orders").val());if(d<1||d>1e4)alert("Please enter a number between 1 and 10k");else{var p=parseInt(t("#batch_size").val());p<5||p>30?alert("Please enter a batch number between 5 and 30"):(r=!0,i=!1,n=d,a=0,c=0,s=0,o=Date.now(),t("#start-generation").prop("disabled",!0),t("#stop-generation").prop("disabled",!1),t("#reset-generation").hide(),t("#generation-status").text("Starting generation...").removeClass().addClass("notice notice-info").show(),t(".progress-bar").css("width","0%"),u())}})),t("#stop-generation").on("click",(function(){r&&(i=!0,t(this).prop("disabled",!0),t("#generation-status").text("Stopping generation...").removeClass().addClass("notice notice-warning").show(),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"stop_order_generation",nonce:wcOrderGenerator.nonce}}).fail((function(t,e,o){})))})),t("#reset-generation").on("click",(function(){r=!1,i=!1,n=0,a=0,c=0,s=0,t(".progress-bar").css("width","0%"),t("#total-processed").text("0"),t("#success-count").text("0"),t("#failed-count").text("0"),t("#processing-rate").text("0"),t("#elapsed-time").text("0s"),t("#time-remaining").text("--"),t("#num_orders").val("100"),t("#start-generation").prop("disabled",!1),t("#stop-generation").prop("disabled",!0),t("#reset-generation").hide(),t("#generation-status").hide()}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>');var o=!1,r=0,n=0,a=0,c=0;function s(){var e=(n+a)/r*100;t(".product-progress-bar").css("width",e+"%"),t("#products-processed").text(n),t("#products-failed").text(a)}function i(){if(!o)return t("#product-generation-status").text("Generation stopped").removeClass().addClass("notice notice-warning").show(),t("#start-product-generation").prop("disabled",!1),t("#stop-product-generation").prop("disabled",!0),t("#reset-product-generation").show(),void e("Product Generation stopped","warning");var p=r-(n+a);if(p<=0)return t("#product-generation-status").text("Product generation complete!").removeClass().addClass("notice notice-success").show(),t("#start-product-generation").prop("disabled",!1),t("#stop-product-generation").prop("disabled",!0),t("#reset-product-generation").show(),void e("Product Generation complete!","success");var u=Math.min(t("#product_batch_size").val(),p);t("#product-generation-status").text("Processing product batch ".concat(c+1,"...")).removeClass().addClass("notice notice-info").show(),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"process_product_batch",nonce:wcOrderGenerator.products_nonce,batch_size:u,price_min:t("#price_min").val(),price_max:t("#price_max").val(),batch_number:c,product_types:window.selectedProductTypes},success:function(t){t.success?(n+=t.data.success,a+=t.data.failed,c++,s(),setTimeout(i,500)):d("Error processing product batch: "+t.data)},error:function(){d("Server error occurred during product generation")}})}function d(e){a+=parseInt(t("#product_batch_size").val()),s(),t("#product-generation-status").text(e).removeClass().addClass("notice notice-error").show(),o=!1,t("#start-product-generation").prop("disabled",!1),t("#stop-product-generation").prop("disabled",!0),t("#reset-product-generation").show()}t("#product-generator-form").on("submit",(function(e){e.preventDefault();var s=parseInt(t("#num_products").val());if(s<1||s>1e4)alert("Please enter a number between 1 and 10k");else{var d=parseInt(t("#product_batch_size").val());if(d<5||d>30)alert("Please enter a batch number between 5 and 30");else{var p=[];t('#product-generator-form input[name="product_types[]"]:checked').each((function(){p.push(t(this).val())})),0!==p.length?(o=!0,r=s,n=0,a=0,c=0,Date.now(),t("#start-product-generation").prop("disabled",!0),t("#stop-product-generation").prop("disabled",!1),t("#reset-product-generation").hide(),t("#product-generation-status").text("Starting product generation...").removeClass().addClass("notice notice-info").show(),t(".product-progress-bar").css("width","0%"),window.selectedProductTypes=p,i()):alert("Please select at least one product type.")}}})),t("#stop-product-generation").on("click",(function(){o=!1,t(this).prop("disabled",!0),t("#product-generation-status").text("Stopping product generation...").removeClass().addClass("notice notice-warning").show()})),t("#reset-product-generation").on("click",(function(){o=!1,r=0,n=0,a=0,c=0,t(".product-progress-bar").css("width","0%"),t("#products-processed").text("0"),t("#products-failed").text("0"),t("#start-product-generation").prop("disabled",!1),t("#stop-product-generation").prop("disabled",!0),t("#reset-product-generation").hide(),t("#product-generation-status").hide()}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>');var o=0,r=0;function n(c,s){var i=parseInt(t("#export-batch-size").val()),d=t("#export-status").val()||[],p=Math.ceil(o/i);t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"export_order_batch",nonce:wcOrderGenerator.export_nonce,batch_size:i,batch_number:c,total_batches:p,export_all:!0,statuses:d,export_session:s},success:function(d){if(d.success){var p=(c+1)*i;!function(n,c,s){if(!o||o<=0)e("Exporting number of order not found!","info");else{var i=Math.min(n/o*100,100);t(".export-progress-bar").css({width:i+"%","background-color":"blue",height:"25px",transition:"width 0.5s ease-in-out"}),t("#export-total-processed").text(n),t("#export-success-count").text(c),t("#export-failed-count").text(s);var d=Date.now(),p=r?d-r:0;t("#export-elapsed-time").text(p>0?a(p):"0s");var u=p>0?n/(p/1e3):0,l=o-n,f=u>0?l/u:0;t("#export-time-remaining").text(f>0?a(1e3*f):"0s")}}(Math.min(p,o),d.data.success,d.data.failed),d.data.is_last_batch?(t("#start-order-export").prop("disabled",!1),t("#export-order-status").hide(),window.location.href=d.data.download_url):n(c+1,s)}else e("Export batch failed!"+d.data,"error")}})}function a(t){var e=Math.floor(t/1e3),o=Math.floor(e/60),r=Math.floor(o/60);return"".concat(r,"h ").concat(o%60,"m ").concat(e%60,"s")}t("#export-all").prop("checked",!0),t("#order-export-form").on("submit",(function(a){a.preventDefault();var c=parseInt(t("#export-batch-size").val()),s=t("#export-status").val()||[];t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"start_order_export",nonce:wcOrderGenerator.export_nonce,batch_size:c,export_all:!0,statuses:s},success:function(a){a.success?(o=a.data.total_orders,r=Date.now(),t("#start-order-export").prop("disabled",!0),t("#export-order-status").text("Exporting start").removeClass().addClass("notice notice-success").show(),n(0,a.data.export_session)):(e("Export initialization failed: "+a.data,"error"),t("#export-order-status").hide())}})})),t("#reset-order-export").on("click",(function(){t(".export-progress-bar").css("width","0%"),t("#export-total-processed, #export-success-count, #export-failed-count").text("0"),t("#export-elapsed-time").text("0s"),t("#export-time-remaining").text("--"),t("#start-order-export").prop("disabled",!1)}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>');var o,r=!1,n=0,a=0,c=0;function s(p,u){var l=parseInt(t("#product-export-batch-size").val()),f=t("#product-type").val()||[],v=t("#product-category").val()||[],m=t("#product-tag").val()||[],x=Math.ceil(n/l);clearTimeout(o),o=setTimeout((function(){r&&function(t,e){i(t,e,"Export operation timed out")}(p,u)}),6e4),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"export_product_batch",nonce:wcOrderGenerator.export_products_nonce,batch_size:l,batch_number:p,total_batches:x,product_types:f,categories:v,tags:m,export_session:u},success:function(f){if(clearTimeout(o),f.success){c=0;var v=(p+1)*l;!function(o,r,c){if(!n||n<=0)e("Number of products to export not found!","info");else{var s=Math.min(o/n*100,100);t(".product-export-progress-bar").css({width:s+"%","background-color":"green",height:"25px",transition:"width 0.5s ease-in-out"}),t("#product-export-total-processed").text(o),t("#product-export-success-count").text(r),t("#product-export-failed-count").text(c);var i=Date.now(),p=a?i-a:0;t("#product-export-elapsed-time").text(p>0?d(p):"0s");var u=p>0?o/(p/1e3):0,l=n-o,f=u>0?l/u:0;t("#product-export-time-remaining").text(f>0?d(1e3*f):"0s")}}(Math.min(v,n),f.data.success,f.data.failed),f.data.is_last_batch?(r=!1,t("#start-product-export").prop("disabled",!1),t(".product-export-progress-bar").css("width","100%"),e("Export completed successfully!","success"),f.data.download_url?window.location.href=f.data.download_url:e("Download URL not available","error")):s(p+1,u)}else i(p,u,"Product export batch failed: "+f.data)},error:function(){clearTimeout(o),i(p,u,"Connection error during export")}})}function i(o,n,a){++c<3?(e("".concat(a,". Retrying... (Attempt ").concat(c,"/").concat(3,")"),"warning"),setTimeout((function(){s(o,n)}),2e3)):(e("Export failed after ".concat(3," attempts. Please try again."),"error"),r=!1,t("#start-product-export").prop("disabled",!1))}function d(t){var e=Math.floor(t/1e3)%60,o=Math.floor(t/6e4)%60,r=Math.floor(t/36e5);return r>0?"".concat(r,"h ").concat(o,"m ").concat(e,"s"):o>0?"".concat(o,"m ").concat(e,"s"):"".concat(e,"s")}t("#product-export-form").on("submit",(function(i){i.preventDefault();var d=parseInt(t("#product-export-batch-size").val()),p=t("#product-type").val()||[],u=t("#product-category").val()||[],l=t("#product-tag").val()||[];c=0,clearTimeout(o),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"start_product_export",nonce:wcOrderGenerator.export_products_nonce,batch_size:d,product_types:p,categories:u,tags:l},success:function(o){o.success?(r=!0,n=o.data.total_products,a=Date.now(),e("Starting export of ".concat(n," products"),"info"),t("#start-product-export").prop("disabled",!0),t("#product-export-total-processed").text("0"),t("#product-export-success-count").text("0"),t("#product-export-failed-count").text("0"),t("#product-export-elapsed-time").text("0s"),t("#product-export-time-remaining").text("--"),t(".product-export-progress-bar").css("width","0%"),s(0,o.data.export_session)):e("Product export initialization failed: "+o.data,"error")},error:function(){e("Connection error when starting export","error"),t("#start-product-export").prop("disabled",!1)}})})),t("#reset-product-export").on("click",(function(){clearTimeout(o),r=!1,c=0,t(".product-export-progress-bar").css("width","0%"),t("#product-export-total-processed, #product-export-success-count, #product-export-failed-count").text("0"),t("#product-export-elapsed-time").text("0s"),t("#product-export-time-remaining").text("--"),t("#start-product-export").prop("disabled",!1)}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>'),t("#order-import-form").on("submit",(function(o){o.preventDefault();var r=t("#order-import-form .file-upload-input")[0].files[0];if(!r)return e("Please select a CSV file","warning"),o.preventDefault(),!1;var n=r.name.toLowerCase().endsWith(".csv");if(!["text/csv","application/vnd.ms-excel"].includes(r.type)||!n)return e("Invalid file type. Please upload a .csv file","error"),o.preventDefault(),!1;if(r.size>52428800)return e("File size exceeds 50MB limit","warning"),o.preventDefault(),!1;var a=new FormData(this);a.append("action","import_orders"),a.append("nonce",wcOrderGenerator.import_nonce),a.append("current_batch",0),a.append("skipped",0),a.append("successful",0);var c=Date.now(),s=0,i=0,d=0;!function o(r){t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:r,processData:!1,contentType:!1,success:function(n){if(n.success){var a=Date.now(),p=Math.floor((a-c)/1e3);s=n.data.total_orders,i=n.data.successful,d=n.data.skipped,t("#import-total-processed").text(i+d),t("#import-success-count").text(i),t("#import-failed-count").text(n.data.failed),t("#import-skipped-count").text(d),t("#import-elapsed-time").text(p+"s");var u=Math.floor((i+d)/s*100);if(t(".import-progress-bar").css({width:u+"%","background-color":"blue",height:"25px",transition:"width 0.5s ease-in-out"}),n.data.is_complete)return e("Order Import complete!","success"),void t(".import-progress-bar").css("background-color","green");var l=new FormData;l.append("action","import_orders"),l.append("nonce",wcOrderGenerator.import_nonce),l.append("current_batch",n.data.current_batch+1),l.append("csv_file",r.get("csv_file")),l.append("batch_size",r.get("batch_size")),l.append("skipped",d),l.append("successful",i),o(l)}else e("Order Import failed!"+n.data,"warning")},error:function(){e("Server error occurred!","error")}})}(a)})),t("#reset-order-import").on("click",(function(){exportIsGenerating=!1,t(".import-progress-bar").css("width","0%"),t("#import-total-processed, #import-success-count, #import-failed-count").text("0"),t("#import-elapsed-time").text("0s"),t("#order-import-form .file-upload-input").val(""),t("#order-import-form .file-upload-preview").html('\n            <div class="upload-placeholder">\n                <i class="upload-icon">📤</i>\n                <span class="upload-text">Drag & Drop or Click to Upload CSV</span>\n            </div>\n        ')})),t("#order-import-form .file-upload-input").on("change",(function(){var e=this.files[0],o=t("#order-import-form .file-upload-preview");e?o.html('<div class="upload-file-info"><i class="upload-icon">📄</i> <span class="upload-text">'.concat(e.name,"</span></div>")):o.html('<div class="upload-placeholder"><i class="upload-icon">📤</i><span class="upload-text">Drag & Drop or Click to Upload CSV</span></div>')}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>'),t("#product-import-form").on("submit",(function(o){o.preventDefault();var r=t("#product-import-form .file-upload-input")[0].files[0];if(!r)return e("Please select a CSV file","warning"),!1;var n=r.name.toLowerCase().endsWith(".csv");if(!["text/csv","application/vnd.ms-excel"].includes(r.type)&&!n)return e("Invalid file type. Please upload a .csv file","error"),!1;if(r.size>52428800)return e("File size exceeds 50MB limit","warning"),!1;var a=new FormData(this);a.append("action","import_products"),a.append("nonce",wcOrderGenerator.import_products_nonce),a.append("current_batch",0);var c=Date.now(),s=0,i=0,d=0,p=0;!function o(r){t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:r,processData:!1,contentType:!1,success:function(n){if(n.success){var a=Date.now(),u=Math.floor((a-c)/1e3);s=n.data.total_products,i+=n.data.successful,d+=n.data.failed,p+=n.data.skipped,t("#product-import-total-processed").text(i+d+p),t("#product-import-success-count").text(i),t("#product-import-failed-count").text(d),t("#product-import-skipped-count").text(p),t("#product-import-elapsed-time").text(u+"s");var l=Math.floor((n.data.current_batch*parseInt(r.get("batch_size"))+n.data.processed)/s*100);if(t(".product-import-progress-bar").css({width:l+"%","background-color":"blue",height:"25px",transition:"width 0.5s ease-in-out"}),n.data.is_complete)return e("Product Import complete!","success"),void t(".product-import-progress-bar").css("background-color","green");var f=new FormData;f.append("action","import_products"),f.append("nonce",wcOrderGenerator.import_products_nonce),f.append("current_batch",n.data.current_batch+1),f.append("csv_file",r.get("csv_file")),f.append("batch_size",r.get("batch_size")),setTimeout((function(){o(f)}),300)}else e("Product Import failed: "+(n.data||"Unknown error"),"error")},error:function(t,o,r){e("Server error occurred: "+r,"error")}})}(a)})),t("#reset-product-import").on("click",(function(){t(".product-import-progress-bar").css("width","0%"),t("#product-import-total-processed, #product-import-success-count, #product-import-failed-count, #product-import-skipped-count").text("0"),t("#product-import-elapsed-time").text("0s"),t("#product-import-form .file-upload-input").val(""),t("#product-import-form .file-upload-preview").html('\n            <div class="upload-placeholder">\n                <i class="upload-icon">📤</i>\n                <span class="upload-text">Drag & Drop or Click to Upload CSV</span>\n            </div>\n        ')})),t("#product-import-form .file-upload-input").on("change",(function(){var e=this.files[0],o=t("#product-import-form .file-upload-preview");e?o.html('<div class="upload-file-info"><i class="upload-icon">📄</i> <span class="upload-text">'.concat(e.name,"</span></div>")):o.html('<div class="upload-placeholder"><i class="upload-icon">📤</i><span class="upload-text">Drag & Drop or Click to Upload CSV</span></div>')}));var o=t("#product-import-form .file-upload-wrapper");o.on("dragover",(function(e){e.preventDefault(),e.stopPropagation(),t(this).addClass("dragover")})),o.on("dragleave",(function(e){e.preventDefault(),e.stopPropagation(),t(this).removeClass("dragover")})),o.on("drop",(function(e){e.preventDefault(),e.stopPropagation(),t(this).removeClass("dragover");var o=e.originalEvent.dataTransfer.files;o.length&&(t("#product-import-form .file-upload-input")[0].files=o,t("#product-import-form .file-upload-input").trigger("change"))}))})),jQuery(document).ready((function(t){var e=3e3;function o(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}function r(e,o){var r=t('\n            <div class="wc-confirm-dialog">\n                <div class="wc-confirm-content">\n                    <h3>Confirm Deletion</h3>\n                    <p>Are you absolutely sure you want to delete ALL '.concat(e,'s? This action cannot be undone!</p>\n                    <div class="wc-confirm-buttons">\n                        <button class="button button-secondary cancel-delete">Cancel</button>\n                        <button class="button button-primary confirm-delete">Confirm Delete</button>\n                    </div>\n                </div>\n            </div>\n        ')).appendTo("body");r.find(".cancel-delete").on("click",(function(){r.remove()})),r.find(".confirm-delete").on("click",(function(){r.remove(),o()}))}function n(r){var c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;t("#delete-".concat(r,"s-btn .poc-spinner")).show(),t("#delete-".concat(r,"s-btn")).prop("disabled",!0),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"poc_get_counts",nonce:wcOrderGenerator.poc_nonce},success:function(e){if(e.success){var n="product"===r?e.data.product_count:e.data.order_count;if(0===n)return o("No ".concat(r,"s found to delete."),"warning"),void i(r);t("#".concat(r,"-total")).text(n);var c='\n                        <div class="info-container" style="display: flex; justify-content: space-between; margin-top: 10px;">\n                            <div style="display: flex; gap: 20px;">\n                                <div class="skip-info">Skipped: <span id="'.concat(r,'-skipped">0</span></div>\n                                <div class="retry-info">Retry: <span id="').concat(r,'-retry-count">0</span></div>\n                            </div>\n                            <div class="count-progress" id="').concat(r,'-count-progress">Progress: 0/').concat(n,"</div>\n                        </div>\n                    ");t("#".concat(r,"-progress-container .info-container")).remove(),t("#".concat(r,"-progress-container")).append(c),t("#".concat(r,"-progress-container")).slideDown(300),o("Starting ".concat(r," deletion process..."),"info"),setTimeout((function(){a(r,0,n,0,0,0)}),500)}else s(r,e.data||"Error getting counts")},error:function(t,o,a){c<3?setTimeout((function(){n(r,c+1)}),e):s(r,"Failed to initialize after ".concat(3," attempts: ").concat(a))}})}function a(r,n,i,d,p,u){t("#".concat(r,"-retry-count")).text(u),u>0&&(d=parseInt(t("#".concat(r,"-skipped")).text())+1,t("#".concat(r,"-skipped")).text(d),o("Retrying batch deletion (Attempt ".concat(u," of ").concat(3,")"),"warning")),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",timeout:3e4,data:{action:"poc_delete_".concat(r,"s_batch"),nonce:wcOrderGenerator.poc_nonce,offset:n},success:function(l){if(l.success){var f=l.data.deleted+l.data.skipped,v=p+f,m=d+(l.data.skipped||0),x=Math.round(v/i*100);t("#delete-order").text("Deleting orders...").removeClass().addClass("notice notice-info").show(),t("#".concat(r,"-progress-bar")).css("width",x+"%"),t("#".concat(r,"-processed")).text(v),t("#".concat(r,"-skipped")).text(m),t("#".concat(r,"-count-progress")).text("Progress: ".concat(v,"/").concat(i)),t("#".concat(r,"-retry-count")).text("0"),l.data.errors&&l.data.errors.length>0&&o("Some ".concat(r,"s could not be deleted"),"warning"),l.data.done?setTimeout((function(){c(r,m,v)}),2e3):setTimeout((function(){a(r,n+f,i,m,v,0)}),1e3)}else u<3?setTimeout((function(){a(r,n,i,d,p,u+1)}),e):s(r,l.data||"Error deleting ".concat(r,"s"))},error:function(t,o,c){u<3?setTimeout((function(){a(r,n,i,d,p,u+1)}),e):s(r,"Failed to process batch after ".concat(3," attempts: ").concat(c))}})}function c(r,a,i){var d=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"poc_get_counts",nonce:wcOrderGenerator.poc_nonce},success:function(e){if(e.success){var c,p="product"===r?e.data.product_count:e.data.order_count;if(t("#delete-".concat(r,"s-btn .poc-spinner")).hide(),0===p||p===a)o(c="Operation completed!\n".concat(a," ").concat(r,"s were skipped\n").concat(i-a," ").concat(r,"s have been successfully deleted!"),"success");else{if(!(p<a)){var u=d+1;return t("#".concat(r,"-retry-count")).text(u),o("Additional ".concat(r,"s found. Continuing deletion process... (Attempt ").concat(u,")"),"info"),void setTimeout((function(){n(r)}),5e3)}o(c="Operation completed!\n".concat(p," ").concat(r,"s remain\n").concat(i-p," ").concat(r,"s have been successfully deleted!"),"success")}var l='\n                        <div class="notice notice-success">\n                            <p>'.concat(c.replace(/\n/g,"<br>"),"</p>\n                        </div>\n                    ");t("#delete-order").after(l)}else s(r,"Error verifying ".concat(r," deletion"))},error:function(t,o,n){d<3?setTimeout((function(){c(r,a,i,d+1)}),e):s(r,"Failed to verify deletion after ".concat(3," attempts: ").concat(n))}})}function s(e,r){t("#delete-".concat(e,"s-btn .poc-spinner")).hide(),t("#delete-".concat(e,"s-btn")).prop("disabled",!1),o(r,"error")}function i(e){t("#".concat(e,"-progress-bar")).css("width","0%"),t("#".concat(e,"-processed")).text("0"),t("#".concat(e,"-total")).text("0"),t("#".concat(e,"-skipped")).text("0"),t("#".concat(e,"-retry-count")).text("0"),t("#".concat(e,"-count-progress")).text("Progress: 0/0"),t("#delete-".concat(e,"s-btn")).prop("disabled",!1),t("#delete-".concat(e,"s-btn .poc-spinner")).hide(),t("#delete-".concat(e)).hide(),o("".concat(e.charAt(0).toUpperCase()+e.slice(1)," progress has been reset successfully!"),"success")}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>'),t("#delete-products-btn").click((function(){r("product",(function(){n("product")}))})),t("#delete-orders-btn").click((function(){r("order",(function(){n("order")}))})),["product","order"].forEach((function(e){t("<button>",{id:"reset-".concat(e,"-progress-btn"),class:"button button-secondary",text:"Reset",css:{float:"right","margin-left":"10px"}}).insertAfter("#".concat(e,"-progress-container"))})),t("#reset-product-progress-btn").on("click",(function(){i("product")})),t("#reset-order-progress-btn").on("click",(function(){i("order")}))}));
     1jQuery(document).ready((function(t){var e=localStorage.getItem("activeTab");e?(t(".nav-tab").removeClass("nav-tab-active"),t(".tab-content").removeClass("active"),t('.nav-tab[href="'.concat(e,'"]')).addClass("nav-tab-active"),t(e).addClass("active")):(t(".nav-tab").first().addClass("nav-tab-active"),t(".tab-content").first().addClass("active")),t(".nav-tab").on("click",(function(e){e.preventDefault(),t(".nav-tab").removeClass("nav-tab-active"),t(this).addClass("nav-tab-active"),t(".tab-content").removeClass("active"),t(t(this).attr("href")).addClass("active"),localStorage.setItem("activeTab",t(this).attr("href"))}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>');var o,r=!1,n=0,a=0,c=0,s=0,i=!1;function d(t){var e=Math.floor(t/1e3),o=Math.floor(e/60),r=Math.floor(o/60);return"".concat(r,"h ").concat(o%60,"m ").concat(e%60,"s")}function p(){var e=a+c,r=e/n*100;t(".progress-bar").css("width",r+"%"),t("#total-processed").text(e),t("#success-count").text(a),t("#failed-count").text(c);var s=e/((Date.now()-o)/1e3);t("#processing-rate").text(s.toFixed(2));var i=(n-e)/s;t("#time-remaining").text(d(1e3*i)),t("#elapsed-time").text(d(Date.now()-o))}function u(){if(!r||i)return l("Order Generation stopped","warning"),void e("Order Generation stopped","warning");var o=n-(a+c);if(o<=0)return l("Order Generation complete!","success"),void e("Order Generation complete!","success");var d=Math.min(t("#batch_size").val(),o);t("#generation-status").text("Processing batch ".concat(s+1,"...")).removeClass().addClass("notice notice-info").show(),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"process_order_batch",nonce:wcOrderGenerator.nonce,batch_size:d,batch_number:s},success:function(t){t.success?(a+=t.data.success,c+=t.data.failed,s++,p(),i?(l("Generation stopped","warning"),e("Order Generation stopped","warning")):setTimeout(u,500)):(f("Error processing batch: "+t.data),e("Eror processing batch","error"))},error:function(t,o,r){i?(l("Generation stopped","warning"),e("Order Generation stopped","warning")):(f("Server error occurred: "+r),e("Server error occurred","error"))}})}function l(e,o){t("#generation-status").text(e).removeClass().addClass("notice notice-".concat(o)).show(),r=!1,i=!1,t("#start-generation").prop("disabled",!1),t("#stop-generation").prop("disabled",!0),t("#reset-generation").show()}function f(e){c+=0,p(),t("#time-remaining").text(d(c)),l(e,"error")}t("#order-generator-form").on("submit",(function(e){e.preventDefault();var d=parseInt(t("#num_orders").val());if(d<1||d>1e4)alert("Please enter a number between 1 and 10k");else{var p=parseInt(t("#batch_size").val());p<5||p>30?alert("Please enter a batch number between 5 and 30"):(r=!0,i=!1,n=d,a=0,c=0,s=0,o=Date.now(),t("#start-generation").prop("disabled",!0),t("#stop-generation").prop("disabled",!1),t("#reset-generation").hide(),t("#generation-status").text("Starting generation...").removeClass().addClass("notice notice-info").show(),t(".progress-bar").css("width","0%"),u())}})),t("#stop-generation").on("click",(function(){r&&(i=!0,t(this).prop("disabled",!0),t("#generation-status").text("Stopping generation...").removeClass().addClass("notice notice-warning").show(),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"stop_order_generation",nonce:wcOrderGenerator.nonce}}).fail((function(t,e,o){})))})),t("#reset-generation").on("click",(function(){r=!1,i=!1,n=0,a=0,c=0,s=0,t(".progress-bar").css("width","0%"),t("#total-processed").text("0"),t("#success-count").text("0"),t("#failed-count").text("0"),t("#processing-rate").text("0"),t("#elapsed-time").text("0s"),t("#time-remaining").text("--"),t("#num_orders").val("100"),t("#start-generation").prop("disabled",!1),t("#stop-generation").prop("disabled",!0),t("#reset-generation").hide(),t("#generation-status").hide()}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>');var o=!1,r=0,n=0,a=0,c=0;function s(){var e=(n+a)/r*100;t(".product-progress-bar").css("width",e+"%"),t("#products-processed").text(n),t("#products-failed").text(a)}function i(){if(!o)return t("#product-generation-status").text("Generation stopped").removeClass().addClass("notice notice-warning").show(),setTimeout((function(){t("#product-generation-status").fadeOut()}),3e3),t("#start-product-generation").prop("disabled",!1),t("#stop-product-generation").prop("disabled",!0),t("#reset-product-generation").show(),void e("Product Generation stopped","warning");var p=r-(n+a);if(p<=0)return t("#product-generation-status").text("Product generation complete!").removeClass().addClass("notice notice-success").show(),setTimeout((function(){t("#product-generation-status").fadeOut()}),5e3),t("#start-product-generation").prop("disabled",!1),t("#stop-product-generation").prop("disabled",!0),t("#reset-product-generation").show(),void e("Product Generation complete!","success");var u=Math.min(t("#product_batch_size").val(),p);t("#product-generation-status").text("Processing product batch ".concat(c+1,"...")).removeClass().addClass("notice notice-info").show(),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"process_product_batch",nonce:wcOrderGenerator.products_nonce,batch_size:u,price_min:t("#price_min").val(),price_max:t("#price_max").val(),batch_number:c,product_types:window.selectedProductTypes,use_random_images:t("#use_random_images").is(":checked")?1:0},success:function(t){t.success?(n+=t.data.success,a+=t.data.failed,c++,s(),setTimeout(i,500)):d("Error processing product batch: "+t.data)},error:function(){d("Server error occurred during product generation")}})}function d(e){a+=parseInt(t("#product_batch_size").val()),s(),t("#product-generation-status").text(e).removeClass().addClass("notice notice-error").show(),o=!1,t("#start-product-generation").prop("disabled",!1),t("#stop-product-generation").prop("disabled",!0),t("#reset-product-generation").show()}t("#product-generator-form").on("submit",(function(e){e.preventDefault();var s=parseInt(t("#num_products").val());if(s<1||s>1e4)alert("Please enter a number between 1 and 10k");else{var d=parseInt(t("#product_batch_size").val());if(d<5||d>30)alert("Please enter a batch number between 5 and 30");else{var p=[];t('#product-generator-form input[name="product_types[]"]:checked').each((function(){p.push(t(this).val())})),0!==p.length?(o=!0,r=s,n=0,a=0,c=0,Date.now(),t("#start-product-generation").prop("disabled",!0),t("#stop-product-generation").prop("disabled",!1),t("#reset-product-generation").hide(),t("#product-generation-status").text("Starting product generation...").removeClass().addClass("notice notice-info").show(),t(".product-progress-bar").css("width","0%"),window.selectedProductTypes=p,i()):alert("Please select at least one product type.")}}})),t("#stop-product-generation").on("click",(function(){o=!1,t(this).prop("disabled",!0),t("#product-generation-status").text("Stopping product generation...").removeClass().addClass("notice notice-warning").show()})),t("#reset-product-generation").on("click",(function(){o=!1,r=0,n=0,a=0,c=0,t(".product-progress-bar").css("width","0%"),t("#products-processed").text("0"),t("#products-failed").text("0"),t("#start-product-generation").prop("disabled",!1),t("#stop-product-generation").prop("disabled",!0),t("#reset-product-generation").hide(),t("#product-generation-status").hide()}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>');var o=0,r=0;function n(c,s){var i=parseInt(t("#export-batch-size").val()),d=t("#export-status").val()||[],p=Math.ceil(o/i);t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"export_order_batch",nonce:wcOrderGenerator.export_nonce,batch_size:i,batch_number:c,total_batches:p,export_all:!0,statuses:d,export_session:s},success:function(d){if(d.success){var p=(c+1)*i;!function(n,c,s){if(!o||o<=0)e("Exporting number of order not found!","info");else{var i=Math.min(n/o*100,100);t(".export-progress-bar").css({width:i+"%","background-color":"blue",height:"25px",transition:"width 0.5s ease-in-out"}),t("#export-total-processed").text(n),t("#export-success-count").text(c),t("#export-failed-count").text(s);var d=Date.now(),p=r?d-r:0;t("#export-elapsed-time").text(p>0?a(p):"0s");var u=p>0?n/(p/1e3):0,l=o-n,f=u>0?l/u:0;t("#export-time-remaining").text(f>0?a(1e3*f):"0s")}}(Math.min(p,o),d.data.success,d.data.failed),d.data.is_last_batch?(t("#start-order-export").prop("disabled",!1),t("#export-order-status").hide(),window.location.href=d.data.download_url):n(c+1,s)}else e("Export batch failed!"+d.data,"error")}})}function a(t){var e=Math.floor(t/1e3),o=Math.floor(e/60),r=Math.floor(o/60);return"".concat(r,"h ").concat(o%60,"m ").concat(e%60,"s")}t("#export-all").prop("checked",!0),t("#order-export-form").on("submit",(function(a){a.preventDefault();var c=parseInt(t("#export-batch-size").val()),s=t("#export-status").val()||[];t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"start_order_export",nonce:wcOrderGenerator.export_nonce,batch_size:c,export_all:!0,statuses:s},success:function(a){a.success?(o=a.data.total_orders,r=Date.now(),t("#start-order-export").prop("disabled",!0),t("#export-order-status").text("Exporting start").removeClass().addClass("notice notice-success").show(),n(0,a.data.export_session)):(e("Export initialization failed: "+a.data,"error"),t("#export-order-status").hide())}})})),t("#reset-order-export").on("click",(function(){t(".export-progress-bar").css("width","0%"),t("#export-total-processed, #export-success-count, #export-failed-count").text("0"),t("#export-elapsed-time").text("0s"),t("#export-time-remaining").text("--"),t("#start-order-export").prop("disabled",!1)}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>');var o,r=!1,n=0,a=0,c=0;function s(p,u){var l=parseInt(t("#product-export-batch-size").val()),f=t("#product-type").val()||[],m=t("#product-category").val()||[],v=t("#product-tag").val()||[],x=Math.ceil(n/l);clearTimeout(o),o=setTimeout((function(){r&&function(t,e){i(t,e,"Export operation timed out")}(p,u)}),6e4),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"export_product_batch",nonce:wcOrderGenerator.export_products_nonce,batch_size:l,batch_number:p,total_batches:x,product_types:f,categories:m,tags:v,export_session:u},success:function(f){if(clearTimeout(o),f.success){c=0;var m=(p+1)*l;!function(o,r,c){if(!n||n<=0)e("Number of products to export not found!","info");else{var s=Math.min(o/n*100,100);t(".product-export-progress-bar").css({width:s+"%","background-color":"green",height:"25px",transition:"width 0.5s ease-in-out"}),t("#product-export-total-processed").text(o),t("#product-export-success-count").text(r),t("#product-export-failed-count").text(c);var i=Date.now(),p=a?i-a:0;t("#product-export-elapsed-time").text(p>0?d(p):"0s");var u=p>0?o/(p/1e3):0,l=n-o,f=u>0?l/u:0;t("#product-export-time-remaining").text(f>0?d(1e3*f):"0s")}}(Math.min(m,n),f.data.success,f.data.failed),f.data.is_last_batch?(r=!1,t("#start-product-export").prop("disabled",!1),t(".product-export-progress-bar").css("width","100%"),e("Export completed successfully!","success"),f.data.download_url?window.location.href=f.data.download_url:e("Download URL not available","error")):s(p+1,u)}else i(p,u,"Product export batch failed: "+f.data)},error:function(){clearTimeout(o),i(p,u,"Connection error during export")}})}function i(o,n,a){++c<3?(e("".concat(a,". Retrying... (Attempt ").concat(c,"/").concat(3,")"),"warning"),setTimeout((function(){s(o,n)}),2e3)):(e("Export failed after ".concat(3," attempts. Please try again."),"error"),r=!1,t("#start-product-export").prop("disabled",!1))}function d(t){var e=Math.floor(t/1e3)%60,o=Math.floor(t/6e4)%60,r=Math.floor(t/36e5);return r>0?"".concat(r,"h ").concat(o,"m ").concat(e,"s"):o>0?"".concat(o,"m ").concat(e,"s"):"".concat(e,"s")}t("#product-export-form").on("submit",(function(i){i.preventDefault();var d=parseInt(t("#product-export-batch-size").val()),p=t("#product-type").val()||[],u=t("#product-category").val()||[],l=t("#product-tag").val()||[];c=0,clearTimeout(o),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"start_product_export",nonce:wcOrderGenerator.export_products_nonce,batch_size:d,product_types:p,categories:u,tags:l},success:function(o){o.success?(r=!0,n=o.data.total_products,a=Date.now(),e("Starting export of ".concat(n," products"),"info"),t("#start-product-export").prop("disabled",!0),t("#product-export-total-processed").text("0"),t("#product-export-success-count").text("0"),t("#product-export-failed-count").text("0"),t("#product-export-elapsed-time").text("0s"),t("#product-export-time-remaining").text("--"),t(".product-export-progress-bar").css("width","0%"),s(0,o.data.export_session)):e("Product export initialization failed: "+o.data,"error")},error:function(){e("Connection error when starting export","error"),t("#start-product-export").prop("disabled",!1)}})})),t("#reset-product-export").on("click",(function(){clearTimeout(o),r=!1,c=0,t(".product-export-progress-bar").css("width","0%"),t("#product-export-total-processed, #product-export-success-count, #product-export-failed-count").text("0"),t("#product-export-elapsed-time").text("0s"),t("#product-export-time-remaining").text("--"),t("#start-product-export").prop("disabled",!1)}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>'),t("#order-import-form").on("submit",(function(o){o.preventDefault();var r=t("#order-import-form .file-upload-input")[0].files[0];if(!r)return e("Please select a CSV file","warning"),o.preventDefault(),!1;var n=r.name.toLowerCase().endsWith(".csv");if(!["text/csv","application/vnd.ms-excel"].includes(r.type)||!n)return e("Invalid file type. Please upload a .csv file","error"),o.preventDefault(),!1;if(r.size>52428800)return e("File size exceeds 50MB limit","warning"),o.preventDefault(),!1;var a=new FormData(this);a.append("action","import_orders"),a.append("nonce",wcOrderGenerator.import_nonce),a.append("current_batch",0),a.append("skipped",0),a.append("successful",0);var c=Date.now(),s=0,i=0,d=0;!function o(r){t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:r,processData:!1,contentType:!1,success:function(n){if(n.success){var a=Date.now(),p=Math.floor((a-c)/1e3);s=n.data.total_orders,i=n.data.successful,d=n.data.skipped,t("#import-total-processed").text(i+d),t("#import-success-count").text(i),t("#import-failed-count").text(n.data.failed),t("#import-skipped-count").text(d),t("#import-elapsed-time").text(p+"s");var u=Math.floor((i+d)/s*100);if(t(".import-progress-bar").css({width:u+"%","background-color":"blue",height:"25px",transition:"width 0.5s ease-in-out"}),n.data.is_complete)return e("Order Import complete!","success"),void t(".import-progress-bar").css("background-color","green");var l=new FormData;l.append("action","import_orders"),l.append("nonce",wcOrderGenerator.import_nonce),l.append("current_batch",n.data.current_batch+1),l.append("csv_file",r.get("csv_file")),l.append("batch_size",r.get("batch_size")),l.append("skipped",d),l.append("successful",i),o(l)}else e("Order Import failed!"+n.data,"warning")},error:function(){e("Server error occurred!","error")}})}(a)})),t("#reset-order-import").on("click",(function(){exportIsGenerating=!1,t(".import-progress-bar").css("width","0%"),t("#import-total-processed, #import-success-count, #import-failed-count").text("0"),t("#import-elapsed-time").text("0s"),t("#order-import-form .file-upload-input").val(""),t("#order-import-form .file-upload-preview").html('\n            <div class="upload-placeholder">\n                <i class="upload-icon">📤</i>\n                <span class="upload-text">Drag & Drop or Click to Upload CSV</span>\n            </div>\n        ')})),t("#order-import-form .file-upload-input").on("change",(function(){var e=this.files[0],o=t("#order-import-form .file-upload-preview");e?o.html('<div class="upload-file-info"><i class="upload-icon">📄</i> <span class="upload-text">'.concat(e.name,"</span></div>")):o.html('<div class="upload-placeholder"><i class="upload-icon">📤</i><span class="upload-text">Drag & Drop or Click to Upload CSV</span></div>')}))})),jQuery(document).ready((function(t){function e(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>'),t("#product-import-form").on("submit",(function(o){o.preventDefault();var r=t("#product-import-form .file-upload-input")[0].files[0];if(!r)return e("Please select a CSV file","warning"),!1;var n=r.name.toLowerCase().endsWith(".csv");if(!["text/csv","application/vnd.ms-excel"].includes(r.type)&&!n)return e("Invalid file type. Please upload a .csv file","error"),!1;if(r.size>52428800)return e("File size exceeds 50MB limit","warning"),!1;var a=new FormData(this);a.append("action","import_products"),a.append("nonce",wcOrderGenerator.import_products_nonce),a.append("current_batch",0);var c=Date.now(),s=0,i=0,d=0,p=0;!function o(r){t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:r,processData:!1,contentType:!1,success:function(n){if(n.success){var a=Date.now(),u=Math.floor((a-c)/1e3);s=n.data.total_products,i+=n.data.successful,d+=n.data.failed,p+=n.data.skipped,t("#product-import-total-processed").text(i+d+p),t("#product-import-success-count").text(i),t("#product-import-failed-count").text(d),t("#product-import-skipped-count").text(p),t("#product-import-elapsed-time").text(u+"s");var l=Math.floor((n.data.current_batch*parseInt(r.get("batch_size"))+n.data.processed)/s*100);if(t(".product-import-progress-bar").css({width:l+"%","background-color":"blue",height:"25px",transition:"width 0.5s ease-in-out"}),n.data.is_complete)return e("Product Import complete!","success"),void t(".product-import-progress-bar").css("background-color","green");var f=new FormData;f.append("action","import_products"),f.append("nonce",wcOrderGenerator.import_products_nonce),f.append("current_batch",n.data.current_batch+1),f.append("csv_file",r.get("csv_file")),f.append("batch_size",r.get("batch_size")),setTimeout((function(){o(f)}),300)}else e("Product Import failed: "+(n.data||"Unknown error"),"error")},error:function(t,o,r){e("Server error occurred: "+r,"error")}})}(a)})),t("#reset-product-import").on("click",(function(){t(".product-import-progress-bar").css("width","0%"),t("#product-import-total-processed, #product-import-success-count, #product-import-failed-count, #product-import-skipped-count").text("0"),t("#product-import-elapsed-time").text("0s"),t("#product-import-form .file-upload-input").val(""),t("#product-import-form .file-upload-preview").html('\n            <div class="upload-placeholder">\n                <i class="upload-icon">📤</i>\n                <span class="upload-text">Drag & Drop or Click to Upload CSV</span>\n            </div>\n        ')})),t("#product-import-form .file-upload-input").on("change",(function(){var e=this.files[0],o=t("#product-import-form .file-upload-preview");e?o.html('<div class="upload-file-info"><i class="upload-icon">📄</i> <span class="upload-text">'.concat(e.name,"</span></div>")):o.html('<div class="upload-placeholder"><i class="upload-icon">📤</i><span class="upload-text">Drag & Drop or Click to Upload CSV</span></div>')}));var o=t("#product-import-form .file-upload-wrapper");o.on("dragover",(function(e){e.preventDefault(),e.stopPropagation(),t(this).addClass("dragover")})),o.on("dragleave",(function(e){e.preventDefault(),e.stopPropagation(),t(this).removeClass("dragover")})),o.on("drop",(function(e){e.preventDefault(),e.stopPropagation(),t(this).removeClass("dragover");var o=e.originalEvent.dataTransfer.files;o.length&&(t("#product-import-form .file-upload-input")[0].files=o,t("#product-import-form .file-upload-input").trigger("change"))}))})),jQuery(document).ready((function(t){var e=3e3;function o(e){var o=t('\n            <div class="wc-toast '.concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"success",'">\n                ').concat(e,"\n            </div>\n        "));t("#toast-container").append(o),setTimeout((function(){return o.css("opacity","1")}),10),setTimeout((function(){o.css("opacity","0"),setTimeout((function(){return o.remove()}),300)}),3e3)}function r(e,o){var r=t('\n            <div class="wc-confirm-dialog">\n                <div class="wc-confirm-content">\n                    <h3>Confirm Deletion</h3>\n                    <p>Are you absolutely sure you want to delete ALL '.concat(e,'s? This action cannot be undone!</p>\n                    <div class="wc-confirm-buttons">\n                        <button class="button button-secondary cancel-delete">Cancel</button>\n                        <button class="button button-primary confirm-delete">Confirm Delete</button>\n                    </div>\n                </div>\n            </div>\n        ')).appendTo("body");r.find(".cancel-delete").on("click",(function(){r.remove()})),r.find(".confirm-delete").on("click",(function(){r.remove(),o()}))}function n(r){var c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;t("#delete-".concat(r,"s-btn .poc-spinner")).show(),t("#delete-".concat(r,"s-btn")).prop("disabled",!0),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"poc_get_counts",nonce:wcOrderGenerator.poc_nonce},success:function(e){if(e.success){var n="product"===r?e.data.product_count:e.data.order_count;if(0===n)return o("No ".concat(r,"s found to delete."),"warning"),void i(r);t("#".concat(r,"-total")).text(n);var c='\n                        <div class="info-container" style="display: flex; justify-content: space-between; margin-top: 10px;">\n                            <div style="display: flex; gap: 20px;">\n                                <div class="skip-info">Skipped: <span id="'.concat(r,'-skipped">0</span></div>\n                                <div class="retry-info">Retry: <span id="').concat(r,'-retry-count">0</span></div>\n                            </div>\n                            <div class="count-progress" id="').concat(r,'-count-progress">Progress: 0/').concat(n,"</div>\n                        </div>\n                    ");t("#".concat(r,"-progress-container .info-container")).remove(),t("#".concat(r,"-progress-container")).append(c),t("#".concat(r,"-progress-container")).slideDown(300),o("Starting ".concat(r," deletion process..."),"info"),setTimeout((function(){a(r,0,n,0,0,0)}),500)}else s(r,e.data||"Error getting counts")},error:function(t,o,a){c<3?setTimeout((function(){n(r,c+1)}),e):s(r,"Failed to initialize after ".concat(3," attempts: ").concat(a))}})}function a(r,n,i,d,p,u){t("#".concat(r,"-retry-count")).text(u),u>0&&(d=parseInt(t("#".concat(r,"-skipped")).text())+1,t("#".concat(r,"-skipped")).text(d),o("Retrying batch deletion (Attempt ".concat(u," of ").concat(3,")"),"warning")),t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",timeout:3e4,data:{action:"poc_delete_".concat(r,"s_batch"),nonce:wcOrderGenerator.poc_nonce,offset:n},success:function(l){if(l.success){var f=l.data.deleted+l.data.skipped,m=p+f,v=d+(l.data.skipped||0),x=Math.round(m/i*100);t("#delete-order").text("Deleting orders...").removeClass().addClass("notice notice-info").show(),t("#".concat(r,"-progress-bar")).css("width",x+"%"),t("#".concat(r,"-processed")).text(m),t("#".concat(r,"-skipped")).text(v),t("#".concat(r,"-count-progress")).text("Progress: ".concat(m,"/").concat(i)),t("#".concat(r,"-retry-count")).text("0"),l.data.errors&&l.data.errors.length>0&&o("Some ".concat(r,"s could not be deleted"),"warning"),l.data.done?setTimeout((function(){c(r,v,m)}),2e3):setTimeout((function(){a(r,n+f,i,v,m,0)}),1e3)}else u<3?setTimeout((function(){a(r,n,i,d,p,u+1)}),e):s(r,l.data||"Error deleting ".concat(r,"s"))},error:function(t,o,c){u<3?setTimeout((function(){a(r,n,i,d,p,u+1)}),e):s(r,"Failed to process batch after ".concat(3," attempts: ").concat(c))}})}function c(r,a,i){var d=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;t.ajax({url:wcOrderGenerator.ajaxurl,type:"POST",data:{action:"poc_get_counts",nonce:wcOrderGenerator.poc_nonce},success:function(e){if(e.success){var c,p="product"===r?e.data.product_count:e.data.order_count;if(t("#delete-".concat(r,"s-btn .poc-spinner")).hide(),0===p||p===a)o(c="Operation completed!\n".concat(a," ").concat(r,"s were skipped\n").concat(i-a," ").concat(r,"s have been successfully deleted!"),"success");else{if(!(p<a)){var u=d+1;return t("#".concat(r,"-retry-count")).text(u),o("Additional ".concat(r,"s found. Continuing deletion process... (Attempt ").concat(u,")"),"info"),void setTimeout((function(){n(r)}),5e3)}o(c="Operation completed!\n".concat(p," ").concat(r,"s remain\n").concat(i-p," ").concat(r,"s have been successfully deleted!"),"success")}var l='\n                        <div class="notice notice-success">\n                            <p>'.concat(c.replace(/\n/g,"<br>"),"</p>\n                        </div>\n                    ");t("#delete-order").after(l)}else s(r,"Error verifying ".concat(r," deletion"))},error:function(t,o,n){d<3?setTimeout((function(){c(r,a,i,d+1)}),e):s(r,"Failed to verify deletion after ".concat(3," attempts: ").concat(n))}})}function s(e,r){t("#delete-".concat(e,"s-btn .poc-spinner")).hide(),t("#delete-".concat(e,"s-btn")).prop("disabled",!1),o(r,"error")}function i(e){t("#".concat(e,"-progress-bar")).css("width","0%"),t("#".concat(e,"-processed")).text("0"),t("#".concat(e,"-total")).text("0"),t("#".concat(e,"-skipped")).text("0"),t("#".concat(e,"-retry-count")).text("0"),t("#".concat(e,"-count-progress")).text("Progress: 0/0"),t("#delete-".concat(e,"s-btn")).prop("disabled",!1),t("#delete-".concat(e,"s-btn .poc-spinner")).hide(),t("#delete-".concat(e)).hide(),o("".concat(e.charAt(0).toUpperCase()+e.slice(1)," progress has been reset successfully!"),"success")}t("#toast-container").length||t("body").append('<div id="toast-container" style="position: fixed; top: 40px; right: 20px; z-index: 10000;"></div>'),t("#delete-products-btn").click((function(){r("product",(function(){n("product")}))})),t("#delete-orders-btn").click((function(){r("order",(function(){n("order")}))})),["product","order"].forEach((function(e){t("<button>",{id:"reset-".concat(e,"-progress-btn"),class:"button button-secondary",text:"Reset",css:{float:"right","margin-left":"10px"}}).insertAfter("#".concat(e,"-progress-container"))})),t("#reset-product-progress-btn").on("click",(function(){i("product")})),t("#reset-order-progress-btn").on("click",(function(){i("order")}))}));
  • wc-bulk-order-generator/trunk/includes/class-bulk-product-Import.php

    r3315024 r3461881  
    11<?php
     2/**
     3 * WC Bulk Product Generator
     4 *
     5 * @package WcBulkOrderGenerator
     6 */
     7
     8namespace WcBulkOrderGenerator;
    29
    310if (!defined('ABSPATH')) {
     
    9097                switch ($product_type) {
    9198                    case 'variable':
    92                         $product = new WC_Product_Variable();
     99                        $product = new \WC_Product_Variable();
    93100                        break;
    94101                    case 'grouped':
    95                         $product = new WC_Product_Grouped();
     102                        $product = new \WC_Product_Grouped();
    96103                        break;
    97104                    case 'external':
    98105                    case 'affiliate':
    99                         $product = new WC_Product_External();
     106                        $product = new \WC_Product_External();
    100107                        break;
    101108                    default:
    102                         $product = new WC_Product_Simple();
     109                        $product = new \WC_Product_Simple();
    103110                }
    104111               
     
    317324                            $taxonomy = sanitize_title($attr_name);
    318325                            $options = isset($attr_values[$i]) ? explode('|', $attr_values[$i]) : [];
    319                             $attribute = new WC_Product_Attribute();
     326                            $attribute = new \WC_Product_Attribute();
    320327                            $attribute->set_name($taxonomy);
    321328                            $attribute->set_options($options);
     
    348355                $successful++;
    349356               
    350             } catch (Exception $e) {
     357            } catch (\Exception $e) {
    351358                error_log('Product import error: ' . $e->getMessage());
    352359                $failed++;
  • wc-bulk-order-generator/trunk/includes/class-bulk-product-export.php

    r3245853 r3461881  
    11<?php
     2/**
     3 * WC Bulk Product Generator
     4 *
     5 * @package WcBulkOrderGenerator
     6 */
     7
     8namespace WcBulkOrderGenerator;
    29
    310if (!defined('ABSPATH')) {
     
    2128        }
    2229   
    23         $product_types = !empty($_POST['product_types']) ? array_map('sanitize_text_field', $_POST['product_types']) : [];
    24         $categories = !empty($_POST['categories']) ? array_map('sanitize_text_field', $_POST['categories']) : [];
    25         $tags = !empty($_POST['tags']) ? array_map('sanitize_text_field', $_POST['tags']) : [];
     30        $product_types = !empty($_POST['product_types']) ? array_map('sanitize_text_field', wp_unslash($_POST['product_types'])) : [];
     31        $categories = !empty($_POST['categories']) ? array_map('sanitize_text_field', wp_unslash($_POST['categories'])) : [];
     32        $tags = !empty($_POST['tags']) ? array_map('sanitize_text_field', wp_unslash($_POST['tags'])) : [];
    2633
    2734        $args = [
     
    8794        }
    8895       
    89         $query = new WP_Query($args);
     96        $query = new \WP_Query($args);
    9097        $total_products = $query->found_posts;
    9198   
     
    112119        $batch_number = intval($_POST['batch_number']);
    113120        $total_batches = intval($_POST['total_batches']);
    114         $export_session = sanitize_text_field($_POST['export_session']);
    115         $product_types = !empty($_POST['product_types']) ? array_map('sanitize_text_field', $_POST['product_types']) : [];
    116         $categories = !empty($_POST['categories']) ? array_map('sanitize_text_field', $_POST['categories']) : [];
    117         $tags = !empty($_POST['tags']) ? array_map('sanitize_text_field', $_POST['tags']) : [];
     121        $export_session = sanitize_text_field(wp_unslash($_POST['export_session']));
     122        $product_types = !empty($_POST['product_types']) ? array_map('sanitize_text_field', wp_unslash($_POST['product_types'])) : [];
     123        $categories = !empty($_POST['categories']) ? array_map('sanitize_text_field', wp_unslash($_POST['categories'])) : [];
     124        $tags = !empty($_POST['tags']) ? array_map('sanitize_text_field', wp_unslash($_POST['tags'])) : [];
    118125   
    119126        $args = [
     
    180187        }
    181188   
    182         $query = new WP_Query($args);
     189        $query = new \WP_Query($args);
    183190        $products = $query->posts;
    184191   
     
    404411               
    405412                $success_count++;
    406             } catch (Exception $e) {
     413            } catch (\Exception $e) {
    407414                $failed_count++;
    408415            }
  • wc-bulk-order-generator/trunk/includes/class-wc-bulk-delete.php

    r3245853 r3461881  
    11<?php
     2/**
     3 * WC Bulk Product Generator
     4 *
     5 * @package WcBulkOrderGenerator
     6 */
     7
     8namespace WcBulkOrderGenerator;
    29
    310if (!defined('ABSPATH')) {
     
    8592                    // error_log('Failed to delete order ID: ' . $order->get_id());
    8693                }
    87             } catch (Exception $e) {
     94            } catch (\Exception $e) {
    8895                $skipped++;
    8996                $errors[] = array(
     
    160167                    );
    161168                }
    162             } catch (Exception $e) {
     169            } catch (\Exception $e) {
    163170                $skipped++;
    164171                $errors[] = array(
  • wc-bulk-order-generator/trunk/includes/class-wc-bulk-order-export.php

    r3315024 r3461881  
    11<?php
     2/**
     3 * WC Bulk Order Export
     4 *
     5 * @package WcBulkOrderGenerator
     6 */
     7
     8namespace WcBulkOrderGenerator;
    29
    310if (!defined('ABSPATH')) {
     
    2128        }
    2229   
    23         $export_all = isset($_POST['export_all']) ? filter_var($_POST['export_all'], FILTER_VALIDATE_BOOLEAN) : false;
    24         $date_from = $export_all ? null : sanitize_text_field($_POST['date_from']);
    25         $date_to = $export_all ? null : sanitize_text_field($_POST['date_to']);
    26         $statuses = isset($_POST['statuses']) ? array_map('sanitize_text_field', $_POST['statuses']) : [];
     30        $export_all = isset($_POST['export_all']) ? filter_var(wp_unslash($_POST['export_all']), FILTER_VALIDATE_BOOLEAN) : false;
     31        $date_from = $export_all ? null : sanitize_text_field(wp_unslash($_POST['date_from']));
     32        $date_to = $export_all ? null : sanitize_text_field(wp_unslash($_POST['date_to']));
     33        $statuses = isset($_POST['statuses']) ? array_map('sanitize_text_field', wp_unslash($_POST['statuses'])) : [];
     34
     35       
    2736   
    2837        $args = [
     
    6776        $batch_number = intval($_POST['batch_number']);
    6877        $total_batches = intval($_POST['total_batches']);
    69         $export_session = sanitize_text_field($_POST['export_session']);
    70         $export_all = isset($_POST['export_all']) ? filter_var($_POST['export_all'], FILTER_VALIDATE_BOOLEAN) : false;
    71         $date_from = $export_all ? null : sanitize_text_field($_POST['date_from']);
    72         $date_to = $export_all ? null : sanitize_text_field($_POST['date_to']);
    73         $statuses = isset($_POST['statuses']) ? array_map('sanitize_text_field', $_POST['statuses']) : [];
     78        $export_session = sanitize_text_field(wp_unslash($_POST['export_session']));
     79        $export_all = isset($_POST['export_all']) ? filter_var(wp_unslash($_POST['export_all']), FILTER_VALIDATE_BOOLEAN) : false;
     80        $date_from = $export_all ? null : sanitize_text_field(wp_unslash($_POST['date_from']));
     81        $date_to = $export_all ? null : sanitize_text_field(wp_unslash($_POST['date_to']));
     82        $statuses = isset($_POST['statuses']) ? array_map('sanitize_text_field', wp_unslash($_POST['statuses'])) : [];
    7483   
    7584        $args = [
     
    175184   
    176185                $success_count++;
    177             } catch (Exception $e) {
     186            } catch (\Exception $e) {
    178187                $failed_count++;
    179188            }
     
    203212}
    204213
    205 // Initialize the product generator
    206 new WC_Bulk_Order_Export();
     214// Initialize the order export
     215new \WcBulkOrderGenerator\WC_Bulk_Order_Export();
  • wc-bulk-order-generator/trunk/includes/class-wc-bulk-order-import.php

    r3315024 r3461881  
    11<?php
     2/**
     3 * WC Bulk Product Generator
     4 *
     5 * @package WcBulkOrderGenerator
     6 */
     7
     8namespace WcBulkOrderGenerator;
    29
    310if (!defined('ABSPATH')) {
     
    100107                // Set shipping method if provided
    101108                if (!empty($first_entry['shipping_method'])) {
    102                     $shipping_item = new WC_Order_Item_Shipping();
     109                    $shipping_item = new \WC_Order_Item_Shipping();
    103110                    $shipping_item->set_method_title($first_entry['shipping_method']);
    104111                    $order->add_item($shipping_item);
     
    116123                    if (!$product) {
    117124                        // Create a new product if not found
    118                         $product = new WC_Product();
     125                        $product = new \WC_Product();
    119126                        $product->set_name($product_entry['product_name']);
    120127                        $product->set_price($product_entry['product_price']);
     
    123130   
    124131                    // Create order item
    125                     $item = new WC_Order_Item_Product();
     132                    $item = new \WC_Order_Item_Product();
    126133                    $item->set_product($product);
    127134                    $item->set_quantity($product_entry['quantity']);
     
    139146   
    140147                $successful++;
    141             } catch (Exception $e) {
     148            } catch (\Exception $e) {
    142149                error_log('Order import error: ' . $e->getMessage());
    143150                $failed++;
     
    156163   
    157164        // Process uploaded CSV
    158         if (!isset($_FILES['csv_file'])) {
     165        if (!isset($_FILES['csv_file']) || !isset($_FILES['csv_file']['tmp_name'])) {
    159166            wp_send_json_error('No file uploaded');
    160167        }
    161168   
    162         $file = $_FILES['csv_file']['tmp_name'];
     169        // Sanitize and validate the uploaded file
     170        $file_tmp_name = sanitize_text_field(wp_unslash($_FILES['csv_file']['tmp_name']));
     171       
     172        // Verify it's a valid uploaded file
     173        if (!is_uploaded_file($file_tmp_name)) {
     174            wp_send_json_error('Invalid file upload');
     175        }
     176       
    163177        $batch_size = intval($_POST['batch_size'] ?? 50);
    164178        $current_batch = intval($_POST['current_batch'] ?? 0);
     
    167181        $successful_total = intval($_POST['successful'] ?? 0);
    168182   
    169         $orders = $this->parse_csv($file);
     183        $orders = $this->parse_csv($file_tmp_name);
    170184        $total_orders = count($orders);
    171185   
  • wc-bulk-order-generator/trunk/includes/class-wc-bulk-product-generator.php

    r3315024 r3461881  
    11<?php
     2/**
     3 * WC Bulk Product Generator
     4 *
     5 * @package WcBulkOrderGenerator
     6 */
     7
     8namespace WcBulkOrderGenerator;
    29
    310if (!defined('ABSPATH')) {
     
    6370        $price_min = isset($_POST['price_min']) ? floatval($_POST['price_min']) : 10;
    6471        $price_max = isset($_POST['price_max']) ? floatval($_POST['price_max']) : 100;
    65         $product_types = isset($_POST['product_types']) && is_array($_POST['product_types']) ? array_map('sanitize_text_field', $_POST['product_types']) : array('simple');
     72        $product_types = isset($_POST['product_types']) && is_array($_POST['product_types']) ? array_map('sanitize_text_field', wp_unslash($_POST['product_types'])) : array('simple');
     73        $use_random_images = isset($_POST['use_random_images']) ? absint($_POST['use_random_images']) : 0;
    6674       
    6775        if ($batch_size < 1 || $batch_size > 50) {
     
    8593                    // Verify product data
    8694                    if (empty($product_data['title']) || empty($product_data['description'])) {
    87                         throw new Exception('Invalid product data generated');
     95                        throw new \Exception('Invalid product data generated');
    8896                    }
    8997                   
    90                     $product = $this->create_product($product_data);
     98                    $product = $this->create_product($product_data, $use_random_images);
    9199                   
    92100                    if ($product && !is_wp_error($product) && $product->get_id() > 0) {
     
    102110                    unset($product);
    103111                    wp_cache_flush();
    104                 } catch (Exception $e) {
     112                } catch (\Exception $e) {
    105113                    $failed_count++;
    106114                    $errors[] = $e->getMessage();
     
    118126            ));
    119127
    120         } catch (Exception $e) {
     128        } catch (\Exception $e) {
    121129            wp_send_json_error(array(
    122130                'message' => $e->getMessage(),
     
    177185    }
    178186
    179     private function create_product($data) {
     187    private function create_product($data, $use_random_images = 0) {
    180188        try {
    181189            $type = isset($data['type']) ? $data['type'] : 'simple';
    182190            switch ($type) {
    183191                case 'variable':
    184                     $product = new WC_Product_Variable();
     192                    $product = new \WC_Product_Variable();
    185193                    break;
    186194                case 'grouped':
    187                     $product = new WC_Product_Grouped();
     195                    $product = new \WC_Product_Grouped();
    188196                    break;
    189197                case 'external':
    190198                case 'affiliate':
    191                     $product = new WC_Product_External();
     199                    $product = new \WC_Product_External();
    192200                    break;
    193201                case 'simple':
    194202                default:
    195                     $product = new WC_Product_Simple();
     203                    $product = new \WC_Product_Simple();
    196204                    break;
    197205            }
     
    236244            $product_id = $product->save();
    237245            if (!$product_id) {
    238                 throw new Exception('Failed to save product');
     246                throw new \Exception('Failed to save product');
    239247            }
    240248            // Add categories
     
    243251                wp_set_object_terms($product_id, $category_ids, 'product_cat');
    244252            }
    245             // Add placeholder image
    246             $this->maybe_add_placeholder_image($product_id);
     253            // Add images based on checkbox
     254            if ($use_random_images) {
     255                $this->add_random_images($product_id);
     256            } else {
     257                // Add placeholder image
     258                $this->maybe_add_placeholder_image($product_id);
     259            }
    247260            // Add attributes/variations for variable products
    248261            if ($type === 'variable') {
     
    254267            }
    255268            return wc_get_product($product_id); // Return the updated product object
    256         } catch (Exception $e) {
    257             return new WP_Error('product_creation_failed', $e->getMessage());
     269        } catch (\Exception $e) {
     270            return new \WP_Error('product_creation_failed', $e->getMessage());
    258271        }
    259272    }
     
    283296            set_post_thumbnail($product_id, $placeholder_id);
    284297        }
     298    }
     299
     300    /**
     301     * Add random images from the images folder to product
     302     *
     303     * @param int $product_id The product ID
     304     */
     305    private function add_random_images($product_id) {
     306        // Define the images folder path
     307        $images_folder = WC_BULK_GENERATOR_PLUGIN_DIR . 'images/';
     308       
     309        // Check if images folder exists
     310        if (!is_dir($images_folder)) {
     311            // Fallback to placeholder if folder doesn't exist
     312            $this->maybe_add_placeholder_image($product_id);
     313            return;
     314        }
     315       
     316        // Get all image files from the folder
     317        $allowed_extensions = array('jpg', 'jpeg', 'png', 'gif', 'webp');
     318        $image_files = array();
     319       
     320        if ($handle = opendir($images_folder)) {
     321            while (false !== ($file = readdir($handle))) {
     322                $file_extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
     323                if (in_array($file_extension, $allowed_extensions)) {
     324                    $image_files[] = $images_folder . $file;
     325                }
     326            }
     327            closedir($handle);
     328        }
     329       
     330        // If no images found, use placeholder
     331        if (empty($image_files)) {
     332            $this->maybe_add_placeholder_image($product_id);
     333            return;
     334        }
     335       
     336        // Randomly select 1-4 images
     337        shuffle($image_files);
     338        $num_images = wp_rand(1, min(4, count($image_files)));
     339        $selected_images = array_slice($image_files, 0, $num_images);
     340       
     341        $attachment_ids = array();
     342       
     343        foreach ($selected_images as $index => $image_path) {
     344            // Upload image to WordPress media library
     345            $attachment_id = $this->upload_image_to_media_library($image_path, $product_id);
     346           
     347            if ($attachment_id) {
     348                $attachment_ids[] = $attachment_id;
     349               
     350                // Set the first image as featured image
     351                if ($index === 0) {
     352                    set_post_thumbnail($product_id, $attachment_id);
     353                }
     354            }
     355        }
     356       
     357        // Set gallery images (excluding the featured image)
     358        if (count($attachment_ids) > 1) {
     359            $product = wc_get_product($product_id);
     360            if ($product) {
     361                $gallery_ids = array_slice($attachment_ids, 1);
     362                $product->set_gallery_image_ids($gallery_ids);
     363                $product->save();
     364            }
     365        }
     366    }
     367
     368    /**
     369     * Upload an image to WordPress media library
     370     *
     371     * @param string $image_path Full path to the image file
     372     * @param int $product_id The product ID to attach the image to
     373     * @return int|false Attachment ID on success, false on failure
     374     */
     375    private function upload_image_to_media_library($image_path, $product_id) {
     376        // Check if file exists
     377        if (!file_exists($image_path)) {
     378            return false;
     379        }
     380       
     381        // Get the file name
     382        $filename = basename($image_path);
     383       
     384        // Check if this image already exists in media library
     385        $existing_attachment = get_posts(array(
     386            'post_type' => 'attachment',
     387            'meta_query' => array(
     388                array(
     389                    'key' => '_wp_attached_file',
     390                    'value' => $filename,
     391                    'compare' => 'LIKE'
     392                )
     393            ),
     394            'posts_per_page' => 1,
     395            'fields' => 'ids'
     396        ));
     397       
     398        // If image already exists, reuse it
     399        if (!empty($existing_attachment)) {
     400            return $existing_attachment[0];
     401        }
     402       
     403        // Include required WordPress files
     404        require_once(ABSPATH . 'wp-admin/includes/file.php');
     405        require_once(ABSPATH . 'wp-admin/includes/media.php');
     406        require_once(ABSPATH . 'wp-admin/includes/image.php');
     407       
     408        // Upload the file
     409        $upload = wp_upload_bits($filename, null, file_get_contents($image_path));
     410       
     411        if ($upload['error']) {
     412            return false;
     413        }
     414       
     415        // Prepare attachment data
     416        $file_path = $upload['file'];
     417        $file_type = wp_check_filetype($filename, null);
     418       
     419        $attachment = array(
     420            'post_mime_type' => $file_type['type'],
     421            'post_title' => sanitize_file_name(pathinfo($filename, PATHINFO_FILENAME)),
     422            'post_content' => '',
     423            'post_status' => 'inherit'
     424        );
     425       
     426        // Insert the attachment
     427        $attachment_id = wp_insert_attachment($attachment, $file_path, $product_id);
     428       
     429        if (is_wp_error($attachment_id)) {
     430            return false;
     431        }
     432       
     433        // Generate attachment metadata
     434        $attachment_data = wp_generate_attachment_metadata($attachment_id, $file_path);
     435        wp_update_attachment_metadata($attachment_id, $attachment_data);
     436       
     437        return $attachment_id;
    285438    }
    286439
     
    334487        // Set attributes
    335488        $product->set_attributes(array_map(function($attr) {
    336             $attribute = new WC_Product_Attribute();
     489            $attribute = new \WC_Product_Attribute();
    337490            $attribute->set_name($attr['name']);
    338491            $attribute->set_options(explode(' | ', $attr['value']));
     
    349502        $combinations = $this->cartesian_product($attr_values);
    350503        foreach ($combinations as $combo) {
    351             $variation = new WC_Product_Variation();
     504            $variation = new \WC_Product_Variation();
    352505            $variation->set_parent_id($product_id);
    353506            $variation_attributes = array();
     
    415568
    416569// Initialize the product generator
    417 new WC_Bulk_Product_Generator();
     570new \WcBulkOrderGenerator\WC_Bulk_Product_Generator();
  • wc-bulk-order-generator/trunk/js/generator.js

    r3458624 r3461881  
    351351    function processProductBatch() {
    352352        if (!isGeneratingProducts) {
    353             $('#product-generation-status').text('Generation stopped').removeClass().addClass('notice notice-warning').show();
     353            const statusMsg = 'Generation stopped';
     354            $('#product-generation-status').text(statusMsg).removeClass().addClass('notice notice-warning').show();
     355            // Auto-hide after 3 seconds
     356            setTimeout(function() {
     357                $('#product-generation-status').fadeOut();
     358            }, 3000);
    354359            $('#start-product-generation').prop('disabled', false);
    355360            $('#stop-product-generation').prop('disabled', true);
     
    363368        const remainingProducts = totalProducts - (productSuccessCount + productFailedCount);
    364369        if (remainingProducts <= 0) {
    365             $('#product-generation-status').text('Product generation complete!').removeClass().addClass('notice notice-success').show();
     370            const statusMsg = 'Product generation complete!';
     371            $('#product-generation-status').text(statusMsg).removeClass().addClass('notice notice-success').show();
     372            // Auto-hide after 5 seconds
     373            setTimeout(function() {
     374                $('#product-generation-status').fadeOut();
     375            }, 5000);
    366376            $('#start-product-generation').prop('disabled', false);
    367377            $('#stop-product-generation').prop('disabled', true);
     
    384394                price_max: $('#price_max').val(),
    385395                batch_number: currentProductBatch,
    386                 product_types: window.selectedProductTypes
     396                product_types: window.selectedProductTypes,
     397                use_random_images: $('#use_random_images').is(':checked') ? 1 : 0
    387398            },
    388399           
  • wc-bulk-order-generator/trunk/readme.txt

    r3458624 r3461881  
    1 === WC Bulk Order Generator ===
     1=== Bulk Order & Product Generator, Import Export for WooCommerce ===
    22Contributors: devsabbirahmed
    33Tags: order export, woocommerce, generator, bulk order generator, bulk product generator
    44Requires at least: 5.9
    5 Tested up to: 6.8
     5Tested up to: 6.9
    66Requires PHP: 5.6
    7 Stable tag: 1.4.2
     7Stable tag: 1.4.3
    88License: GPL-2.0+
    99License URI: http://www.gnu.org/licenses/gpl-2.0.txt
     
    1313== Description ==
    1414
    15 WC Bulk Order Generator helps developers and store owners create realistic WooCommerce test data quickly. Generate thousands of WooCommerce products and orders with just a few clicks.
     15Bulk Order & Product Generator, Import Export for WooCommerce helps developers and store owners create realistic WooCommerce test data quickly. Generate thousands of WooCommerce products and orders with just a few clicks.
    1616
    1717## 🚀 Key Features
     
    9595== Changelog ==
    9696
     97### 1.4.3 – 15 Feb 2025
     98- **Enhancement:** SDK and Product image generator
     99
    97100### 1.4.2 – 11 Feb 2025
    98101- ** 🛠 Maintenance Release**
  • wc-bulk-order-generator/trunk/wc-bulk-order-generator.php

    r3458624 r3461881  
    11<?php
    22/**
    3  * Plugin Name: WC Bulk Order Generator
     3 * Plugin Name: Bulk Order & Product Generator, Import Export for WooCommerce
    44 *
    55 * @author            devsabbirahmed
    66 * @copyright         2024- SABBIRSAM
    77 * @license           GPL-2.0-or-laters
    8  * @package WC Bulk Order Generator
     8 * @package Bulk Order & Product Generator, Import Export for WooCommerce
    99 *
    10  * Plugin URI: https://github.com/sabbirsam/WooCommerce-Bulk-Order-Generator
    11  * Description: Generates bulk random orders for WooCommerce testing with optimized batch processing
    12  * Version: 1.4.2
     10 * Plugin URI: https://wordpress.org/plugins/wc-bulk-order-generator
     11 * Description: Generate, import, export, and delete WooCommerce orders and products in bulk with optimized batch processing for fast, reliable store management and testing.
     12 * Version: 1.4.3
    1313 * Requires at least: 5.9
    1414 * Requires PHP:      5.6
     15 * Requires Plugins: woocommerce
    1516 * Author: sabbirsam
    1617 * Author URI:        https://profiles.wordpress.org/devsabbirahmed/
     
    2829        if ( ! isset( $wbog_fs ) ) {
    2930            // Include Freemius SDK.
    30             require_once dirname( __FILE__ ) . '/freemius/start.php';
     31            require_once dirname( __FILE__ ) . '/vendor/freemius/start.php';
    3132            $wbog_fs = fs_dynamic_init( array(
    3233                'id'                  => '19520',
     
    6263
    6364// Define plugin constants.
    64 define('WC_BULK_GENERATOR_VERSION', '1.4.2');
     65define('WC_BULK_GENERATOR_VERSION', '1.4.3');
    6566define( 'WC_BULK_GENERATOR_PLUGIN_FILE', __FILE__ );
    6667define('WC_BULK_GENERATOR_PLUGIN_DIR', plugin_dir_path(__FILE__));
     
    136137    private function init_dependencies() {
    137138        $dependencies = [
    138             'WC_Bulk_Product_Generator' => 'includes/class-wc-bulk-product-generator.php',
    139             'WC_Bulk_Order_Export' => 'includes/class-wc-bulk-order-export.php',
    140             'WC_Bulk_Product_Export' => 'includes/class-bulk-product-export.php',
    141             'WC_Bulk_Order_Import' => 'includes/class-wc-bulk-order-import.php',
    142             'WC_Bulk_Delete' => 'includes/class-wc-bulk-delete.php',
    143             'WC_Bulk_Product_Import' => 'includes/class-bulk-product-Import.php',
     139            'WcBulkOrderGenerator\\WC_Bulk_Product_Generator' => 'includes/class-wc-bulk-product-generator.php',
     140            'WcBulkOrderGenerator\\WC_Bulk_Order_Export' => 'includes/class-wc-bulk-order-export.php',
     141            'WcBulkOrderGenerator\\WC_Bulk_Product_Export' => 'includes/class-bulk-product-export.php',
     142            'WcBulkOrderGenerator\\WC_Bulk_Order_Import' => 'includes/class-wc-bulk-order-import.php',
     143            'WcBulkOrderGenerator\\WC_Bulk_Delete' => 'includes/class-wc-bulk-delete.php',
     144            'WcBulkOrderGenerator\\WC_Bulk_Product_Import' => 'includes/class-bulk-product-Import.php',
    144145        ];
    145146   
     
    164165        }
    165166   
    166         // Instantiate the classes dynamically
    167         $this->product_generator = new WC_Bulk_Product_Generator();
    168         $this->order_export = new WC_Bulk_Order_Export();
    169         $this->product_export = new WC_Bulk_Product_Export();
    170         $this->order_import = new WC_Bulk_Order_Import();
    171         $this->product_import = new WC_Bulk_Product_Import();
    172         $this->bulk_delete = new WC_Bulk_Delete();
    173     }
    174 
    175    
     167        // Instantiate the classes dynamically with namespaces
     168        $this->product_generator = new \WcBulkOrderGenerator\WC_Bulk_Product_Generator();
     169        $this->order_export = new \WcBulkOrderGenerator\WC_Bulk_Order_Export();
     170        $this->product_export = new \WcBulkOrderGenerator\WC_Bulk_Product_Export();
     171        $this->order_import = new \WcBulkOrderGenerator\WC_Bulk_Order_Import();
     172        $this->product_import = new \WcBulkOrderGenerator\WC_Bulk_Product_Import();
     173        $this->bulk_delete = new \WcBulkOrderGenerator\WC_Bulk_Delete();
     174    }
     175
    176176
    177177    /**
     
    189189
    190190    /**
    191      * Registers plugin settings for the WC Bulk Order Generator.
     191     * Registers plugin settings for the Bulk Order & Product Generator, Import Export for WooCommerce.
    192192     *
    193193     * This function registers the plugin's settings using the WordPress Settings API.
     
    273273                printf(
    274274                    esc_html__('WooCommerce is not installed or active. %1$s may not work correctly.', 'wc-bulk-order-generator'),
    275                     '<strong>' . esc_html__('WC Bulk Order Generator', 'wc-bulk-order-generator') . '</strong>'
     275                    '<strong>' . esc_html__('Bulk Order & Product Generator, Import Export for WooCommerce', 'wc-bulk-order-generator') . '</strong>'
    276276                );
    277277                ?>
     
    346346    /**
    347347     * Adds a submenu page for the Bulk Order Generator under the WooCommerce menu.
     348     * Also adds it to Shop Explorer menu if that plugin is active.
    348349     *
    349350     * This function adds the "Bulk Generator" page to the WooCommerce menu, allowing administrators
    350351     * to access the bulk order generation interface from the WordPress admin dashboard.
     352     * If Shop Explorer plugin is active, it also adds the menu there.
    351353     *
    352354     * @return void
    353355     */
    354356    public function add_admin_menu() {
     357        // Add submenu under WooCommerce
    355358        add_submenu_page(
    356359            'woocommerce',
     
    361364            array($this, 'admin_page')
    362365        );
     366       
     367        // Check if Shop Explorer plugin is active and add submenu there too
     368        if ($this->is_shop_explorer_active()) {
     369            add_submenu_page(
     370                'shop-explorer',
     371                esc_html__('Bulk Generator', 'wc-bulk-order-generator'),
     372                esc_html__('Bulk Generator', 'wc-bulk-order-generator'),
     373                'manage_woocommerce',
     374                'wc-order-generator',
     375                array($this, 'admin_page')
     376            );
     377        }
     378    }
     379   
     380    /**
     381     * Check if Shop Explorer plugin is active.
     382     *
     383     * @return bool True if Shop Explorer is active, false otherwise.
     384     */
     385    private function is_shop_explorer_active() {
     386        // Check if the Shop Explorer plugin is active
     387        if (!function_exists('is_plugin_active')) {
     388            include_once(ABSPATH . 'wp-admin/includes/plugin.php');
     389        }
     390       
     391        // Check for Shop Explorer plugin - adjust the plugin path as needed
     392        return is_plugin_active('shop-explorer/shop-explorer.php') ||
     393               is_plugin_active('shop-explorer.php') ||
     394               class_exists('ShopExplorer') ||
     395               defined('SHOP_EXPLORER_VERSION');
    363396    }
    364397
     
    457490                                </div>
    458491                            </div>
     492
     493                            <!-- Use Random Images Checkbox -->
     494                            <div class="setting-card">
     495                                <label><?php esc_html_e('Product Images', 'wc-bulk-order-generator'); ?></label>
     496                                <div class="product-type-options">
     497                                    <label class="product-type-checkbox">
     498                                        <input type="checkbox" id="use_random_images" name="use_random_images" value="1">
     499                                        <?php esc_html_e('Generate Product Images', 'wc-bulk-order-generator'); ?>
     500                                        <span class="checkmark"></span>
     501                                    </label>
     502                                </div>
     503                                <p class="description">
     504                                    <?php esc_html_e('Enable to generate product images. This may increase processing time.', 'wc-bulk-order-generator'); ?>
     505                                </p>
     506                            </div>
    459507                        </div>
    460508   
     
    742790                                <tr>
    743791                                    <th scope="row">
    744                                         <label for="import-csv"><?php esc_html_e('CSV File', 'wc-bulk-order-importer'); ?></label>
     792                                        <label for="import-csv"><?php esc_html_e('CSV File', 'wc-bulk-order-generator'); ?></label>
    745793                                    </th>
    746794                                    <td>
     
    759807                                            </div>
    760808                                        </div>
    761                                         <p class="description"><?php esc_html_e('Upload a CSV file with order details', 'wc-bulk-order-importer'); ?></p>
     809                                        <p class="description"><?php esc_html_e('Upload a CSV file with order details', 'wc-bulk-order-generator'); ?></p>
    762810                                        <div class="file-upload-validation">
    763                                             <small><?php esc_html_e('Accepted: .csv | 50MB only | Use only WC Bulk Generator CSV', 'wc-bulk-order-importer'); ?></small>
     811                                            <small><?php esc_html_e('Accepted: .csv | 50MB only | Use only WC Bulk Generator CSV', 'wc-bulk-order-generator'); ?></small>
    764812                                        </div>
    765813                                    </td>
     
    767815                                <tr>
    768816                                    <th scope="row">
    769                                         <label for="import-batch-size"><?php esc_html_e('Batch Size', 'wc-bulk-order-importer'); ?></label>
     817                                        <label for="import-batch-size"><?php esc_html_e('Batch Size', 'wc-bulk-order-generator'); ?></label>
    770818                                    </th>
    771819                                    <td>
    772820                                        <input type="number" id="import-batch-size" name="batch_size"
    773821                                            value="10" min="5" max="30">
    774                                         <p class="description"><?php esc_html_e('Number of orders to process per batch (5-30)', 'wc-bulk-order-importer'); ?></p>
     822                                        <p class="description"><?php esc_html_e('Number of orders to process per batch (5-30)', 'wc-bulk-order-generator'); ?></p>
    775823                                        <div class="poc-note">
    776824                                            <p><strong><?php esc_html_e('Note:', 'wc-bulk-order-generator'); ?></strong>
     
    811859
    812860                            <p class="submit">
    813                                 <input type="submit" class="button button-primary" value="<?php esc_attr_e('Import Orders', 'wc-bulk-order-importer'); ?>">
     861                                <input type="submit" class="button button-primary" value="<?php esc_attr_e('Import Orders', 'wc-bulk-order-generator'); ?>">
    814862                                <button type="button" id="reset-order-import" class="button button-secondary"><?php esc_html_e('Reset', 'wc-bulk-order-generator'); ?></button>
    815863                            </p>
     
    832880                                <tr>
    833881                                    <th scope="row">
    834                                         <label for="product-import-csv"><?php esc_html_e('CSV File', 'wc-bulk-product-importer'); ?></label>
     882                                        <label for="product-import-csv"><?php esc_html_e('CSV File', 'wc-bulk-order-generator'); ?></label>
    835883                                    </th>
    836884                                    <td>
     
    849897                                            </div>
    850898                                        </div>
    851                                         <p class="description"><?php esc_html_e('Upload a CSV file with product details', 'wc-bulk-product-importer'); ?></p>
     899                                        <p class="description"><?php esc_html_e('Upload a CSV file with product details', 'wc-bulk-order-generator'); ?></p>
    852900                                        <div class="file-upload-validation">
    853                                             <small><?php esc_html_e('Accepted: .csv | 50MB only | Use only WC Bulk Generator CSV ', 'wc-bulk-product-importer'); ?></small>
     901                                            <small><?php esc_html_e('Accepted: .csv | 50MB only | Use only WC Bulk Generator CSV ', 'wc-bulk-order-generator'); ?></small>
    854902                                        </div>
    855903                                    </td>
     
    857905                                <tr>
    858906                                    <th scope="row">
    859                                         <label for="product-import-batch-size"><?php esc_html_e('Batch Size', 'wc-bulk-product-importer'); ?></label>
     907                                        <label for="product-import-batch-size"><?php esc_html_e('Batch Size', 'wc-bulk-order-generator'); ?></label>
    860908                                    </th>
    861909                                    <td>
    862910                                        <input type="number" id="product-import-batch-size" name="batch_size"
    863911                                            value="10" min="5" max="30">
    864                                         <p class="description"><?php esc_html_e('Number of products to process per batch (5-30)', 'wc-bulk-product-importer'); ?></p>
     912                                        <p class="description"><?php esc_html_e('Number of products to process per batch (5-30)', 'wc-bulk-order-generator'); ?></p>
    865913                                       
    866914                                        <div class="poc-note">
     
    879927                            <div class="stats-grid">
    880928                                <div class="stat-card">
    881                                     <div class="stat-value" id="product-import-total-processed"><?php esc_html_e('0', 'wc-bulk-product-importer'); ?></div>
    882                                     <div class="stat-label"><?php esc_html_e('Total Processed', 'wc-bulk-product-importer'); ?></div>
    883                                 </div>
    884                                 <div class="stat-card">
    885                                     <div class="stat-value" id="product-import-success-count"><?php esc_html_e('0', 'wc-bulk-product-importer'); ?></div>
    886                                     <div class="stat-label"><?php esc_html_e('Successful', 'wc-bulk-product-importer'); ?></div>
    887                                 </div>
    888                                 <div class="stat-card">
    889                                     <div class="stat-value" id="product-import-failed-count"><?php esc_html_e('0', 'wc-bulk-product-importer'); ?></div>
    890                                     <div class="stat-label"><?php esc_html_e('Failed', 'wc-bulk-product-importer'); ?></div>
    891                                 </div>
    892                                 <div class="stat-card">
    893                                     <div class="stat-value" id="product-import-skipped-count"><?php esc_html_e('0', 'wc-bulk-product-importer'); ?></div>
    894                                     <div class="stat-label"><?php esc_html_e('Skipped', 'wc-bulk-product-importer'); ?></div>
    895                                 </div>
    896                                 <div class="stat-card">
    897                                     <div class="stat-value" id="product-import-elapsed-time"><?php esc_html_e('0s', 'wc-bulk-product-importer'); ?></div>
    898                                     <div class="stat-label"><?php esc_html_e('Elapsed Time', 'wc-bulk-product-importer'); ?></div>
     929                                    <div class="stat-value" id="product-import-total-processed"><?php esc_html_e('0', 'wc-bulk-order-generator'); ?></div>
     930                                    <div class="stat-label"><?php esc_html_e('Total Processed', 'wc-bulk-order-generator'); ?></div>
     931                                </div>
     932                                <div class="stat-card">
     933                                    <div class="stat-value" id="product-import-success-count"><?php esc_html_e('0', 'wc-bulk-order-generator'); ?></div>
     934                                    <div class="stat-label"><?php esc_html_e('Successful', 'wc-bulk-order-generator'); ?></div>
     935                                </div>
     936                                <div class="stat-card">
     937                                    <div class="stat-value" id="product-import-failed-count"><?php esc_html_e('0', 'wc-bulk-order-generator'); ?></div>
     938                                    <div class="stat-label"><?php esc_html_e('Failed', 'wc-bulk-order-generator'); ?></div>
     939                                </div>
     940                                <div class="stat-card">
     941                                    <div class="stat-value" id="product-import-skipped-count"><?php esc_html_e('0', 'wc-bulk-order-generator'); ?></div>
     942                                    <div class="stat-label"><?php esc_html_e('Skipped', 'wc-bulk-order-generator'); ?></div>
     943                                </div>
     944                                <div class="stat-card">
     945                                    <div class="stat-value" id="product-import-elapsed-time"><?php esc_html_e('0s', 'wc-bulk-order-generator'); ?></div>
     946                                    <div class="stat-label"><?php esc_html_e('Elapsed Time', 'wc-bulk-order-generator'); ?></div>
    899947                                </div>
    900948                            </div>
     
    903951
    904952                            <p class="submit">
    905                                 <input type="submit" class="button button-primary" value="<?php esc_attr_e('Import Products', 'wc-bulk-product-importer'); ?>">
    906                                 <button type="button" id="reset-product-import" class="button button-secondary"><?php esc_html_e('Reset', 'wc-bulk-product-importer'); ?></button>
     953                                <input type="submit" class="button button-primary" value="<?php esc_attr_e('Import Products', 'wc-bulk-order-generator'); ?>">
     954                                <button type="button" id="reset-product-import" class="button button-secondary"><?php esc_html_e('Reset', 'wc-bulk-order-generator'); ?></button>
    907955                            </p>
    908956                        </form>
     
    13411389
    13421390/**
    1343  * Initializes the WC Bulk Order Generator plugin.
     1391 * Initializes the Bulk Order & Product Generator, Import Export for WooCommerce plugin.
    13441392 *
    13451393 * This function is called when the plugins are loaded in WordPress. It initializes the `WC_Bulk_Order_Generator`
Note: See TracChangeset for help on using the changeset viewer.