{"id":396186,"date":"2026-11-02T10:35:01","date_gmt":"2026-11-02T10:35:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/order-invoice-attach-for-woocommerce\/"},"modified":"2026-11-02T10:34:37","modified_gmt":"2026-11-02T10:34:37","slug":"inference-works-order-invoice-attach","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/inference-works-order-invoice-attach\/","author":3318453,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.0","stable_tag":"1.2.0","tested":"7.1.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Inference Works Order Invoice Attach for WooCommerce","header_author":"Inference Works Sp. z o.o.","header_description":"Attach a ready PDF invoice to selected WooCommerce emails and let customers download it from My Account.","assets_banners_color":"073b42","last_updated":"2026-11-02 10:34:37","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/inference-works-order-invoice-attach\/","header_author_uri":"https:\/\/inferenceworks.eu\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":111,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.0":{"tag":"1.2.0","author":"GrzegorzK","date":"2026-11-02 10:34:37","revision":3779562}},"upgrade_notice":{"1.2.0":"<p>New plugin slug. Deactivate the former Order Invoice Attach installation before activating this version. Existing settings and PDF files remain readable. See the migration guide.<\/p>","1.1.0":"<p>Settings are now under Inference Works \u2192 Order invoices. Existing options and invoices are retained.<\/p>","1.0.3":"<p>Clarifies upload input validation for static analysis by Plugin Check.<\/p>","1.0.2":"<p>WordPress upload API integration and Plugin Check compatibility fixes. Tested with WordPress 7.1.<\/p>","1.0.1":"<p>Fixes a critical error that took the site down after activation.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3779562,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3779562,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3779562,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3779562,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3779562,"resolution":"1","location":"assets","locale":"","width":1890,"height":831},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3779562,"resolution":"2","location":"assets","locale":"","width":1906,"height":817},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3779562,"resolution":"3","location":"assets","locale":"","width":1892,"height":760}},"screenshots":{"1":"Invoice metabox on the order edit screen.","2":"Inference Works \u2192 Order invoices.","3":"Invoice action on My Account \u2192 Orders."}},"plugin_section":[],"plugin_tags":[267,12480,1896,1764,286],"plugin_category":[41,45,50],"plugin_contributors":[283985],"plugin_business_model":[],"class_list":["post-396186","plugin","type-plugin","status-publish","hentry","plugin_tags-email","plugin_tags-invoice","plugin_tags-order","plugin_tags-pdf","plugin_tags-woocommerce","plugin_category-communication","plugin_category-ecommerce","plugin_category-media","plugin_contributors-grzegorzk","plugin_committers-grzegorzk"],"banners":{"banner":"https:\/\/ps.w.org\/inference-works-order-invoice-attach\/assets\/banner-772x250.png?rev=3779562","banner_2x":"https:\/\/ps.w.org\/inference-works-order-invoice-attach\/assets\/banner-1544x500.png?rev=3779562","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/inference-works-order-invoice-attach\/assets\/icon-128x128.png?rev=3779562","icon_2x":"https:\/\/ps.w.org\/inference-works-order-invoice-attach\/assets\/icon-256x256.png?rev=3779562","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/inference-works-order-invoice-attach\/assets\/screenshot-1.png?rev=3779562","caption":"Invoice metabox on the order edit screen."},{"src":"https:\/\/ps.w.org\/inference-works-order-invoice-attach\/assets\/screenshot-2.png?rev=3779562","caption":"Inference Works \u2192 Order invoices."},{"src":"https:\/\/ps.w.org\/inference-works-order-invoice-attach\/assets\/screenshot-3.png?rev=3779562","caption":"Invoice action on My Account \u2192 Orders."}],"raw_content":"<!--section=description-->\n<p>Inference Works Order Invoice Attach for WooCommerce is for shops that issue invoices in an external accounting tool and only need WooCommerce to deliver the finished PDF.<\/p>\n\n<p><strong>This plugin does not generate invoices.<\/strong> It does not talk to any accounting API, assign numbers, or create credit notes. You upload a PDF on the order screen; the plugin stores it privately and attaches it to the emails you choose.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Upload a PDF invoice on the WooCommerce order edit screen (classic and High-Performance Order Storage).<\/li>\n<li>Attach that file to selected customer emails (completed, processing, refunded, or the manual invoice email).<\/li>\n<li>Let the customer download the same file from My Account when a PDF is present.<\/li>\n<li>Warn \u2014 or optionally block a manual status change \u2014 if you try to complete an order with no invoice uploaded.<\/li>\n<li>Store files under a random name inside uploads and provide a permission-checked download endpoint.<\/li>\n<\/ul>\n\n<h4>Storage and security<\/h4>\n\n<p>Files live in <code>wp-content\/uploads\/iwoia-invoices\/{year}\/{month}\/<\/code> with a 32-character random filename. The original name is never used on disk. An <code>index.php<\/code> and <code>.htaccess<\/code> (<code>Deny from all<\/code>) are written in the root folder as extra Apache protection.<\/p>\n\n<p><strong>Nginx ignores <code>.htaccess<\/code>.<\/strong> Configure your server to deny direct public access to the invoice directories. Without such protection, someone who knows a direct PDF URL may bypass the download endpoint. Random names make URLs difficult to guess but do not replace access control. Direct storage URLs are not exposed by this plugin's emails or admin interface.<\/p>\n\n<p>Existing invoices from versions up to 1.1.0 remain in <code>oia-invoices<\/code> and remain readable. New uploads use <code>iwoia-invoices<\/code>. Apply the server access restriction to both directories when upgrading.<\/p>\n\n<p>Download is allowed for shop managers, the logged-in order owner, or anyone with a valid order key (guest links).<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin registers a personal data exporter (reports that an invoice file exists on an order) and an eraser (deletes the file). No remote requests, telemetry, or third-party scripts.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce.<\/li>\n<li>Upload the plugin folder to <code>wp-content\/plugins\/<\/code> or install the zip from Plugins \u2192 Add New.<\/li>\n<li>Activate <strong>Inference Works Order Invoice Attach for WooCommerce<\/strong>.<\/li>\n<li>Open Inference Works \u2192 Order invoices and choose which emails receive the PDF.<\/li>\n<li>On an order, upload the invoice PDF, then change status (or send the customer invoice email) as usual.<\/li>\n<\/ol>\n\n<h4>Upgrading from Order Invoice Attach 1.1.0 or earlier<\/h4>\n\n<p>Deactivate the former plugin before activating this version, which uses the new slug <code>inference-works-order-invoice-attach<\/code>. Do not delete the old plugin with its invoice cleanup option enabled. The new version imports existing settings without overwriting new settings and reads legacy invoice metadata and download links. Existing PDFs are not moved. Activating both versions leaves the new version inactive internally until the old plugin is deactivated, preventing duplicate order and email hooks.<\/p>\n\n<p>The WordPress.org package uses language packs from translate.wordpress.org and does not include bundled PO\/MO translations. Existing source translations are maintained separately for contributors.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20generate%20invoices%3F\"><h3>Does this plugin generate invoices?<\/h3><\/dt>\n<dd><p>No. It never creates a PDF, VAT number, or invoice sequence. Use your accounting software, then upload the finished file on the WooCommerce order.<\/p><\/dd>\n<dt id=\"which%20emails%20get%20the%20attachment%3F\"><h3>Which emails get the attachment?<\/h3><\/dt>\n<dd><p>By default only <strong>Completed order<\/strong>. You can also enable Processing, Refunded, and Customer invoice \/ order details under Inference Works \u2192 Order invoices.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20complete%20an%20order%20without%20uploading%20a%20pdf%3F\"><h3>What happens if I complete an order without uploading a PDF?<\/h3><\/dt>\n<dd><p>The default is a warning: the status still changes, the email goes out without an attachment, and a shop notice plus order note are recorded. You can switch to \u201cblock\u201d so a manual status change is reverted until a PDF is present. Automatic status changes (checkout, REST, WP-CLI, cron) always use warning mode so payments are not stuck.<\/p><\/dd>\n<dt id=\"where%20are%20files%20stored%3F\"><h3>Where are files stored?<\/h3><\/dt>\n<dd><p>In the WordPress uploads directory, in <code>iwoia-invoices<\/code>, with a random hash as the filename. They are not in the media library.<\/p><\/dd>\n<dt id=\"can%20customers%20see%20a%20%E2%80%9Cinvoice%20unavailable%E2%80%9D%20message%3F\"><h3>Can customers see a \u201cinvoice unavailable\u201d message?<\/h3><\/dt>\n<dd><p>No. If no file is uploaded, My Account simply has no Invoice button.<\/p><\/dd>\n<dt id=\"will%20uninstalling%20delete%20invoices%3F\"><h3>Will uninstalling delete invoices?<\/h3><\/dt>\n<dd><p>Only if you enable <strong>Delete files and settings on uninstall<\/strong> in the settings. That option is off by default.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Add distinctive Inference Works branding and a matching plugin slug and text domain.<\/li>\n<li>Replace short internal prefixes and retain compatibility with existing invoice data.<\/li>\n<li>Limit admin notices to relevant screens and omit bundled compiled translations from the WordPress.org package.<\/li>\n<li>Tighten invoice path validation and avoid following directory symlinks during opt-in uninstall cleanup.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Move settings to Inference Works \u2192 Order invoices, with redirects from the old WooCommerce settings tab.<\/li>\n<li>Add the shared Inference Works overview, module registry, matrix icon, and Settings action link.<\/li>\n<li>Keep existing invoice settings, order uploads, HPOS support, and file storage.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Explicitly validate each upload metadata field so Plugin Check can recognize the existing input validation.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Use the WordPress upload API while keeping randomized invoice filenames and the dedicated storage directory.<\/li>\n<li>Verify AJAX nonces in the upload and delete handlers and sanitize upload metadata.<\/li>\n<li>Use automatic loading of WordPress.org translations.<\/li>\n<li>Exclude development and hidden files from the distribution package.<\/li>\n<li>Update tested WordPress version to 7.1 after manual functional verification.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix fatal error on every page: settings class no longer extends WC_Settings_Page before WooCommerce has loaded it.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: PDF upload on orders, email attachments, My Account download, privacy tools.<\/li>\n<\/ul>","raw_excerpt":"Attach a PDF invoice to selected WooCommerce emails and let customers download it from My Account.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/396186","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=396186"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/grzegorzk"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=396186"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=396186"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=396186"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=396186"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=396186"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=396186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}