Find WooCommerce products without a category, image, brand or price
To find WooCommerce products without a category, a brand, a featured image or a price, you need a filter that asks "what is missing" rather than "what is set". The standard products list cannot do that, and in BEAR most of these checks are one setting in the Filters tab away. Below is how to list each kind of incomplete product, including the cases that need a small trick (empty prices, products not on sale), and how to fix the whole list in one bulk run once you have it.
Find products without a category, brand or attribute
Every taxonomy in the Filters tab (categories, tags, brands, attributes, custom taxonomies) has an operator next to its terms: OR, AND and NOT IN. Two more operators, NOT EXISTS and EXISTS, are hidden by default because they ignore the terms and only ask whether the product has any term of that taxonomy at all. Switch them on with one line:
/*
* BEAR: show the NOT EXISTS / EXISTS operators for taxonomies in the Filters tab.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('woobe_filter_taxonomies_exists_show', '__return_true');
Reload the editor, then in the Filters tab choose NOT EXISTS next to the taxonomy, leave its terms empty and press Filter. The FAQ on filtering by attachment of taxonomies shows where the operator sits.
- Brands. NOT EXISTS on Brands (or on the taxonomy of your brands plugin) lists every product with no brand.
- Attributes. NOT EXISTS on an attribute such as Color lists the products that have no Color at all, which is handy before adding it in bulk. It works for global attributes only; values typed into a single product are custom attributes and are not taxonomies, see converting custom attributes to global.
- Several gaps at once. Operators of different taxonomies combine: NOT EXISTS on brands plus a category selected with OR gives the products of that category without a brand. Add Product type to limit the list to simple or variable products.
Products without a category usually sit in Uncategorized
WooCommerce tries not to leave a product without a category: whenever a product is saved with an empty category list, by the editor, an import or the REST API, it is put into the default category, which is Uncategorized unless it was renamed. So the first list to check is not NOT EXISTS but the category filter with Uncategorized selected. NOT EXISTS on categories then catches the products that still ended up with none, for example after their only category was deleted, or after a tool wrote them to the database without going through WooCommerce.
Products without a featured image
The Filters tab has a Thumbnail drop-down with Empty and Not empty. Empty lists products that have no featured image set, and the Thumbnail column shows the result at a glance. The filter checks the product itself; a variation without its own image shows the parent's image on the product page, so it is rarely a gap that needs fixing.
Empty descriptions, SKUs and custom fields
The text filters of the Filters tab have a behaviour drop-down next to them, and its last choice, Empty, finds products where that field has no text at all:
- Product content with Empty: products without a description.
- Product excerpt with Empty: products without a short description.
- The SKU filter with Empty: products and variations without a SKU.
Fields added in the Meta Fields tab work the same once their column is switched on. A text meta field gets Empty and NOT Empty in its filter, which covers GTIN, supplier codes and similar fields. A number meta field gets a from/to range; entering 0 in both boxes lists the products where the value is 0 or missing.
Zero prices, empty prices and products not on sale
The price filters compare numbers. That makes zero prices easy to find and empty prices impossible to find directly, because an empty field is not a number and never falls into a range.
- A price of 0. Enter
0in regular price from and0.01in regular price to. The list shows simple products priced 0 and the variable products that have a variation priced 0; switch on variations on the tools panel to see which variations they are. - A sale price of 0. The same with sale price from and sale price to. WooCommerce shows such products as on sale for free; the article on bulk sales explains how to clear them.
Find what does not match: the temporary tag
For "no price at all" and "not on sale", filter for the opposite, mark it, and then exclude the mark:
- Create a tag such as tmp-has-price under Products → Tags.
- In the Filters tab enter
0in regular price from, leave to empty and press Filter. This lists everything that has a regular price, including variable products with at least one priced variation. - With the variations switch off, add the tag to all filtered products in the Bulk Edit tab with append.
- Reset the filter and select the tag with NOT IN. The list is the products with no regular price: simple products with an empty price field, and variable products where no variation has a price yet. Grouped products have no price of their own and appear here too.
- When the products are fixed, delete the tag under Products → Tags; that removes it from every product at once.
Products not on sale work the same way: filter by sale price from 0.01 with to empty, tag the result, then exclude the tag. The FAQ on products with a sale price describes that filter. Keep in mind that current WooCommerce versions keep the sale price on a product after a scheduled sale has ended, so an expired sale still counts as "has a sale price" here; scheduling sale prices explains why. A variable product with a variation on sale also counts as on sale.
Two more checks: SKUs in titles, unmanaged stock
Titles that contain the SKU, often left by imports ("Linen shirt ABC-123"), cannot be filtered, because no filter compares a product's title with its own SKU. They do not need to be: in the Bulk Edit tab tick the title row, choose replace, enter {SKU} together with the separator in front of it in your titles (a space, or - ) as the text to find, and leave the replacement empty. {SKU} is replaced with each product's own SKU before the search, so only titles that contain their SKU change. Run it on a few products first and check the result.
Products without stock management have a stock status but no quantity, so they never sell out on their own. The Filters tab has no drop-down for this setting, but the value is stored in the meta key _manage_stock as yes or no. Attach that key in Meta Fields as a text field, switch on its column, and filter it with EXACT (=) and no. Use the meta field only to find the products; switch stock management on with the Manage stock row of the Bulk Edit tab, as described in the stock manager article.
Fix the list in bulk
Once a filter shows exactly the incomplete products, the Bulk Edit tab applies to all of them; the line Bulk editing will be applied to at the top confirms it.
- Categories and brands. Tick the taxonomy row, pick the terms and choose append, or replace to take products out of Uncategorized in the same step. The categories article covers moving, adding and removing.
- Images. select thumbnail in the Bulk Edit tab gives every filtered product the same image, which suits a placeholder. Individual images go into the Thumbnail cell of each row.
- Prices. Tick the regular price row with set new; for variations switch on variations first.
- Descriptions. See bulk editing product descriptions.
Every run is recorded in the History tab and can be rolled back, so a fix applied to the wrong list costs one click.
A quick catalogue audit
- Category filter with Uncategorized, then NOT EXISTS on categories.
- NOT EXISTS on brands and on the attributes your filters rely on.
- Thumbnail: Empty.
- Empty on description, short description and SKU.
- Regular price from 0 to 0.01, then the temporary tag for empty prices.
_manage_stockequal tono, if the shop is meant to count stock.
If a filter returns products that do have the data, or misses products that do not, post the filter settings and one example product on the BEAR support forum.