{"id":291201,"date":"2026-04-05T04:55:00","date_gmt":"2026-04-05T04:55:00","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dropproduct-bulk-product-uploader-for-woocommerce\/"},"modified":"2026-08-01T06:21:00","modified_gmt":"2026-08-01T06:21:00","slug":"dropproduct","status":"publish","type":"plugin","link":"https:\/\/nqo.wordpress.org\/plugins\/dropproduct\/","author":21108382,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.0","stable_tag":"1.2.0","tested":"6.9.5","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"DropProduct","header_author":"Sajjad Hossain","header_description":"The fastest way to bulk create WooCommerce products from images with drag & drop, smart grouping, inline editing, and one-click publish.","assets_banners_color":"b7b3f0","last_updated":"2026-08-01 06:21:00","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/dropproduct\/","header_author_uri":"https:\/\/sajjadhossain.vercel.app","rating":0,"author_block_rating":0,"active_installs":20,"downloads":418,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"codersajjad","date":"2026-04-05 04:54:36"},"1.1.0":{"tag":"1.1.0","author":"codersajjad","date":"2026-05-03 14:13:24"},"1.1.1":{"tag":"1.1.1","author":"codersajjad","date":"2026-05-31 05:42:07"},"1.2.0":{"tag":"1.2.0","author":"codersajjad","date":"2026-08-01 06:21:00"}},"upgrade_notice":{"1.2.0":"<p>Important for every store. Sales Analytics reported zero sales on all installs because its queries referenced database columns that do not exist \u2014 rebuilt and now works. Order Shield performed no checks at all on the block-based Checkout (the WooCommerce default) and, on HPOS stores, its IP velocity and repeated-contact rules never fired \u2014 both fixed. Closes an IP-spoofing weakness that let visitors bypass every IP-based fraud rule, fixes an issue where turning Order Shield off made its settings screen unrecoverable, makes &quot;hold suspicious orders&quot; mode actually hold orders, and saves stock quantity edits that were previously discarded. Also replaces the blunt &quot;requires WooCommerce&quot; error with a soft, actionable notice, hardens CSV export against formula injection, bundles Chart.js locally instead of loading it from a CDN, and removes hardcoded sample data from Sales Analytics.<\/p>","1.1.0":"<p>Major release: Sales Analytics adds a modern reporting dashboard for DropProduct sales performance, including charts, top products, geographic breakdowns, and CSV export, plus the Cost-to-Profit Tracker, Ultimate Order Shield, Price Slasher improvements, SEO Alt-Text Automator, and publish\/delete workflow upgrades.<\/p>","1.0.0":"<p>Initial release of DropProduct.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3499999,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3499999,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3499999,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.1.1","1.2.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[259436,259438,259437,286,148898],"plugin_category":[45],"plugin_contributors":[228640],"plugin_business_model":[],"class_list":["post-291201","plugin","type-plugin","status-publish","hentry","plugin_tags-bulk-product-upload","plugin_tags-drag-drop-upload","plugin_tags-product-creator","plugin_tags-woocommerce","plugin_tags-woocommerce-bulk-edit","plugin_category-ecommerce","plugin_contributors-codersajjad","plugin_committers-codersajjad"],"banners":{"banner":"https:\/\/ps.w.org\/dropproduct\/assets\/banner-772x250.png?rev=3499999","banner_2x":"https:\/\/ps.w.org\/dropproduct\/assets\/banner-1544x500.png?rev=3499999","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/dropproduct\/assets\/icon-128x128.png?rev=3499999","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>DropProduct<\/strong> is the fastest way to add products to your WooCommerce store. Stop wasting hours creating products one by one \u2014 just drag &amp; drop your product images and let DropProduct do the rest.<\/p>\n\n<p>Upload 10, 50, or 100+ product images at once. Each image instantly becomes a draft product with a clean title generated from the filename. Edit prices, categories, SKUs, and descriptions right in the grid \u2014 everything saves automatically. When you're ready, publish all products in a single click.<\/p>\n\n<h4>\u26a1 How It Works<\/h4>\n\n<ol>\n<li><strong>Drag &amp; drop<\/strong> your product images onto the upload zone<\/li>\n<li><strong>Products are created automatically<\/strong> as drafts with smart titles from filenames<\/li>\n<li><strong>Related images are grouped<\/strong> \u2014 <code>shoe-1.jpg<\/code> and <code>shoe-2.jpg<\/code> become one product with a gallery<\/li>\n<li><strong>Edit inline<\/strong> \u2014 title, description, regular price, sale price, SKU, stock, and category<\/li>\n<li><strong>Publish all<\/strong> valid products in one click<\/li>\n<\/ol>\n\n<h4>\ud83c\udfaf Who Is This For?<\/h4>\n\n<ul>\n<li><strong>New store owners<\/strong> building their first product catalog<\/li>\n<li><strong>Dropshippers<\/strong> adding hundreds of products quickly<\/li>\n<li><strong>Photographers &amp; artists<\/strong> selling prints and digital products<\/li>\n<li><strong>Wholesalers<\/strong> managing large inventories<\/li>\n<li><strong>Anyone<\/strong> tired of WooCommerce's slow, one-at-a-time product creation<\/li>\n<\/ul>\n\n<h4>\ud83c\udd93 Free Features<\/h4>\n\n<p><strong>Core Product Management<\/strong><\/p>\n\n<ul>\n<li><strong>Drag &amp; Drop Bulk Upload<\/strong> \u2014 Upload unlimited product images at once (JPEG, PNG, GIF, WebP)<\/li>\n<li><strong>Smart Title Generation<\/strong> \u2014 Filenames like <code>blue-cotton-hoodie.jpg<\/code> become \"Blue Cotton Hoodie\" automatically<\/li>\n<li><strong>Gallery Grouping<\/strong> \u2014 Images sharing a base name merge into one product with a gallery<\/li>\n<li><strong>Inline Grid Editor<\/strong> \u2014 Edit title, description, regular price, sale price, SKU, stock status, category, and cost price directly in the table<\/li>\n<li><strong>Auto-Save<\/strong> \u2014 Every change saves instantly via AJAX \u2014 no save button needed<\/li>\n<li><strong>Sale Price Validation<\/strong> \u2014 Warns you if the sale price is higher than the regular price<\/li>\n<li><strong>Description Editor<\/strong> \u2014 Add product descriptions via a clean popup modal<\/li>\n<li><strong>Hover Image Preview<\/strong> \u2014 Hover over any thumbnail to see the full-size image<\/li>\n<li><strong>Batch Publish with Validation<\/strong> \u2014 Publish all drafts in one click; missing title or price fields are highlighted in red<\/li>\n<li><strong>Individual Publish<\/strong> \u2014 Publish a single draft product directly from the grid row<\/li>\n<li><strong>Draft Counter<\/strong> \u2014 See how many unpublished products you have at a glance<\/li>\n<li><strong>HPOS Compatible<\/strong> \u2014 Fully compatible with WooCommerce High-Performance Order Storage<\/li>\n<li><strong>Zero Bloat<\/strong> \u2014 Assets only load on the DropProduct page; no impact on the rest of your admin<\/li>\n<\/ul>\n\n<p><strong>\ud83d\udcca Sales Analytics Dashboard<\/strong><\/p>\n\n<ul>\n<li>New dedicated admin submenu under DropProduct with modern analytics cards and charts<\/li>\n<li>Track total sales, orders, average order value, conversion rate, sales over time, top products, top countries, and traffic channels<\/li>\n<li>Date range filters and CSV export for quick reporting<\/li>\n<\/ul>\n\n<p><strong>\ud83d\udcb0 Quick Bulk Price Adjuster (Price Slasher)<\/strong><\/p>\n\n<ul>\n<li>Apply a percentage or fixed-amount price increase\/decrease to all selected products simultaneously<\/li>\n<li>Works on Regular Price, Sale Price, or both at once<\/li>\n<li>Toggle the Price Slasher bar on\/off with a dedicated toolbar button<\/li>\n<li>Prices are updated via AJAX \u2014 no page reload<\/li>\n<li>Final prices are clamped to \u2265 0 and rounded to 2 decimal places<\/li>\n<\/ul>\n\n<p><strong>\ud83d\udcf8 Smart SEO Alt-Text Automator<\/strong> <em>(requires toggle in Settings)<\/em><\/p>\n\n<ul>\n<li>Automatically generates and assigns SEO-friendly alt text to product images on upload<\/li>\n<li>Parses the filename: removes extension, replaces hyphens\/underscores with spaces, converts to Title Case<\/li>\n<li>Only sets alt text when the field is currently empty \u2014 never overwrites manual work<\/li>\n<\/ul>\n\n<p><strong>\u2699\ufe0f Cost-to-Profit Tracker<\/strong><\/p>\n\n<ul>\n<li>Add a \"Cost Price\" to any product row \u2014 stored privately as <code>_dropproduct_cost_price<\/code> (never shown to customers)<\/li>\n<li>Instant real-time calculation of <strong>Profit<\/strong> (= Selling Price \u2212 Cost) and <strong>Margin %<\/strong> (= Profit \u00f7 Selling Price \u00d7 100)<\/li>\n<li>Both values update live as you type \u2014 no AJAX round-trip needed for display<\/li>\n<li>Cost saved automatically via debounced AJAX; recalculates whenever the regular or sale price changes<\/li>\n<li>Profit and Margin display with colour coding: green (positive), red (negative), grey (no data)<\/li>\n<\/ul>\n\n<p><strong>\ud83d\udee1\ufe0f Ultimate Order Shield<\/strong> <em>(requires toggle in Settings)<\/em><\/p>\n\n<ul>\n<li>Full WooCommerce fraud protection engine \u2014 no external APIs<\/li>\n<li><strong>Honeypot field<\/strong> \u2014 invisible to real users; filled by bots \u2192 immediate block<\/li>\n<li><strong>Blacklist<\/strong> \u2014 block orders from specific names, phones, or email addresses<\/li>\n<li><strong>Disposable email detection<\/strong> \u2014 20+ known throwaway domains blocked by default; fully editable list<\/li>\n<li><strong>IP velocity limiting<\/strong> \u2014 too many orders from the same IP within 1 hour scores +30 risk points<\/li>\n<li><strong>IP \/ Billing country mismatch<\/strong> \u2014 uses WC Geolocation (no external API); adds risk score and private order note<\/li>\n<li><strong>Card testing protection<\/strong> \u2014 excessive failed payment attempts trigger an immediate block<\/li>\n<li><strong>Checkout speed check<\/strong> \u2014 orders submitted faster than a configurable threshold are scored as suspicious<\/li>\n<li><strong>Configurable thresholds<\/strong> \u2014 separate block and review thresholds; force On-Hold instead of block if preferred<\/li>\n<li><strong>Cash on Delivery restriction<\/strong> \u2014 automatically hide COD for high-risk customers<\/li>\n<li><strong>Activity Log<\/strong> \u2014 every checkout check is logged with IP, email, risk score, triggered rules, and final action<\/li>\n<li><strong>Admin settings panel<\/strong> \u2014 full control via DropProduct \u2192 \ud83d\udee1\ufe0f Order Shield menu<\/li>\n<\/ul>\n\n<p><strong>\ud83d\udce6 Bulk Editing<\/strong><\/p>\n\n<ul>\n<li>Select multiple products and set price, category, stock status, tax class, or shipping class for all of them at once<\/li>\n<li>Floating bulk bar appears when rows are selected \u2014 shows action buttons for each field<\/li>\n<li>Clean prompt modal lets you choose the new value before applying<\/li>\n<\/ul>\n\n<p><strong>\ud83d\udd16 Session Management<\/strong><\/p>\n\n<ul>\n<li>Upload sessions are tracked automatically \u2014 each batch of images is tagged with a unique session ID<\/li>\n<li>Filter the product grid by session to work on one batch at a time<\/li>\n<li>Session dropdown always shows the most recent 50 sessions<\/li>\n<\/ul>\n\n<p><strong>\ud83d\udccb Activity Log<\/strong><\/p>\n\n<ul>\n<li>Full audit trail of all create, publish, delete, and edit actions<\/li>\n<li>Filter by action type (upload, publish, delete, edit) and paginate through entries<\/li>\n<li>Clear individual entries or wipe the entire log from the admin panel<\/li>\n<\/ul>\n\n<p><strong>\ud83d\udd0d SEO Tools<\/strong><\/p>\n\n<ul>\n<li>Edit URL slugs, meta descriptions (Yoast + Rank Math compatible), and image ALT text inline<\/li>\n<li>SEO fields update via AJAX \u2014 no page reload needed<\/li>\n<\/ul>\n\n<h4>\u2b50 Pro Features<\/h4>\n\n<p>Unlock advanced power features with <a href=\"https:\/\/dropproduct.dev\/pro\">DropProduct Pro<\/a>:<\/p>\n\n<ul>\n<li><strong>Product Duplication<\/strong> \u2014 Clone any product row with one click<\/li>\n<li><strong>Validation Dashboard<\/strong> \u2014 Pre-publish validation report with issue breakdown<\/li>\n<li><strong>Variable Product Support<\/strong> \u2014 Auto-detect color\/size variations from filenames<\/li>\n<li><strong>Advanced Grouping Engine<\/strong> \u2014 Custom prefixes\/suffixes for smarter image grouping<\/li>\n<li><strong>Template Presets<\/strong> \u2014 Default category, stock, tax class auto-applied to every new product<\/li>\n<li><strong>Performance Controls<\/strong> \u2014 Configurable batch size, safe mode, and auto-retry<\/li>\n<\/ul>\n\n<h4>\ud83d\udca1 Smart Image Naming Tips<\/h4>\n\n<ul>\n<li><code>blue-hoodie.jpg<\/code> \u2192 <strong>Blue Hoodie<\/strong> (1 product, 1 image)<\/li>\n<li><code>blue-hoodie-1.jpg<\/code>, <code>blue-hoodie-2.jpg<\/code> \u2192 <strong>Blue Hoodie<\/strong> (1 product, 2-image gallery)<\/li>\n<\/ul>\n\n<p>Use hyphens (<code>-<\/code>) or underscores (<code>_<\/code>) to separate words. Trailing numbers are stripped automatically.<\/p>\n\n<h4>\ud83d\udd12 Safe &amp; Secure<\/h4>\n\n<ul>\n<li>All products start as <strong>drafts<\/strong> \u2014 nothing goes live until you click Publish<\/li>\n<li>Every request is <strong>nonce-protected<\/strong> and capability-checked (<code>manage_woocommerce<\/code>)<\/li>\n<li>All inputs are <strong>sanitized and escaped<\/strong><\/li>\n<li>Order Shield uses <strong>rule-based scoring<\/strong> \u2014 no external APIs, no third-party data sharing<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>DropProduct<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress<\/li>\n<li>Make sure <strong>WooCommerce<\/strong> is installed and active<\/li>\n<li>Navigate to <strong>DropProduct<\/strong> in the admin sidebar to start creating products<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20dropproduct%20require%20woocommerce%3F\"><h3>Does DropProduct require WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. WooCommerce must be installed and active. DropProduct requires WooCommerce 6.0 or higher.<\/p><\/dd>\n<dt id=\"what%20fields%20can%20i%20edit%20in%20the%20grid%3F\"><h3>What fields can I edit in the grid?<\/h3><\/dt>\n<dd><p>You can edit: <strong>Title<\/strong>, <strong>Short Description<\/strong>, <strong>Regular Price<\/strong>, <strong>Sale Price<\/strong>, <strong>SKU<\/strong>, <strong>Stock Status<\/strong>, <strong>Category<\/strong>, and <strong>Cost Price<\/strong> (internal \u2014 not shown to customers).<\/p><\/dd>\n<dt id=\"how%20does%20the%20order%20shield%20fraud%20protection%20work%3F\"><h3>How does the Order Shield fraud protection work?<\/h3><\/dt>\n<dd><p>Order Shield uses a rule-based scoring engine to assess risk at checkout. Each suspicious signal (disposable email, IP velocity, country mismatch, failed payments, checkout speed) adds risk points. If the total exceeds your \"Block\" threshold, the order is rejected; if it exceeds your \"Review\" threshold, the order is set to \"On Hold\". No external APIs are used.<\/p><\/dd>\n<dt id=\"where%20is%20the%20cost%20price%20stored%3F\"><h3>Where is the Cost Price stored?<\/h3><\/dt>\n<dd><p>Cost prices are stored in <code>wp_postmeta<\/code> under the key <code>_dropproduct_cost_price<\/code>. They are private and never shown to customers.<\/p><\/dd>\n<dt id=\"does%20dropproduct%20work%20with%20woocommerce%20hpos%3F\"><h3>Does DropProduct work with WooCommerce HPOS?<\/h3><\/dt>\n<dd><p>Yes. DropProduct is fully compatible with WooCommerce High-Performance Order Storage (HPOS).<\/p><\/dd>\n<dt id=\"will%20this%20plugin%20slow%20down%20my%20admin%3F\"><h3>Will this plugin slow down my admin?<\/h3><\/dt>\n<dd><p>No. DropProduct loads its CSS and JavaScript <strong>only on the DropProduct admin page<\/strong>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<p>Major stability, security, and correctness release. Two headline features \u2014 Sales Analytics and Order Shield \u2014 were not working as described on modern WooCommerce stores; both are now fixed and verified against a live HPOS store with the block-based checkout. No feature removals \u2014 everything that worked before still works the same way.<\/p>\n\n<p><strong>Sales Analytics now works at all<\/strong><\/p>\n\n<ul>\n<li><strong>Every analytics query was invalid and always had been.<\/strong> The reports selected <code>product_id<\/code>, <code>quantity<\/code> and <code>total<\/code> from <code>wc_woocommerce_order_items<\/code>, a table which has none of those columns \u2014 it holds only <code>order_item_id<\/code>, <code>order_item_name<\/code>, <code>order_item_type<\/code> and <code>order_id<\/code>. Every query raised a MySQL error, every result came back empty, and the dashboard reported zero sales on every install since the feature shipped in 1.1.0.<\/li>\n<li><strong>Rebuilt on WooCommerce's reporting lookup tables<\/strong> (<code>wc_order_product_lookup<\/code>, <code>wc_order_stats<\/code>, <code>wc_customer_lookup<\/code>). These are indexed and pre-aggregated, so reports are also considerably faster than the original design would have been.<\/li>\n<li><strong>Added an automatic fallback<\/strong> for stores where those tables are absent or not yet backfilled (WooCommerce Analytics disabled, or a fresh install before the scheduler runs). The fallback aggregates order line items through <code>wc_get_orders()<\/code> in a single pass. The response now includes a <code>data_source<\/code> field indicating which path produced the figures.<\/li>\n<li><strong>Revenue is no longer double-counted.<\/strong> The old query multiplied the line total by the quantity, but a line total already accounts for quantity \u2014 so even if the query had run, a 3 \u00d7 $75 line would have reported $675 instead of $225.<\/li>\n<li><strong>Date ranges now use site time, not server time.<\/strong> Ranges were built with PHP's <code>date()<\/code>, which ignores the WordPress timezone, so on many hosts the reporting window was shifted by hours against every other date shown in WooCommerce.<\/li>\n<li><strong>Removed fabricated sample data.<\/strong> \"Sales by Channel\", the device breakdown, and the conversion rate were hardcoded example figures shown to users as if they were their own store's numbers \u2014 one set of percentages even summed to 110%. WooCommerce does not record referral channel, device type, or impressions, so these widgets now show an honest empty state, and the conversion rate reads \"\u2014\". Add-ons can supply real data through the new <code>dropproduct_analytics_sales_by_channel<\/code> and <code>dropproduct_analytics_conversion_metrics<\/code> filters.<\/li>\n<li><strong>Fixed a crash in the Analytics summary when a store has no DropProduct products.<\/strong> Missing growth values produced <code>NaN<\/code> in the KPI cards.<\/li>\n<\/ul>\n\n<p><strong>Order Shield now runs on the modern checkout, and no longer leaks IP-based rules<\/strong><\/p>\n\n<ul>\n<li><strong>The shield was completely inert on the block-based Checkout<\/strong> \u2014 the WooCommerce default since 8.3. It hooked only <code>woocommerce_checkout_process<\/code> and <code>woocommerce_checkout_before_customer_details<\/code>, neither of which the Checkout block fires. Not a single rule was evaluated, while the admin screen continued to display \"\ud83d\udee1 Protected\". Order Shield now hooks the Store API equivalents, so blacklist, disposable email, IP velocity, repeated contact, IP\/country mismatch, failed payments and card-testing detection all apply to block checkouts. Blocked orders are rejected with a proper Store API error.<\/li>\n<li><strong>The honeypot and checkout-speed rules cannot run on the block checkout<\/strong> \u2014 both depend on hidden fields only the classic form renders. Rather than let this be silently misleading, the Order Shield settings screen now detects a block-based checkout and states plainly which two rules are inactive and which seven are running.<\/li>\n<li><strong>The plugin declared HPOS compatibility it did not have.<\/strong> Under High-Performance Order Storage, orders move out of <code>wp_posts<\/code>\/<code>wp_postmeta<\/code> into dedicated tables, but Order Shield still queried <code>post_type = 'shop_order'<\/code> and <code>_billing_email<\/code> \/ <code>_customer_ip_address<\/code> post meta directly. Those queries matched nothing, so the <strong>IP velocity<\/strong> and <strong>repeated phone\/email<\/strong> rules silently never fired on any HPOS store. All order lookups now go through <code>wc_get_orders()<\/code>, which routes to whichever data store is active.<\/li>\n<li><strong>Visitor IP addresses could be spoofed to defeat every IP-based rule.<\/strong> <code>X-Forwarded-For<\/code>, <code>Client-IP<\/code> and <code>CF-Connecting-IP<\/code> are supplied by the client and were trusted unconditionally. An attacker could send a different value on each request to walk past IP velocity limits, failed-payment counting and the COD restriction \u2014 or reuse someone else's address to inflate their counters and get them blocked. Forwarded headers are now only honoured when the store is explicitly configured as sitting behind a reverse proxy, and only when the connecting address matches the trusted-proxy allowlist. New \"Network &amp; Proxy\" settings section, disabled by default, with an optional allowlist of proxy IPs and CIDR ranges (IPv4 and IPv6).<\/li>\n<li><strong>Order Shield could permanently lock itself out of its own settings screen.<\/strong> The admin AJAX endpoints were registered inside the \"is the shield enabled?\" check, so saving the shield as disabled removed the very endpoint needed to switch it back on. The settings form is no longer recoverable only via a database edit.<\/li>\n<li><strong>\"Hold suspicious orders\" mode now actually holds orders.<\/strong> The logic ran on <code>woocommerce_checkout_create_order<\/code>, before the order had an ID \u2014 so the on-hold status was overwritten by the payment gateway moments later, and the explanatory order notes were silently discarded. It now runs on <code>woocommerce_checkout_order_processed<\/code>, where the order is saved. Flagged orders are held, and the risk score and triggered rules are recorded as private order notes.<\/li>\n<li><strong>Cash-on-Delivery restriction now applies on block checkouts too.<\/strong> It was gated behind <code>is_checkout()<\/code>, which is always false during a Store API request.<\/li>\n<li>Scoring, thresholds and action mode are now shared by both checkout types through a single decision path, so the two can no longer drift apart.<\/li>\n<li>The Dashboard no longer reports Order Shield as inactive when it is running \u2014 it was reading a settings key that never existed.<\/li>\n<\/ul>\n\n<p><strong>Other security &amp; correctness fixes<\/strong><\/p>\n\n<ul>\n<li><strong>Bulk Price Adjuster now respects product ownership.<\/strong> Every other write endpoint already limited itself to DropProduct-managed products; the price adjuster did not, so a crafted request could rewrite prices on any product in the catalogue. It now skips unmanaged products and reports how many were skipped.<\/li>\n<li><strong>CSV export hardened against formula injection.<\/strong> Product and country names beginning with <code>=<\/code>, <code>+<\/code>, <code>-<\/code>, <code>@<\/code>, TAB or CR are now neutralised, so a malicious product title can no longer execute when the exported report is opened in Excel, LibreOffice, or Google Sheets. Fields are now properly quoted and escaped, and a UTF-8 BOM is added so accented product names open correctly.<\/li>\n<li><strong>Removed the double-<code>prepare()<\/code> in the Activity Log query.<\/strong> A prepared fragment was being nested inside a second <code>prepare()<\/code> call, which double-escapes and triggers <code>_doing_it_wrong()<\/code> on WordPress 6.2+. Each query is now prepared exactly once.<\/li>\n<li><strong>Chart.js is now bundled with the plugin<\/strong> instead of loaded from a public CDN. This removes a third-party supply-chain dependency, stops admin IP addresses being sent to an external host (GDPR), and lets the Analytics page work on offline and intranet installs.<\/li>\n<li><strong>Stock quantity is now saved when edited in the grid.<\/strong> The field posted <code>stock_quantity<\/code>, which the server had no handler for, so the value was silently dropped while the UI still flashed \"Saved\". Editing it now enables stock management, stores the quantity, and keeps the stock status column in sync.<\/li>\n<li><strong>Fixed double-escaped text on the Dashboard.<\/strong> Customer names, product titles, and emails were escaped on the server and again in JavaScript, so names appeared as <code>O&amp;amp;#039;Brien<\/code>. Escaping now happens once, at the point of output.<\/li>\n<\/ul>\n\n<p><strong>Onboarding: WooCommerce dependency notice<\/strong><\/p>\n\n<ul>\n<li><strong>DropProduct now explains itself instead of failing quietly.<\/strong> Activating DropProduct without WooCommerce previously showed a bare red error reading \"DropProduct requires WooCommerce to be installed and active\" \u2014 on every admin page, with no way to act on it and no way to dismiss it. It now shows a single soft notice with a one-click button that resolves the problem.<\/li>\n<li><strong>The notice knows which of four situations you are actually in<\/strong> and adapts:\n\n<ul>\n<li>WooCommerce not installed \u2192 <strong>Install WooCommerce<\/strong><\/li>\n<li>Installed but deactivated \u2192 <strong>Activate WooCommerce<\/strong><\/li>\n<li>Active but older than the required 6.0 \u2192 <strong>Update WooCommerce<\/strong><\/li>\n<li>Active and supported \u2192 no notice; the plugin simply runs.<\/li>\n<\/ul><\/li>\n<li><strong>A \"Remind me later\" option<\/strong> hides the notice for a week. It always reappears on the Plugins screen, so it can never be lost entirely. Duration is filterable via <code>dropproduct_wc_notice_snooze_period<\/code>.<\/li>\n<li><strong>A corrective link is added to DropProduct's own row on the Plugins screen<\/strong>, since that is where people land after activating and finding no DropProduct menu.<\/li>\n<li><strong>The notice is only shown to users who can act on it.<\/strong> Subscribers, customers, and other low-privilege roles no longer see a message about plugins they cannot install.<\/li>\n<li><strong>Activation no longer needs WooCommerce to succeed.<\/strong> Blocking activation would produce WordPress's opaque \"Plugin could not be activated\" screen; DropProduct instead installs cleanly, stays dormant, and tells you what it needs.<\/li>\n<li><strong>Added a minimum WooCommerce version check (6.0).<\/strong> The plugin header has always declared this requirement but nothing enforced it, so older WooCommerce installs could load DropProduct and hit fatal errors on missing APIs.<\/li>\n<li>WooCommerce detection now tests for the <code>WC()<\/code> function rather than the <code>WooCommerce<\/code> class, and WooCommerce installed to a non-standard directory is now detected correctly.<\/li>\n<\/ul>\n\n<p><strong>Performance<\/strong><\/p>\n\n<ul>\n<li><strong>The activity log table is no longer rebuilt on every request.<\/strong> <code>dbDelta()<\/code> \u2014 which issues a <code>DESCRIBE<\/code> for every column \u2014 ran unguarded on each page load, including every front-end view. It is now guarded by a stored schema version, matching how the fraud log table already worked.<\/li>\n<li><strong>The Analytics product lookup is cached and bounded.<\/strong> It loaded every DropProduct product ID with no limit and re-ran the query for each of the five analytics sub-reports. It is now memoised per request, cached for 5 minutes, and capped, and the cache is cleared automatically when products are created, published, or deleted.<\/li>\n<li><strong>The editing grid loads a bounded number of products<\/strong> (200 by default) instead of hydrating every product the plugin has ever created into a single AJAX response. Adjustable via the new <code>dropproduct_grid_limit<\/code> filter; return <code>-1<\/code> for the previous behaviour.<\/li>\n<\/ul>\n\n<p><strong>Improvements<\/strong><\/p>\n\n<ul>\n<li><strong>Third-party admin notices are hidden on DropProduct pages, but WordPress's own are not.<\/strong> DropProduct pages previously called <code>remove_all_actions()<\/code> on all four notice hooks, which also swallowed core update warnings, recovery-mode alerts, paused-plugin notices and the default-password nag. Suppression is now selective: theme registration nags, plugin-recommendation blocks, review prompts and license reminders are unhooked, while WordPress core notices continue to display.<\/li>\n<li><strong>Uninstall now removes everything the plugin created.<\/strong> Previously only a single option was deleted, leaving behind two custom database tables, several options, dashboard transients, the Order Shield rate-limit transients, and all <code>_dropproduct_*<\/code> post meta. Uninstall is multisite-aware. Product posts are deliberately left untouched.<\/li>\n<li>Order Shield hooks register correctly regardless of plugin load order relative to WooCommerce.<\/li>\n<li>Updated the \"WC tested up to\" header to 10.9 and corrected <code>Tested up to<\/code> in the plugin readme (it referenced a WordPress version that does not exist).<\/li>\n<\/ul>\n\n<p><strong>New Filters<\/strong><\/p>\n\n<ul>\n<li><code>dropproduct_analytics_sales_by_channel<\/code> \u2014 supply real channel attribution data.<\/li>\n<li><code>dropproduct_analytics_conversion_metrics<\/code> \u2014 supply real device\/conversion data.<\/li>\n<li><code>dropproduct_grid_limit<\/code> \u2014 control how many products the editing grid loads.<\/li>\n<li><code>dropproduct_suppress_admin_notices<\/code> \u2014 opt out of third-party notice hiding.<\/li>\n<li><code>dropproduct_allowed_admin_notices<\/code> \u2014 keep specific notice callbacks visible.<\/li>\n<li><code>dropproduct_trust_proxy_headers<\/code> \u2014 control proxy-header trust per request.<\/li>\n<li><code>dropproduct_trusted_proxies<\/code> \u2014 supply the trusted proxy allowlist programmatically.<\/li>\n<li><code>dropproduct_wc_notice_snooze_period<\/code> \u2014 control how long the WooCommerce dependency notice stays snoozed.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<p>Maintenance release: small fixes and improvements.<\/p>\n\n<p><strong>Fixes<\/strong><\/p>\n\n<ul>\n<li>Resolved an edge-case where Price Slasher could clear price fields after bulk apply.<\/li>\n<li>Fixed CSV export encoding for Sales Analytics to ensure UTF-8 compatibility.<\/li>\n<li>Minor UI tweaks and accessibility improvements in the admin grid and modals.<\/li>\n<li>Updated capability checks and sanitization for improved security.<\/li>\n<\/ul>\n\n<p><strong>Improvements<\/strong><\/p>\n\n<ul>\n<li>Optimized AJAX response payloads to reduce admin page load time.<\/li>\n<li>Prepared translations for recent strings.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<p>Combined release: includes the unreleased 1.0.1 and 1.0.2 feature sets.<\/p>\n\n<p><strong>New Features<\/strong><\/p>\n\n<ul>\n<li><strong>Sales Analytics Dashboard<\/strong> \u2014 New DropProduct \u2192 \ud83d\udcc8 Sales Analytics submenu with a Freemius-style dashboard layout, summary cards, responsive charts, top products, top countries, and device\/channel breakdowns.<\/li>\n<li><strong>Date Range Filtering<\/strong> \u2014 Quickly switch between 7, 30, 90, and 365-day reporting windows.<\/li>\n<li><strong>CSV Export<\/strong> \u2014 Export the current analytics view for reporting and record keeping.<\/li>\n<li><strong>Cost-to-Profit Tracker<\/strong> \u2014 New \"Cost Price\" grid column. Profit and Margin % calculated in real-time on the client side; cost auto-saved via debounced AJAX to <code>_dropproduct_cost_price<\/code> post meta. Colour-coded display: green (profitable), red (loss), grey (no data).<\/li>\n<li><strong>Ultimate Order Shield<\/strong> \u2014 Complete WooCommerce fraud protection. Rule-based risk scoring (disposable emails +40, IP velocity +30, repeated data +25, country mismatch +20, failed payments +25, checkout speed +20). Honeypot + blacklist instant-block pre-checks. Configurable block\/review thresholds, COD restriction, full activity log. New admin submenu: DropProduct \u2192 \ud83d\udee1\ufe0f Order Shield. Custom DB table <code>{prefix}dropproduct_fraud_log<\/code>.<\/li>\n<li><strong>Quick Bulk Price Adjuster (Price Slasher)<\/strong> \u2014 New bulk pricing feature for selected products. Open the Price Slasher bar via toolbar toggle and apply % or fixed price adjustments to Regular, Sale, or both prices simultaneously.<\/li>\n<li><strong>Smart SEO Alt-Text Automator<\/strong> \u2014 Auto-generates Title Case alt text from filenames on upload. Toggle in Settings. Only sets alt when the field is currently empty.<\/li>\n<li><strong>Individual Publish<\/strong> \u2014 Per-row publish button for publishing a single draft without affecting others.<\/li>\n<li><strong>Custom Delete Modal<\/strong> \u2014 Replaced browser <code>confirm()<\/code> with a styled modal popup for delete confirmations.<\/li>\n<\/ul>\n\n<p><strong>Improvements<\/strong><\/p>\n\n<ul>\n<li>Added a dedicated analytics service and AJAX endpoint for loading dashboard data without leaving the admin page.<\/li>\n<li>Updated the admin navigation to surface Sales Analytics alongside Upload, Settings, Dashboard, and Order Shield.<\/li>\n<\/ul>\n\n<p><strong>Bug Fixes<\/strong><\/p>\n\n<ul>\n<li>Price Slasher bar redesigned from dark indigo theme to a clean <strong>light theme<\/strong> \u2014 white background, indigo left-border accent, full-contrast inputs and labels.<\/li>\n<li><code>handle_bulk_price_adjust()<\/code> AJAX response refactored: returns flat <code>{id, regular_price, sale_price}<\/code> per product instead of nested <code>fields[]<\/code> array \u2014 eliminates the \"price disappears after apply\" bug.<\/li>\n<li>Profit and Margin auto-recalculate whenever Regular Price or Sale Price is edited in the grid.<\/li>\n<li>Regular price inputs no longer lose their values after a Price Slasher bulk adjustment is applied.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Drag &amp; drop multi-image upload with real-time progress bar<\/li>\n<li>Smart filename-to-title conversion with automatic gallery grouping<\/li>\n<li>SPA-style inline editable product grid<\/li>\n<li>Auto-save on blur\/change with visual saving\/saved\/error states<\/li>\n<li>Sale price validation with tooltip warning<\/li>\n<li>Hover image preview, description popup, batch publish with validation<\/li>\n<li>HPOS compatibility declared; extension hooks for Pro integration<\/li>\n<\/ul>","raw_excerpt":"DropProduct is a WooCommerce bulk product uploader that instantly creates draft products from image uploads \u2014 drag &amp; drop multiple images, auto-ge &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/291201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=291201"}],"author":[{"embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/codersajjad"}],"wp:attachment":[{"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=291201"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=291201"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=291201"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=291201"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=291201"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/nqo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=291201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}