{"id":334327,"date":"2026-07-09T17:00:16","date_gmt":"2026-07-09T17:00:16","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/custom-product-image-upload\/"},"modified":"2026-07-09T16:59:56","modified_gmt":"2026-07-09T16:59:56","slug":"nowdigiverse-product-image-upload","status":"publish","type":"plugin","link":"https:\/\/scn.wordpress.org\/plugins\/nowdigiverse-product-image-upload\/","author":23375099,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.1","requires":"5.9","requires_php":"7.2","requires_plugins":null,"header_name":"NDV Product Image Upload for WooCommerce","header_author":"Nowdigiverse","header_description":"Let WooCommerce customers upload and crop images and PDFs for products before checkout, with per-product rules and secure file handling.","assets_banners_color":"6e5d75","last_updated":"2026-07-09 16:59:56","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/nowdigiverse.com\/products\/","header_author_uri":"https:\/\/nowdigiverse.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":31,"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":"nowdigiverse","date":"2026-07-09 16:59:56"}},"upgrade_notice":{"1.0.0":"<p>Initial WordPress.org release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.jpg":{"filename":"icon-128x128.jpg","revision":3601764,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-128x128.png":{"filename":"icon-128x128.png","revision":3601764,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3601764,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3601764,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3601780,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3601764,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3601764,"resolution":"1","location":"assets","locale":"","width":1280,"height":720},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3601764,"resolution":"2","location":"assets","locale":"","width":1280,"height":720},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3601764,"resolution":"3","location":"assets","locale":"","width":1280,"height":720},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3601764,"resolution":"4","location":"assets","locale":"","width":1280,"height":720}},"screenshots":{"1":"Global Settings and Default Settings in the admin area","2":"Frontend upload dialog and the built-in cropping tool with shape presets","3":"Cart page showing the customer's uploaded files on the line item","4":"Checkout page with the uploaded files shown in the order summary"}},"plugin_section":[],"plugin_tags":[10652,5887,1722,200324,286],"plugin_category":[45],"plugin_contributors":[267102],"plugin_business_model":[],"class_list":["post-334327","plugin","type-plugin","status-publish","hentry","plugin_tags-cropping","plugin_tags-file-upload","plugin_tags-image-upload","plugin_tags-product-customization","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-nowdigiverse","plugin_committers-nowdigiverse"],"banners":{"banner":"https:\/\/ps.w.org\/nowdigiverse-product-image-upload\/assets\/banner-772x250.png?rev=3601764","banner_2x":"https:\/\/ps.w.org\/nowdigiverse-product-image-upload\/assets\/banner-1544x500.png?rev=3601780","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/nowdigiverse-product-image-upload\/assets\/icon-128x128.png?rev=3601764","icon_2x":"https:\/\/ps.w.org\/nowdigiverse-product-image-upload\/assets\/icon-256x256.png?rev=3601764","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/nowdigiverse-product-image-upload\/assets\/screenshot-1.png?rev=3601764","caption":"Global Settings and Default Settings in the admin area"},{"src":"https:\/\/ps.w.org\/nowdigiverse-product-image-upload\/assets\/screenshot-2.png?rev=3601764","caption":"Frontend upload dialog and the built-in cropping tool with shape presets"},{"src":"https:\/\/ps.w.org\/nowdigiverse-product-image-upload\/assets\/screenshot-3.png?rev=3601764","caption":"Cart page showing the customer's uploaded files on the line item"},{"src":"https:\/\/ps.w.org\/nowdigiverse-product-image-upload\/assets\/screenshot-4.png?rev=3601764","caption":"Checkout page with the uploaded files shown in the order summary"}],"raw_content":"<!--section=description-->\n<p>NDV Product Image Upload for WooCommerce lets both logged-in customers and guests upload and crop custom images (and PDFs) for specific WooCommerce products before adding them to the cart. It is ideal for personalised products, custom prints, photo gifts, and any store where customers supply their own artwork.<\/p>\n\n<p>Everything is configured per product, so each product can have its own required file count, file-size limit, allowed file types, button styling, and cropping rules.<\/p>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li><strong>Guest &amp; logged-in uploads<\/strong> \u2014 customers can upload without creating an account.<\/li>\n<li><strong>Per-product configuration<\/strong> \u2014 set required file count, max file size, allowed types, button text and colour for each product.<\/li>\n<li><strong>Built-in cropping<\/strong> \u2014 crop before uploading with Cropper.js, including shape presets (square, rectangle, circle, heart) and fixed aspect ratios.<\/li>\n<li><strong>PDF upload support<\/strong> \u2014 accept PDFs alongside images.<\/li>\n<li><strong>Resolution validation<\/strong> \u2014 optionally enforce minimum\/maximum image dimensions.<\/li>\n<li><strong>Default settings<\/strong> \u2014 define fallback settings used by products without their own configuration.<\/li>\n<li><strong>Global controls<\/strong> \u2014 hide express checkout buttons (Apple Pay, Google Pay, PayPal Express) on product pages, and auto-clean uploaded images from completed\/cancelled\/refunded orders after a chosen number of days.<\/li>\n<li><strong>Secure file handling<\/strong> \u2014 uploaded files are validated by type, size and content, stored outside the media library, protected with an <code>.htaccess<\/code> rule on Apache\/LiteSpeed, and served through a tokenised endpoint.<\/li>\n<li><strong>HPOS compatible<\/strong> \u2014 works with WooCommerce High-Performance Order Storage.<\/li>\n<li><strong>Data control<\/strong> \u2014 choose whether to keep or delete plugin data on uninstall.<\/li>\n<\/ul>\n\n<h4>Use Cases<\/h4>\n\n<ul>\n<li>Custom T-shirts and apparel \u2014 customers upload their designs<\/li>\n<li>Photo products \u2014 personalised photo books, mugs, or prints<\/li>\n<li>Custom artwork and logo printing<\/li>\n<li>Wedding and event stationery<\/li>\n<\/ul>\n\n<h4>Premium version<\/h4>\n\n<p>A separate <strong>Pro add-on<\/strong> extends this free plugin with:<\/p>\n\n<ul>\n<li>Bulk operations \u2014 apply settings to many products at once<\/li>\n<li>Import \/ Export all settings as JSON<\/li>\n<li>Security Logs dashboard \u2014 monitor upload attempts and events<\/li>\n<li>Dedicated Elementor widget for the upload interface<\/li>\n<li>CDN cache management<\/li>\n<li>Per-upload pricing and fees (charge or discount based on uploads)<\/li>\n<\/ul>\n\n<p>The Pro add-on requires this free plugin and is available from the developer at https:\/\/nowdigiverse.com\/. The free plugin is fully functional on its own.<\/p>\n\n<h3>Privacy Policy<\/h3>\n\n<p>This plugin does not send any data to third parties. Uploaded files are stored on your own server. For guests, a temporary session identifier is created to manage uploads; it is cleaned up when sessions expire or orders complete.<\/p>\n\n<p>During an upload request the visitor's IP address is read from the server and used transiently for rate limiting (a short cooldown between consecutive guest requests). It is not stored permanently and never leaves your server.<\/p>\n\n<h3>Credits<\/h3>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/fengyuanchen\/cropperjs\">Cropper.js<\/a> (MIT) for image cropping<\/li>\n<li><a href=\"https:\/\/github.com\/select2\/select2\">Select2<\/a> (MIT) for the admin product search field<\/li>\n<li>WooCommerce for the e-commerce framework<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/nowdigiverse-product-image-upload<\/code>, or install through the WordPress Plugins screen.<\/li>\n<li>Activate the plugin through the 'Plugins' screen in WordPress.<\/li>\n<li>Ensure WooCommerce is installed and active.<\/li>\n<li>Go to <strong>NDV Image Upload<\/strong> in the admin menu and configure a product under \"Add Configuration\".<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20require%20woocommerce%3F\"><h3>Does this plugin require WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. It integrates with WooCommerce products and the cart, and requires WooCommerce to be installed and active.<\/p><\/dd>\n<dt id=\"can%20guests%20upload%20without%20an%20account%3F\"><h3>Can guests upload without an account?<\/h3><\/dt>\n<dd><p>Yes. Guests can upload using a temporary session identifier; no account is required.<\/p><\/dd>\n<dt id=\"what%20file%20types%20are%20supported%3F\"><h3>What file types are supported?<\/h3><\/dt>\n<dd><p>JPG, JPEG, PNG, GIF, WEBP and PDF. You can enable or disable types per product.<\/p><\/dd>\n<dt id=\"can%20i%20set%20different%20rules%20for%20different%20products%3F\"><h3>Can I set different rules for different products?<\/h3><\/dt>\n<dd><p>Yes. Each product can have its own required file count, file-size limit, allowed types, button styling, cropping and resolution rules. Products without a configuration use your Default Settings.<\/p><\/dd>\n<dt id=\"how%20are%20uploads%20kept%20secure%3F\"><h3>How are uploads kept secure?<\/h3><\/dt>\n<dd><p>Every file is validated by type, size and content (including a scan for executable content), filenames are randomised, files are stored in a protected directory, and they are served through a tokenised endpoint. A short cooldown between consecutive guest requests helps deter abuse.<\/p><\/dd>\n<dt id=\"how%20do%20i%20protect%20the%20uploads%20folder%20on%20nginx%3F\"><h3>How do I protect the uploads folder on Nginx?<\/h3><\/dt>\n<dd><p>Because Nginx ignores <code>.htaccess<\/code>, add this to your server block for strict protection (filenames are already randomised so they cannot be guessed):<\/p>\n\n<pre><code>location ^~ \/wp-content\/uploads\/custom_product_images\/ { deny all; return 403; }\n<\/code><\/pre><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20when%20i%20uninstall%3F\"><h3>What happens to my data when I uninstall?<\/h3><\/dt>\n<dd><p>You choose. On the \"Uninstall Preferences\" tab you can keep all data (default) or delete it on uninstall. Files referenced by orders are preserved either way for data integrity.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial WordPress.org release.<\/li>\n<li>Per-product image\/PDF upload with a built-in cropper (shapes, aspect ratios, zoom\/rotate\/flip).<\/li>\n<li>Guest and logged-in uploads with secure, validated file handling.<\/li>\n<li>Resolution validation, default settings, and global controls (express-checkout hiding, order-image auto-cleanup).<\/li>\n<li>HPOS compatibility and uninstall data preferences.<\/li>\n<\/ul>","raw_excerpt":"Let WooCommerce customers upload and crop images and PDFs on product pages before adding to cart, with per-product rules and secure handling.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/334327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=334327"}],"author":[{"embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/nowdigiverse"}],"wp:attachment":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=334327"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=334327"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=334327"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=334327"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=334327"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=334327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}