Direct answer
Change only the visible value for an existing native status key in WooCommerce's wc_order_statuses array. Keep the key, array position, order records, transitions, emails, stock actions, reports, and integrations unchanged. If the configured key is missing or invalid, return the complete incoming array unchanged.
Rename Order Statuses for WooCommerce follows that label-only boundary. Free renames one of seven native statuses. Pro can rename all seven and transfer only those mappings as bounded local JSON.
A label is not a workflow
Suppose a store team understands Packing more quickly than Processing. There are two very different implementations:
| Approach | What changes | Operational risk |
|---|---|---|
| Rename the visible label | wc-processing still exists and behaves normally |
Bounded display compatibility |
| Create a new Packing status | New key, transitions, emails, stock rules, reports, and integrations | Full order-workflow ownership |
If the team only needs familiar words, creating a new status expands the problem unnecessarily.
The official WooCommerce order status guide explains that native statuses represent stages in the order lifecycle. The words shown to a manager are related to that lifecycle, but replacing those words does not need to create a new stage.
Public support reports illustrate the distinction. One report says a plugin forced native labels into English and restricted renaming. Another reports a custom status missing from an email customizer. A separate merchant reported a deleted custom status remaining as an empty option. These are individual incidents, not proof of a universal defect. They show why a label-only product should never register or delete a status.
Keep the native keys intact
WooCommerce native keys include:
wc-pendingwc-processingwc-on-holdwc-completedwc-cancelledwc-refundedwc-failed
Those identifiers can be used by orders, payment gateways, automation, emails, stock handling, analytics, and integrations. A display helper should never replace wc-processing with a made-up wc-packing key merely because the label says Packing.
WooCommerce's current wc-order-functions.php source is an authoritative implementation reference for status helpers. The key lesson for a narrow plugin is ownership: WooCommerce owns status behavior; StoreFixKit can own only the configured display value.
Apply the smallest possible mapping
A safe filter algorithm is short:
- Confirm the incoming value is an array.
- Sanitize stored settings into one allowlisted key and one label from 1 through 40 characters.
- Confirm that exact key already exists in the incoming array.
- Copy the array.
- Replace only that value.
- Return the copy with the same keys, order, and item count.
Unknown third-party statuses remain untouched. A stale setting for a status that no longer exists does not recreate it. A malformed label does not produce an empty item.
Rename one label safely
- Back up the database and retain the current plugin ZIP.
- Open WooCommerce > Rename Order Statuses.
- Select one of the seven native statuses.
- Enter plain words the team understands, such as Packing.
- Save the setting.
- Open WooCommerce > Orders.
- Inspect an existing order already in that native status.
- Confirm the visible words changed without editing the order.
- Clear the setting or deactivate Free and confirm the native words return.
Do not move a real order between statuses solely to test display text. The plugin's primary value can be verified from an existing order or a disposable fixture without creating a commercial transition.
Diagnose inconsistent wording
| Symptom | Check first | Safe expected result |
|---|---|---|
| Native order list did not change | Saved key, non-empty label, cache | Exact native key shows the configured value |
| Email still uses old words | Whether the renderer uses wc_order_statuses |
Unsupported renderer stays unchanged |
| A third-party status disappeared | Provider registration and plugin state | StoreFixKit preserves every incoming third-party item |
| Workflow or email fired | Order history, automation, gateway callback | Label-only filter caused no transition |
| Empty status appears | Status provider and stale custom key | StoreFixKit never registers or deletes a status |
| Translation differs elsewhere | Text-domain and renderer ownership | No global string replacement is attempted |
The first diagnostic checkpoint is WooCommerce's native order list. If the new words appear there but not in a PDF, email builder, mobile app, or external ERP, that surface uses another source. Replacing every matching string globally would risk changing unrelated text and still would not update remote systems reliably.
Expand to seven labels without expanding the workflow
Pro can expose one field for each of the seven native keys. It still follows the same label-only algorithm. Free remains authoritative for its selected key, so a billing or license outage cannot remove the useful Free rename.
Local JSON transfer can reduce repetitive setup, but it needs a strict boundary:
- accept no more than 4,096 bytes;
- decode as data, never execute it;
- retain only a top-level
mappingsobject; - allow only seven known keys;
- sanitize every value as plain text;
- cap each label at 40 characters;
- discard invalid or excessive input;
- never include orders, customers, emails, or credentials.
Export before import. A local settings transfer is not a backup of WooCommerce orders or workflow state.
Understand compatibility honestly
The wc_order_statuses filter is a shared label surface. Many native WooCommerce screens use it, but not every theme, email customizer, PDF generator, mobile client, or remote integration must do so.
A safe product promise is therefore:
- the native filtered label changes;
- keys and behavior do not;
- unsupported renderers remain untouched;
- no broad text replacement or template rewrite is attempted.
This is more useful than claiming “renames statuses everywhere,” which cannot be proven across an open plugin ecosystem.
Test the negative space
The most important checks prove what did not change:
- Array keys and positions are identical before and after filtering.
- Only the selected value differs.
- Unknown and third-party statuses remain intact.
- No order query or write occurs.
- No HPOS row changes.
- No email, stock action, payment, refund, webhook, or transition runs.
- Invalid settings return the incoming array unchanged.
- WooCommerce missing causes no fatal error.
- Pro unavailable leaves Free working.
- Deactivation restores native words immediately.
- Update, downgrade, rollback, and uninstall preserve order data.
- Admin controls have associated labels and keyboard access.
The StoreFixKit 0.1.2 release drill exercised those lifecycle boundaries on a real WordPress and WooCommerce installation. Packaged Plugin Check reported zero errors and zero warnings across Free and Pro, and the UI run captured real native order-list output. This evidence does not guarantee that every third-party renderer uses the same filter.
Resource and privacy boundary
A label map needs one bounded local option read. It does not need an order query, custom table, cron task, queue, telemetry event, frontend asset, or public StoreFixKit request. The plugin should not inspect order contents to decide how a label reads.
In the Batch 14 measured product-page run, all six Free and Pro plugins together added one database query at the median and P95, 2 MB of measured PHP memory, no plugin HTTP call, no owned-state write, and no unrelated frontend asset across 25 active and 25 inactive requests. Repeat the benchmark on the actual operations screen and production stack when local traffic patterns require it.
Common mistakes
Creating a new status for new words
That changes workflow ownership. Rename the value when the key's behavior should stay the same.
Searching and replacing the word everywhere
Global replacement can affect unrelated text, translations, templates, and customer-facing copy.
Assuming the label changes automation
Automation should continue to read the native key. A new label is not a new trigger.
Querying orders to build the settings page
The seven native keys are bounded. No customer or order data is needed to configure their labels.
Importing arbitrary JSON
Unbounded data can consume memory, retain unknown fields, or overwrite unintended settings. Cap, allowlist, sanitize, and fail closed.
Market boundary
The official WooCommerce Marketplace has a current Order Status Manager offer, and WordPress.org has established status plugins. That proves a paid broader category exists. It does not prove StoreFixKit demand, conversion, or revenue.
The narrower hypothesis is that nontechnical teams will pay for clearer native words without adopting a workflow engine. Measure legitimate installs, completed label changes, trial starts, paid conversions, refunds, renewals, and support minutes. Do not inherit demand from a full status manager or claim a $10,000 monthly outcome before StoreFixKit's own funnel proves it.
FAQ
Can I rename Processing to Packing in WooCommerce?
Yes. Replace only the visible value associated with wc-processing and keep the key and behavior unchanged.
Will renaming a status trigger emails or stock changes?
Not in this design. It does not transition an order or write order data.
Can I create a new custom status?
No. This focused product deliberately renames existing native labels only.
Why does an email or PDF still show the old words?
That renderer may not use WooCommerce's filtered status-label array. StoreFixKit does not rewrite third-party templates or remote systems.
What happens when the plugin is deactivated?
Its filter disappears immediately, so WooCommerce's native labels return. Saved owned settings can remain dormant for recovery until explicit cleanup is requested.
Focused plugin
Use the one-job implementation.
Rename the visible words for existing native WooCommerce order statuses without changing status keys, orders, transitions, emails, stock actions, reports, integrations, or customer data.