Why a brand stuck in the title holds products back
WooCommerce stores brands as a taxonomy — a structured field, separate from the title. Everything that groups, filters or counts by brand reads that field. When the only place the brand appears is the title text, the product simply drops out of those views.
- Brand filters skip the product. A shopper who narrows a category to one brand never sees the products that mention that brand only in their titles.
- Brand pages are incomplete. The archive for a brand lists only products assigned to it, so a chunk of the range is missing from the page that should sell it best.
- Feeds and reports undercount. Product feeds map the brand attribute from the taxonomy, and sales-by-brand reports can only count what is assigned. Titles don't feed either.
How to find products with the brand only in the title manually
With WP-CLI you can join every published product against your brand terms and keep the ones whose title contains a brand name but which have no brand assigned:
wp db query "SELECT p.ID, p.post_title, b.name AS brand_in_title
FROM wp_posts p
JOIN wp_terms b
ON p.post_title LIKE CONCAT('%', b.name, '%')
JOIN wp_term_taxonomy bt
ON bt.term_id = b.term_id AND bt.taxonomy = 'product_brand'
WHERE p.post_type = 'product' AND p.post_status = 'publish'
AND NOT EXISTS (
SELECT 1
FROM wp_term_relationships tr
JOIN wp_term_taxonomy tt
ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tr.object_id = p.ID AND tt.taxonomy = 'product_brand'
)
LIMIT 50;"
product_brand is WooCommerce's built-in brand taxonomy;
if your brands come from a plugin, use its taxonomy name instead.
Adjust the wp_ prefix if yours differs.
The query is useful and also generous. LIKE matches
inside words, so a brand called “Ion” fires on “Fashion Hoodie”, and
the same product appears once per brand that happens to be a
substring of its title. It also stops at listing: someone still has to
open each product, confirm the brand and assign it, and repeat the
whole exercise after the next import.
How CatalogLift finds and drafts it
Every scan starts from your store's own brand list as synced from WooCommerce, not from a dictionary. Brand names that are blank, made only of punctuation, or too short to be a safe signal are left out, and a name that two brands share is dropped as ambiguous rather than guessed at. The scan then reads each product's title and looks for a brand's words standing whole and in order — case-insensitive, and tolerant of the spaces or punctuation between them — so “nike” in “Nike Air Zoom” matches while “Nikeland” does not. Products that already carry any brand are skipped, and a title that names more than one brand yields a single finding for the longest, most specific match.
Each finding is raised at low severity with the matched text and the recognised brand as evidence. Because this check carries an AI proposal, CatalogLift drafts the assignment for you: the proposal names the brand the scan found, is validated against your live brand list, and lands as a before/after diff with the evidence beside it. You approve, edit or skip; only an approved change is written to WooCommerce, and the next scan verifies the brand field is filled. If an import later strips the assignment again, CatalogLift keeps watching and the product returns as a fresh finding instead of a silent regression.