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.
studiou-wc-ord-print-statuses| Component | Minimum | Tested up to |
|---|---|---|
| WordPress | 5.8 | 6.9.4 |
| WooCommerce | 3.0 | 10.7.0 |
| 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.
studiou-wc-ord-print-statuses folder into wp-content/plugins/.No additional setup is required — custom statuses, fields, columns, and bulk actions are registered on activation.
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.
A new Print Information panel is added to the order details screen with four editable fields:
to_print_date)in_print_date)external_ref_ord_no)external_ref_ord_date) — populated by InPrint protocol imports.external_ref_ord_delivered)Available in the Bulk actions dropdown on WooCommerce → Orders:
wc-to-print.wc-to-print and stamps to_print_date.wc-in-print and stamps in_print_date.Three columns are appended after Total:
The standard WooCommerce Search orders input also matches the external_ref_ord_no meta value — no separate input is required. Works under both legacy CPT storage and HPOS (woocommerce_shop_order_search_fields and woocommerce_order_table_search_query_meta_keys filters).
A WooCommerce → Import Protocols submenu exposes two CSV upload forms:
wc-in-print and the external reference number / date are saved.wc-completed and the delivery timestamp is recorded.Both importers require the manage_woocommerce capability and are protected by WordPress nonces.
Generated file: prepare_to_printing_export.csv (UTF-8 with BOM — opens correctly in Excel on Windows).
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.prod_cat is a comma-separated list (deduplicated) when a product belongs to multiple product_cat terms — the row itself is not duplicated.Headers are normalised on read: column names are lowercased and internal whitespace is collapsed to underscore. Both the original spec casing (Order No, ExternalOrder, ExternalOrderDate) and the documented lowercase form (order_no, externalorder, externalorderdate) work. Rows are also deduplicated by order_no before processing.
Required headers (any of the accepted casings):
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 (parsed from the CSV). Orders in a terminal status (completed, cancelled, refunded, failed) are skipped with a per-row error notice.
Required header:
order_no
Effect per row: order → status wc-completed, sets external_ref_ord_delivered (now).
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.
studiou-wc-ord-print-statuseslanguages/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.
UtilsLog::log($message) writes to the WordPress error log when WP_DEBUG is enabled (guarded as defined('WP_DEBUG') && WP_DEBUG — works for both boolean and integer truthy values). With WP_DEBUG_LOG on, log output ends up in wp-content/debug.log.UtilsLog::message($message, $type) queues a dismissible WordPress admin notice (info / success / warning / error) for the current user. Notices are stored in a per-user transient (60-second TTL) so they survive the redirect that follows bulk actions and imports. Used to report success counts, skipped orders, malformed CSV rows, etc.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
Reference documents live under docs/:
docs/readme.md — Previous user-facing readme (kept for history).docs/instructions.txt — Original feature specification used to scaffold the plugin.docs/translations.txt — EN → CS translation reference.docs/revise-1.3.2.md — Analytical review of v1.3.2 (all findings addressed in 1.4.0).Project-internal guidance for AI-assisted development is documented in CLAUDE.md.
Resolution of every finding catalogued in docs/revise-1.3.2.md. Highlights:
external_ref_ord_no consistently, no _ prefix), and the integration uses WooCommerce's own search filters (woocommerce_shop_order_search_fields for legacy CPT and woocommerce_order_table_search_query_meta_keys for HPOS). No separate UI input — typing the external order number into the standard Search orders box finds the order.Order_Status_Manager::handle_status_transitions() now writes timestamps via wc_get_order()->update_meta_data() instead of update_post_meta(). Print-date stamps are no longer silently lost under HPOS for non-bulk status transitions.order_no (per the original spec) and accept both the spec's title-case headers and the lowercase form documented in the README.charset=utf-8 header + leading \xEF\xBB\xBF). Czech diacritics render correctly in Excel on Windows.product_cat terms — categories are concatenated via GROUP_CONCAT(DISTINCT …) inside a GROUP BY per line item.$wpdb->prepare() with %d placeholders rather than relying on intval() for safety.woocommerce_payment_complete events no longer demote orders already in to-print or in-print back to processing. The guard extends to all print statuses plus completed.current_user_can('edit_shop_orders'). Imports keep their existing manage_woocommerce guard.completed, cancelled, refunded, failed) instead of silently reactivating them.UtilsLog::log() guard is now defined('WP_DEBUG') && WP_DEBUG (previously true === WP_DEBUG, which failed when WP_DEBUG was defined as integer 1).UtilsLog::message() is now implemented as a per-user transient that renders via the admin_notices hook. Bulk actions and imports now produce visible user feedback after the redirect.parse_csv() no longer truncates rows at 1000 bytes (passes 0 to fgetcsv), validates that the header row is non-empty, normalises header casing, and skips rows whose column count diverges from the header.$_FILES[...]['error'] and is_uploaded_file() server-side instead of relying solely on the client-side accept=".csv" attribute.external_ref_ord_date is parsed via strtotime() and stored in MySQL datetime format; if parsing fails the raw value is retained.external_ref_ord_date is now rendered in the Print Information panel on the order edit screen.STUDIOU_WC_OPS_VERSION and STUDIOU_WC_OPS_FILE constants for code-side version references.plugins_loaded priorities (5 and 10) so translations are guaranteed to load before any manager instantiates.// visualized leftover comments and the dead-code commented body of UtilsLog::message().CLAUDE.md updated, docs/translations.txt extended with the strings that were missing.Translations: the
.pofile ships new strings; the.mofile must be rebuilt (e.g. viawp i18n make-mo languages/or Poedit) before the new Czech wording is visible. This release does not regenerate the binary.
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.custom_order_tables compatibility.For bug reports, feature requests or commercial support, contact quadarax.com.
Released under the GNU General Public License v2.0 or later — see https://www.gnu.org/licenses/gpl-2.0.html.