How to Filter WooCommerce Orders by Status in a Frontend Table

Updated July 2026 • 6 min read • By Fahad Murtaza

TableCrafter live search, sorting, filtering, and pagination out of the box
TableCrafter live search, sorting, filtering, and pagination out of the box

Filtering WooCommerce orders by status, Pending, Processing, Completed, Refunded, is the single most common operation in an order management workflow. TableCrafter supports both single-select and multi-select status filters on the frontend, with configurable defaults and the ability to chain a date range filter alongside the status filter. This guide covers the complete setup. WordPress powers 43% of all websites globally (W3Techs, July 2026), and TableCrafter bridges the gap between the data you collect and the tables your users need to see, no custom PHP, no dashboard access required for viewers, and no per-row limits on the free tier. The free version on WordPress.org supports CSV, JSON, Google Sheets, and Excel. Pro adds Gravity Forms, Airtable, Notion, WooCommerce, REST APIs, inline cell editing, export to CSV/PDF, role-based column visibility, and auto-refresh. Every table embeds on any page with a [tablecrafter] shortcode or the native Gutenberg block. Search and filter functionality increases dataset usability by 47% for non-technical end users (Nielsen Norman Group, 2023).

How WooCommerce Order Status Works in TableCrafter?

WooCommerce stores order status as a string in the order_status field. The standard statuses are:

Plugins can register additional custom statuses (for example, wc-awaiting-shipment). TableCrafter reads all registered statuses from WooCommerce at table render time, so custom statuses appear in the filter options automatically without any extra configuration.

The shortcode accepts all column and filter settings defined in the table builder as defaults, but you can override individual parameters inline. For example, `[tablecrafter id="1" per_page="25"]` overrides the default rows-per-page setting for this specific embed without changing the saved table configuration. This lets you reuse one table definition across multiple pages with different display requirements.

What Is Option A: Single-Select Status Filter (Dropdown)?

A single-select dropdown is the right choice when users typically want to see one status at a time, for example, a team that works through Processing orders before moving to the next status.

In your table config, go to Filters → Add Filter:

Save the config. The shortcode for a table with this filter:

This configuration interacts with any caching or CDN layer active on your WordPress installation. If you use WP Rocket, LiteSpeed Cache, or a CDN such as Cloudflare, flush the page cache after making this change to ensure the updated configuration is reflected in the cached HTML served to visitors. TableCrafter's server-side output is regenerated on the next uncached request.

[tablecrafter id="3" filter="true"]

What Is Option B: Multi-Select Status Filter?

A multi-select filter lets users pick several statuses simultaneously, for example, viewing both Pending and On Hold orders together. This is the better default for most management workflows because statuses that need attention often span multiple values.

In Filters → Add Filter, change the filter type:

The multi-select filter renders as a checkbox dropdown in the table toolbar. Users click the filter button, see all status options with checkboxes, select any combination, and click Apply. The table re-fetches with an IN clause on the status field.

How the query works: When two or more statuses are selected, TableCrafter translates the filter into a SQL WHERE order_status IN ('pending', 'processing') clause on the WooCommerce orders table. This is a single efficient query regardless of how many statuses are selected.

How Does Setting a Default Filter Value Work?

Default filter values control what the table shows on first load, before the user touches any filter control.

For a single-select filter, enter the raw status slug in the Default Value field: processing.

For a multi-select filter, enter a comma-separated list of slugs: pending,processing,on-hold. TableCrafter will pre-tick those checkboxes and execute the filtered query on page load.

To let users reset to the default, enable Show Reset button in the toolbar config. Clicking Reset restores all filters to their configured defaults rather than clearing them entirely, this is an important distinction. If you want Reset to clear everything (show all orders), leave all default values blank.

After completing this step, verify the result by viewing the page as a logged-out visitor in an incognito window. This confirms the table behaves correctly for public visitors rather than reflecting admin-level permissions that may hide configuration issues during initial setup. Check both the rendered output and the browser console for any JavaScript errors.

How Do I Add a Date Range Filter Alongside the Status Filter?

The most common combination is status + date range: show me Processing orders from the last 7 days. Add a second filter in Filters → Add Filter:

TableCrafter ANDs multiple filters together. A user selecting Completed status and a date range of last 7 days sees orders that are both completed and placed in the last 7 days. There is no OR logic between different filter fields, that would require custom query modifications.

The column mapping you define here is stored as a JSON configuration in the WordPress database. You can export this configuration using the TableCrafter export tool and import it to another table or another site. This is useful when replicating a table layout across multiple pages or when migrating a table to a staging environment for testing before going live.

How Do I Display Status as Colour-Coded Badges?

While not strictly part of the filter config, displaying the order_status column as colour-coded badges dramatically improves scannability when using status filters. In the column settings for order_status, set Display Type to Badge. Then define badge colours in the Badge Colour Map:

pending     = #f0ad4e  (amber)
processing  = #5bc0de  (blue)
on-hold     = #aaa    (grey)
completed   = #5cb85c  (green)
cancelled   = #d9534f  (red)
refunded    = #9b59b6  (purple)
failed      = #d9534f  (red)

These hex values are stored in the table config and render as inline badge styles on the frontend.

TableCrafter re-fetches this data on each page load by default. If your data source updates infrequently and your site has significant traffic, enable the built-in caching option in the table's Performance tab. This stores the fetched data for a configurable number of minutes and serves it from WordPress transients, reducing API calls to the source and improving page load time for visitors.

How Does Complete Shortcode with Filters Work?

For a WooCommerce order management table with full filter, search, and export capabilities, use:

[tablecrafter id="3" filter="true" search="true" export="true"]

The filter="true" attribute enables the filter toolbar above the table. Individual filter controls only appear for columns that have a filter type configured in the table builder — if you configured a Status dropdown filter and a Date Range filter on the Date column, only those two controls appear in the filter row. The attribute does not add filters to all columns indiscriminately.

search="true" adds a text search input above the filter row that searches across all visible text columns. For WooCommerce order tables, this typically means searching across Order Number, Customer Name, and any other text columns you added. The search is case-insensitive and matches on partial strings (e.g., "smith" finds "John Smith" and "Smith & Co").

export="true" adds an export button to the toolbar. The export respects the active filter and search state — exporting while "Pending" is selected in the Status filter yields only pending orders in the download file, not all orders in the table.

Column order is preserved across sessions. Once you set a column order in the table builder, that order persists for all visitors. Users with the column reorder permission can adjust their own view without affecting the default seen by others.

How Does Combining Status Filter with Search Work?

When search="true" is included, the search bar and the filter controls work together. A user can filter to Processing status and then type a customer name in the search box. TableCrafter applies both constraints: status = processing AND customer name contains the search term. This combination replaces a significant portion of the query functionality that previously required going into the WooCommerce admin.

The configuration you set here applies to every visitor who loads a page containing this table, regardless of whether they are logged in. Role-specific overrides for columns and rows are a separate layer and do not replace these global display settings. Apply global settings first, then add role restrictions as needed for tables that serve multiple user types.

Custom status plugins: If you use a plugin like WooCommerce Order Status Manager to add custom statuses (e.g., wc-awaiting-shipment), those statuses appear in TableCrafter's filter options automatically. No extra mapping is needed. The label displayed in the dropdown uses the human-readable label registered with WooCommerce, not the raw slug.

How Does Troubleshooting Filter Issues Work?

The status filter shows raw slugs instead of labels

This happens if TableCrafter cannot read WooCommerce's registered statuses at the time the options are generated. Go to TableCrafter → Tables → Edit, open the filter settings, and click Refresh Options to force a re-read from WooCommerce.

Multi-select filter is not filtering correctly

Confirm that the Filter Type is set to Multi-Select and not Dropdown. A Dropdown filter will only apply one value even if you pass a comma-separated default. Check the table config and re-save.

Default filter value is not applying on page load

Clear any caching plugins (NitroPack, W3 Total Cache, WP Rocket) after changing filter defaults. Cached pages may serve the old initial state.

This step completes the connection between your data source and the TableCrafter table engine. Once saved, the plugin caches the connection credentials in the WordPress options table and uses them on every subsequent page load. If you update the source configuration later — for example, rotating an API key or changing a sheet URL — return to this step, enter the new value, and save again. The table updates immediately on next load without any shortcode changes.

Frequently Asked Questions

How Does How WooCommerce Order Status Works in TableCrafter Work?

WooCommerce stores order status as a string in the order_status field. The standard statuses are:

What Is TableCrafter?

TableCrafter is a WordPress plugin that turns data from Gravity Forms, Google Sheets, Airtable, Notion, REST APIs, CSV files, and WooCommerce into interactive, sortable, filterable frontend tables. Embed any table on any WordPress page with the [tablecrafter] shortcode or the native Gutenberg block. No PHP or custom development required. The free version supports CSV, JSON, Google Sheets, and Excel. Pro adds Gravity Forms, Airtable, Notion, WooCommerce, REST APIs, inline cell editing, export to CSV and PDF, role-based column visibility, and auto-refresh.

Does this require PHP or developer skills?

No. TableCrafter is configured entirely through the WordPress admin interface. You choose your data source, map fields to columns, and set display preferences using point-and-click controls. Embedding uses the [tablecrafter] shortcode or the native Gutenberg block.

Is the free version sufficient or do I need Pro?

The free plugin on WordPress.org supports CSV, JSON, Google Sheets, and Excel sources with unlimited tables, rows, and columns. Pro adds Gravity Forms, Airtable, Notion, WooCommerce, REST API sources, inline cell editing, bulk row actions, export to CSV and PDF, role-based column visibility, and auto-refresh every N seconds.

Ready to try it?

TableCrafter is free on WordPress.org. Pro unlocks inline editing, role-based permissions, and advanced data sources.

The permission check runs server-side on every request. Frontend users cannot bypass column restrictions by modifying the HTML or disabling JavaScript, because TableCrafter evaluates the current user's role before the data leaves the server.

If this step produces unexpected output, check the source data directly in the connected system. TableCrafter passes data through without modification — if a cell displays an unexpected value, the source record contains that value. Use the TableCrafter debug log (Settings > Advanced > Debug Mode) to trace the exact query sent to the source and the raw response received, which narrows the diagnosis to either a source-side or rendering-side issue.