# QDR — Studiou WC Order Print Statuses WordPress plugin that extends WooCommerce with a dedicated workflow for managing print orders sent to third-party print providers. It adds custom order statuses, tracking fields, CSV export, protocol-based CSV imports, and search/filter capabilities tailored to a print fulfillment pipeline. - **Plugin slug / text domain:** `studiou-wc-ord-print-statuses` - **Current version:** 1.3.2 - **Author:** Dalibor Votruba — [quadarax.com](https://www.quadarax.com) - **License:** GPL v2 or later --- ## Requirements | Component | Minimum | Tested up to | |-------------|---------|--------------| | WordPress | 5.8 | 6.8.3 | | WooCommerce | 3.0 | 10.2.2 | | PHP | 7.2 | — | Compatible with WooCommerce **High-Performance Order Storage (HPOS)** — the plugin declares `custom_order_tables` compatibility and queries the HPOS `wc_orders` table directly. --- ## Installation 1. Copy the `studiou-wc-ord-print-statuses` folder into `wp-content/plugins/`. 2. Make sure WooCommerce is installed and active. 3. Activate the plugin from **Plugins** in the WordPress admin. No additional setup is required — custom statuses, fields, columns, and bulk actions are registered on activation. --- ## Features ### 1. Custom order statuses Two new statuses are inserted in the WooCommerce status pipeline, right after `processing`: | Slug | Label | Purpose | |---------------|----------------------|-------------------------------------------------| | `wc-to-print` | Prepare to Printing | Order is queued and exported to the print shop. | | `wc-in-print` | In Printing | Print shop has accepted the order. | Status transitions automatically stamp the related metadata field (`to_print_date` / `in_print_date`) with the current server time. ### 2. Print Information fields on the order edit page A new **Print Information** panel is added to the order details screen with four editable fields: - **Prepare To Print Date** (`to_print_date`) - **In Print Date** (`in_print_date`) - **External Order Number** (`external_ref_ord_no`) - **External Order Delivered** (`external_ref_ord_delivered`) An additional internal field `external_ref_ord_date` is populated during InPrint protocol imports. ### 3. Bulk actions on the Orders list Available in the **Bulk actions** dropdown on **WooCommerce → Orders**: - **Prepare to Printing Export** — runs the print-shop export SQL across the selected orders, streams the result as a CSV download, and moves every selected order to `wc-to-print`. - **Set Status to Prepare to Printing** — moves selected orders to `wc-to-print` and stamps `to_print_date`. - **Set Status to In Printing** — moves selected orders to `wc-in-print` and stamps `in_print_date`. ### 4. Extra columns in the Orders list Three columns are appended after **Total**: - **To Print Date** - **In Print Date** - **External Order Number** ### 5. Search by External Order Number The Orders list gains a search input that filters orders on the `external_ref_ord_no` meta value (LIKE match). ### 6. Protocol imports A **WooCommerce → Import Protocols** submenu exposes two CSV upload forms: - **Import InPrint Protocol** — for every row in the file, the matching order is set to `wc-in-print` and the external reference number / date are saved. - **Import Delivered Protocol** — for every row in the file, the matching order is set to `wc-completed` and the delivery timestamp is recorded. Both importers require the `manage_woocommerce` capability and are protected by WordPress nonces. --- ## CSV formats ### Export — Prepare to Printing Generated file: `prepare_to_printing_export.csv` Columns (in order): ``` order_no, prod_cat, prod_name, prod_var, prod_var_type, prod_img_url, qty, email ``` `prod_var_type` is sourced from the variation's `attribute_pa_format` postmeta, resolved against the `wp_terms` table. ### Import — InPrint Protocol Required headers (case-sensitive): ``` order_no, externalorder, externalorderdate ``` Effect per row: order → status `wc-in-print`, sets `in_print_date` (now), `external_ref_ord_no`, `external_ref_ord_date`. ### Import — Delivered Protocol Required header: ``` order_no ``` Effect per row: order → status `wc-completed`, sets `external_ref_ord_delivered` (now). --- ## Architecture The plugin follows a manager-based pattern. The main bootstrapper (`studiou-wc-ord-print-statuses.php`) wires up specialised classes, each owning one slice of behaviour: | Class | File | Responsibility | |---------------------------|--------------------------------------------|--------------------------------------------------| | `Order_Status_Manager` | `includes/class-order-status-manager.php` | Register custom statuses, handle transitions. | | `Order_Fields_Manager` | `includes/class-order-fields-manager.php` | Render and persist Print Information fields. | | `Bulk_Actions_Manager` | `includes/class-bulk-actions-manager.php` | Register and dispatch bulk actions. | | `Custom_Columns_Manager` | `includes/class-custom-columns-manager.php`| Inject extra columns into the Orders list. | | `Import_Manager` | `includes/class-import-manager.php` | Admin UI + handlers for protocol CSV imports. | | `Order_Search_Manager` | `includes/class-order-search-manager.php` | Extend order search to external reference no. | | `Studiou_DB_Manager` | `includes/class-db-manager.php` | All SQL and protocol-processing logic. | | `UtilsLog` | `includes/utils-log.php` | Lightweight logging helper (uses `WP_DEBUG`). | The export query in `Studiou_DB_Manager::get_orders_for_printing()` joins `wc_orders`, `wc_order_product_lookup`, `posts` (products + variations), `postmeta` (variation attribute + thumbnail), `terms`, `term_taxonomy`, and `term_relationships` to assemble the print-shop payload in a single round-trip. --- ## Internationalization - Text domain: `studiou-wc-ord-print-statuses` - Translation files: `languages/` - Bundled locales: **Czech (`cs_CZ`)** — see `docs/translations.txt` for the EN→CS reference list. Use the standard WordPress functions (`__()`, `_e()`, `_x()`, `_n_noop()`) for any new strings. --- ## Logging `UtilsLog::log($message)` writes to the WordPress error log when `WP_DEBUG` is enabled. With `WP_DEBUG_LOG` on, log output ends up in `wp-content/debug.log`. The plugin logs initialization, dependency loading, status changes, bulk actions, and SQL failures. --- ## Project layout ``` studiou-wc-ord-print-statuses/ ├── studiou-wc-ord-print-statuses.php # Plugin bootstrap (header + main class) ├── includes/ │ ├── class-db-manager.php │ ├── class-order-status-manager.php │ ├── class-order-fields-manager.php │ ├── class-order-search-manager.php │ ├── class-bulk-actions-manager.php │ ├── class-custom-columns-manager.php │ ├── class-import-manager.php │ └── utils-log.php ├── languages/ # .po / .mo translation files ├── docs/ # Project documentation (see below) ├── README.md # This file └── CLAUDE.md # Guidance for Claude Code sessions ``` --- ## Documentation Reference documents live under [`docs/`](docs/): - [`docs/readme.md`](docs/readme.md) — Previous user-facing readme (kept for history). - [`docs/instructions.txt`](docs/instructions.txt) — Original feature specification used to scaffold the plugin. - [`docs/translations.txt`](docs/translations.txt) — EN → CS translation reference. Project-internal guidance for AI-assisted development is documented in [`CLAUDE.md`](CLAUDE.md). --- ## Changelog ### 1.3.2 — 2025-10-18 - **Fixed:** `prod_var_type` column was empty in `prepare_to_printing_export.csv`. Variation attribute is now resolved through `postmeta.attribute_pa_format` joined against `wp_terms.name`. - **Fixed:** HPOS incompatibility warning. Plugin now explicitly declares `custom_order_tables` compatibility. - **Tested:** WordPress 6.8.3, WooCommerce 10.2.2 with HPOS enabled. ### 1.3.1 - Previous stable release. --- ## Support For bug reports, feature requests or commercial support, contact **[quadarax.com](https://www.quadarax.com)**. --- ## License Released under the **GNU General Public License v2.0 or later** — see [https://www.gnu.org/licenses/gpl-2.0.html](https://www.gnu.org/licenses/gpl-2.0.html).