{"id":285756,"date":"2026-04-16T16:11:29","date_gmt":"2026-04-16T16:11:29","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/zevvo-file-upload-for-woocommerce\/"},"modified":"2026-04-16T16:11:56","modified_gmt":"2026-04-16T16:11:56","slug":"zevvo-file-uploads","status":"publish","type":"plugin","link":"https:\/\/hu.wordpress.org\/plugins\/zevvo-file-uploads\/","author":23378353,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.0","stable_tag":"1.0.0","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Zevvo File Upload for WooCommerce","header_author":"Zevvolabs","header_description":"Allow customers to upload files on product pages and attach them to orders. Secure and easy to use.","assets_banners_color":"ead8ee","last_updated":"2026-04-16 16:11:56","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/zevvo-file-uploads","header_author_uri":"https:\/\/profiles.wordpress.org\/zevvolabs","rating":0,"author_block_rating":0,"active_installs":0,"downloads":97,"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":"zevvolabs","date":"2026-04-16 16:11:56"}},"upgrade_notice":{"1.0.0":"<p>Initial release of Zevvo File Upload for WooCommerce. HPOS-compatible, block-ready file uploads for custom orders.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3508264,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3508264,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3508264,"resolution":"1544x500","location":"assets","locale":"","width":1536,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3508264,"resolution":"772x250","location":"assets","locale":"","width":1394,"height":451}},"assets_blueprints":{},"all_blocks":{"zevvo\/file-upload":{"name":"zevvo\/file-upload","title":"Zevvo File Upload"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[3148,260380,5887,149840,286],"plugin_category":[45],"plugin_contributors":[252188],"plugin_business_model":[],"class_list":["post-285756","plugin","type-plugin","status-publish","hentry","plugin_tags-checkout","plugin_tags-custom-orders","plugin_tags-file-upload","plugin_tags-product-addons","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-zevvolabs","plugin_committers-zevvolabs"],"banners":{"banner":"https:\/\/ps.w.org\/zevvo-file-uploads\/assets\/banner-772x250.png?rev=3508264","banner_2x":"https:\/\/ps.w.org\/zevvo-file-uploads\/assets\/banner-1544x500.png?rev=3508264","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/zevvo-file-uploads\/assets\/icon-128x128.png?rev=3508264","icon_2x":"https:\/\/ps.w.org\/zevvo-file-uploads\/assets\/icon-256x256.png?rev=3508264","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Zevvo File Upload for WooCommerce<\/strong> allows your customers to upload files directly on product pages and have those files automatically attached to their orders. Whether you run a print-on-demand store, a custom gift shop, or any business that needs customer-supplied files, Zevvo handles it securely and smoothly.<\/p>\n\n<p>Built from the ground up for <strong>HPOS (High-Performance Order Storage)<\/strong> compatibility, it works with both the classic and block-based WooCommerce cart and checkout.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Product-Level Configuration<\/strong> \u2014 Enable file uploads per product with its own settings<\/li>\n<li><strong>Required Upload Option<\/strong> \u2014 Mark the upload field as required before adding to cart<\/li>\n<li><strong>Flexible File Types<\/strong> \u2014 Support for JPG, PNG, GIF, WebP, PDF, and ZIP \u2014 toggle per product<\/li>\n<li><strong>File Size Control<\/strong> \u2014 Set maximum file size per product (default: 10 MB)<\/li>\n<li><strong>Multiple Files<\/strong> \u2014 Allow up to 5 files per product upload field<\/li>\n<li><strong>Drag &amp; Drop Interface<\/strong> \u2014 Clean, responsive drag-and-drop upload zone with keyboard support<\/li>\n<li><strong>File Previews<\/strong> \u2014 In-browser image and PDF previews before upload<\/li>\n<li><strong>Thumbnail Previews in Cart &amp; Orders<\/strong> \u2014 Image thumbnails and file icons in cart, checkout, and order pages<\/li>\n<li><strong>Admin File Dashboard<\/strong> \u2014 View, download, trash, and permanently delete all uploaded files from one screen<\/li>\n<li><strong>CSV Export<\/strong> \u2014 Export all uploaded file data to CSV for reporting<\/li>\n<li><strong>Trash &amp; Restore<\/strong> \u2014 Soft-delete files with one-click restore from trash<\/li>\n<li><strong>Automatic Cleanup<\/strong> \u2014 Daily cron job removes orphaned pending files (older than 24 hours)<\/li>\n<li><strong>Order Integration<\/strong> \u2014 Files automatically attach to orders at checkout and display in order details<\/li>\n<li><strong>Email Notifications<\/strong> \u2014 File thumbnails and icons included in WooCommerce order confirmation emails<\/li>\n<li><strong>HPOS Compatible<\/strong> \u2014 Full support for WooCommerce High-Performance Order Storage<\/li>\n<li><strong>Blocks Compatible<\/strong> \u2014 Works with Gutenberg block-based cart and checkout<\/li>\n<li><strong>Secure Storage<\/strong> \u2014 Files stored with randomized names in a protected directory (.htaccess + index.php)<\/li>\n<li><strong>Developer Hooks<\/strong> \u2014 Filters and actions for extending behavior without modifying plugin files<\/li>\n<\/ul>\n\n<h4>Perfect For<\/h4>\n\n<ul>\n<li>Print-on-demand stores (T-shirts, mugs, posters, etc.)<\/li>\n<li>Custom engraving or embroidery shops<\/li>\n<li>Personalized gift and keepsake stores<\/li>\n<li>Photo printing and canvas services<\/li>\n<li>Graphic design and artwork commissions<\/li>\n<li>Legal, medical, or document processing services<\/li>\n<li>Any WooCommerce store that needs customer-supplied files<\/li>\n<\/ul>\n\n<h4>Security &amp; Reliability<\/h4>\n\n<ul>\n<li>Strict MIME type validation using WordPress's <code>wp_check_filetype_and_ext()<\/code><\/li>\n<li>Server-side re-validation on every upload request<\/li>\n<li>Files stored with MD5-hashed filenames \u2014 original names are never exposed on disk<\/li>\n<li>Upload directory protected with <code>.htaccess<\/code> (denies PHP execution + directory listing)<\/li>\n<li><code>index.php<\/code> sentinel file prevents directory browsing on all servers<\/li>\n<li>Per-session upload abuse limit (configurable via filter) prevents server exhaustion<\/li>\n<li>Per-page-load context ID system enforces per-product file count limits strictly<\/li>\n<li>Nonce verification on all AJAX requests and form submissions<\/li>\n<li>GDPR-friendly: automatic cleanup of pending (unattached) files via daily cron<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/zevvo-file-uploads<\/code>, or install directly through the WordPress plugins screen<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress<\/li>\n<li>Click <strong>Settings<\/strong> under the plugin name on the Plugins page, or go to <strong>WooCommerce \u2192 Zevvo Uploads<\/strong><\/li>\n<li>Edit any WooCommerce product and find the <strong>Zevvo File Uploads<\/strong> metabox in the product sidebar<\/li>\n<li>Check <strong>Enable File Uploads<\/strong>, choose allowed file types, set size and count limits, then save<\/li>\n<li>Customers will now see the upload field on that product's page<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20this%20compatible%20with%20hpos%3F\"><h3>Is this compatible with HPOS?<\/h3><\/dt>\n<dd><p>Yes. Zevvo File Upload is built specifically for WooCommerce's High-Performance Order Storage (HPOS) and works with both HPOS and legacy (post-based) order storage.<\/p><\/dd>\n<dt id=\"what%20file%20types%20are%20supported%3F\"><h3>What file types are supported?<\/h3><\/dt>\n<dd><p>The plugin supports JPG, PNG, GIF, WebP, PDF, and ZIP. Each file type can be toggled on or off per product from the product metabox.<\/p><\/dd>\n<dt id=\"where%20are%20files%20stored%3F\"><h3>Where are files stored?<\/h3><\/dt>\n<dd><p>Files are stored in your WordPress uploads directory at <code>wp-content\/uploads\/zevvo_uploads\/<\/code>. Filenames are randomized (MD5 hash) for security. The directory is protected with <code>.htaccess<\/code> rules that prevent PHP execution and directory listing.<\/p>\n\n<p><strong>Note for Nginx users:<\/strong> <code>.htaccess<\/code> rules don't apply on Nginx. Files are still protected by random hashed names, but we recommend configuring your Nginx server block to deny direct access to the <code>zevvo_uploads<\/code> directory for additional protection.<\/p><\/dd>\n<dt id=\"can%20i%20set%20a%20file%20size%20limit%3F\"><h3>Can I set a file size limit?<\/h3><\/dt>\n<dd><p>Yes. Each product has its own maximum file size setting (in MB). The default is 10 MB.<\/p><\/dd>\n<dt id=\"how%20do%20i%20view%20uploaded%20files%3F\"><h3>How do I view uploaded files?<\/h3><\/dt>\n<dd><p>Go to <strong>WooCommerce \u2192 Zevvo Uploads<\/strong> in your admin. You'll see all uploaded files with options to view (with in-admin preview), download, move to trash, or permanently delete.<\/p><\/dd>\n<dt id=\"are%20files%20shown%20in%20order%20emails%3F\"><h3>Are files shown in order emails?<\/h3><\/dt>\n<dd><p>Yes. Image uploads appear as thumbnail previews and documents (PDF, ZIP) appear as file icons in WooCommerce order confirmation emails sent to both customers and admins.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20files%20when%20an%20order%20is%20cancelled%3F\"><h3>What happens to files when an order is cancelled?<\/h3><\/dt>\n<dd><p>Files remain in the system and stay attached to the order. You can manually delete them from the admin dashboard.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20variable%20products%3F\"><h3>Does this work with variable products?<\/h3><\/dt>\n<dd><p>Yes. File upload settings are configured on the parent product and apply to all variations.<\/p><\/dd>\n<dt id=\"can%20customers%20upload%20multiple%20files%3F\"><h3>Can customers upload multiple files?<\/h3><\/dt>\n<dd><p>Yes. You can allow 1 to 5 files per product. The upload field displays a counter showing how many files have been selected out of the allowed maximum.<\/p><\/dd>\n<dt id=\"can%20i%20make%20the%20upload%20field%20required%3F\"><h3>Can I make the upload field required?<\/h3><\/dt>\n<dd><p>Yes. Check the <strong>Required Field<\/strong> option in the product metabox. Customers will not be able to add the product to cart without uploading at least one file.<\/p><\/dd>\n<dt id=\"is%20there%20a%20file%20upload%20limit%20per%20order%3F\"><h3>Is there a file upload limit per order?<\/h3><\/dt>\n<dd><p>No order-level limit. Each product in the cart can have its own independent file upload configuration.<\/p><\/dd>\n<dt id=\"what%20about%20theme%20compatibility%3F\"><h3>What about theme compatibility?<\/h3><\/dt>\n<dd><p>The plugin works with any properly-coded WooCommerce theme. It uses standard WooCommerce hooks for classic themes, and includes Store API integration for block-based cart and checkout.<\/p><\/dd>\n<dt id=\"can%20i%20export%20uploaded%20files%20data%3F\"><h3>Can I export uploaded files data?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>WooCommerce \u2192 Zevvo Uploads<\/strong>, navigate to the <strong>Process Uploads<\/strong> tab, and click the <strong>Export CSV<\/strong> button to download all file records as a CSV file.<\/p><\/dd>\n<dt id=\"how%20does%20automatic%20cleanup%20work%3F\"><h3>How does automatic cleanup work?<\/h3><\/dt>\n<dd><p>A daily WordPress cron job removes \"pending\" files (uploaded but never attached to an order) that are older than 24 hours. This prevents orphaned files from accumulating on your server. The retention period for <em>attached<\/em> files is configurable in the plugin settings.<\/p><\/dd>\n<dt id=\"how%20do%20i%20customize%20file%20upload%20behavior%20with%20code%3F\"><h3>How do I customize file upload behavior with code?<\/h3><\/dt>\n<dd><p>The plugin provides the following filters and actions for developers:<\/p>\n\n<p><strong>Filters:<\/strong>\n* <code>zevvo_allowed_file_types<\/code> \u2014 Modify allowed MIME types for a product <code>($types, $product_id)<\/code>\n* <code>zevvo_max_upload_size<\/code> \u2014 Modify the maximum file size in MB <code>($size_mb, $product_id)<\/code>\n* <code>zevvo_max_files_count<\/code> \u2014 Modify the maximum number of files <code>($max_files, $product_id)<\/code>\n* <code>zevvo_session_abuse_limit<\/code> \u2014 Change the per-session global upload ceiling <code>($limit)<\/code><\/p>\n\n<p><strong>Actions:<\/strong>\n* <code>zevvo_validate_upload<\/code> \u2014 Run custom validation before a file is saved <code>($file, $post_id)<\/code><\/p>\n\n<p>See the <code>docs\/DEVELOPER-HOOKS.md<\/code> file in the plugin directory for usage examples.<\/p><\/dd>\n<dt id=\"is%20this%20gdpr%20compliant%3F\"><h3>Is this GDPR compliant?<\/h3><\/dt>\n<dd><p>Yes. Pending (unattached) files are automatically deleted after 24 hours. Attached files are stored only as long as needed for order processing, and you can configure automatic deletion after a set number of days in the plugin settings.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20gutenberg%20blocks%3F\"><h3>Does it work with Gutenberg blocks?<\/h3><\/dt>\n<dd><p>Yes. The plugin includes a Gutenberg block for product pages and is fully compatible with the WooCommerce block-based cart and checkout via the Store API integration.<\/p><\/dd>\n<dt id=\"what%20if%20i%20need%20help%3F\"><h3>What if I need help?<\/h3><\/dt>\n<dd><p>Use the WordPress.org support forum for this plugin.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Per-product file upload configuration with enable\/disable toggle<\/li>\n<li>Required upload field option \u2014 prevents add-to-cart without a file<\/li>\n<li>Support for JPG, PNG, GIF, WebP, PDF, and ZIP file types<\/li>\n<li>Drag-and-drop upload zone with keyboard accessibility and in-browser file preview<\/li>\n<li>Up to 5 files per product<\/li>\n<li>Admin dashboard with file view, download, trash, restore, and permanent delete<\/li>\n<li>CSV export of all upload records<\/li>\n<li>Thumbnail previews in cart, checkout, and order detail pages<\/li>\n<li>File previews (thumbnails + icons) in WooCommerce order emails<\/li>\n<li>HPOS (High-Performance Order Storage) compatibility declared<\/li>\n<li>Block-based cart and checkout support via WooCommerce Store API<\/li>\n<li>Secure file storage: randomized (hashed) filenames, protected upload directory<\/li>\n<li>Per-session abuse limit and per-page-load context ID for strict file count enforcement<\/li>\n<li>Automatic daily cron cleanup of orphaned pending files<\/li>\n<li>Developer filters: <code>zevvo_allowed_file_types<\/code>, <code>zevvo_max_upload_size<\/code>, <code>zevvo_max_files_count<\/code>, <code>zevvo_session_abuse_limit<\/code><\/li>\n<li>Developer action: <code>zevvo_validate_upload<\/code><\/li>\n<li>Mobile-responsive interface<\/li>\n<\/ul>","raw_excerpt":"HPOS-compatible file uploads for WooCommerce. Let customers upload files on product pages. Secure, lightweight, and built for custom orders.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/285756","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=285756"}],"author":[{"embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/zevvolabs"}],"wp:attachment":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=285756"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=285756"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=285756"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=285756"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=285756"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=285756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}