FACETS: Workbench to Set Facet Values on Parsed Product Name

Miva Knowledge Base
Want to start an online store? We work with you from start to finish, from commerce platform to design to SEO.
Experience counts, and we have a lot.
Important Notice: This information is for internal reference only. Use at your own risk.

FACETS: Workbench to Set Facet Values on Parsed Product Name

Scot Ranney • April 02, 2025


This code is a good example of setting custom field values for all products based on words we find in product titles. In this case it's for a jewelry store.

Note that the gender facet is a multi-facet which means we can add men, women, or both men and women.

<!doctype html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>Facets Workbench</title>
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container-fluid">
<div class="row my-3 ">
<div class="col">
	<h1 class="h3 display-5">Facets Import Workbench</h1>
	<p class="small text-secondary mt-2">
		This utility parses product titles to write custom field data for facets.
	</p>
</div>
<div class="col pt-3">
	<mvt:if expr="g.write_custom_fields EQ 1">
		<h3><code class="text-success">Live Mode</code></h3>
		<code class="text-success">Items in green have been updated, cells in red had errors.</code>
	<mvt:else>
		<h3><code>Preview Mode</code></h3>
	</mvt:if>
</div>
<div class="col pt-3 text-end">
	<a class="text-uppercase fw-bold btn btn-secondary text-uppercase me-2" style="letter-spacing: .2em;" href="/workbench-facets-data-import.html"><small>Refresh Preview</small></a>
	<a class="text-uppercase fw-bold btn btn-primary text-uppercase" style="letter-spacing: .2em;" href="/workbench-facets-data-import.html?write_custom_fields=1"><small>Write Custom Field Data</small></a>
	<p class="text-secondary small mt-2"><b>Important:</b> Do not double click buttons. It may take a while before the page refreshes.</p>
</div>
</div>
<mvt:comment>
# 
# NOTES:
[ g.Module_Root $ l.__module_customfields:module ].ProductFieldValue_Set( field_id,product_id,value )
[ g.Module_Library_DB ].ProductList_Load_Offset_Active( offset,search,searchable_fields,max,nextoffset var,products var )
[ g.Module_Library_DB ].ProductList_Load_Offset_Category_Assigned( cat_id,offset,search,searchable_fields,max,nextoffset var,products var )
#
</mvt:comment>
<mvt:comment>
#
# load fields first
#
</mvt:comment>
<mvt:do file="g.Module_Root $ '/modules/util/customfld.mvc'" name="l.success" value="ProductField_Load_Code('facet_karat',l.settings:field_karat)" />
<mvt:do file="g.Module_Root $ '/modules/util/customfld.mvc'" name="l.success" value="ProductField_Load_Code('facet_color',l.settings:field_color)" />
<mvt:do file="g.Module_Root $ '/modules/util/customfld.mvc'" name="l.success" value="ProductField_Load_Code('facet_gender',l.settings:field_gender)" />
<mvt:comment>
#
# load products - testing with 250
#
</mvt:comment>
<mvt:do file="g.Module_Library_DB " name="l.success" value="ProductList_Load_Offset_Active(0,l.null,l.null,10000,l.settings:nextoffset,l.settings:products)" />
<table class="table table-sm table-hover mt-5">
<thead class="sticky-top ">
<tr class="table-dark">
<th></th>
<th>code</th>
<th>name</th>
<th>karat</th>
<th>color</th>
<th>gender</th>
</tr>
</thead>
<mvt:comment>
#
### Karat
10K Gold = "10K" 
14K Gold = "14K"
18K Gold = "18K"
22K Gold = "22K"
24K Gold = "24K"
Platinum = "Platinum"
Sterling Silver = "Silver"
Titanium = "Titanium"
Stainless Steel = "Steel"

### Color
Yellow Gold = "Gold", "Yellow Gold" or "Solid Gold" (but not "white" or "rose" anywhere in title)
White Gold = "White Gold"
Rose Gold = "Rose Gold"
Two Tone Gold = "Two Tone" or "Two-Tone"

### Gender
Women = woman, women
Men = man, men
'Men' $ asciichar(10) $ 'Women'
#
</mvt:comment>
<mvt:foreach iterator="product" array="products">
	<mvt:assign name="l.settings:counter" value="l.settings:counter + 1" />

	<mvt:assign name="l.settings:f_karat" value="''" />
	<mvt:assign name="l.settings:f_color" value="''" />
	<mvt:assign name="l.settings:f_gender" value="''" />

	<mvt:comment>
	#
	# CARAT
	#
	</mvt:comment>

	<mvt:if expr="'10k' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_karat" value="'10k Gold'" />
	<mvt:elseif expr="'14k' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_karat" value="'14k Gold'" />
	<mvt:elseif expr="'18k' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_karat" value="'18k Gold'" />
	<mvt:elseif expr="'22k' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_karat" value="'2k Gold'" />
	<mvt:elseif expr="'24k' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_karat" value="'24k Gold'" />
	<mvt:elseif expr="'Platinum' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_karat" value="'Platinum'" />
	<mvt:elseif expr="'Sterling Silver' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_karat" value="'Silver'" />
	<mvt:elseif expr="'Titanium' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_karat" value="'Titanium'" />
	<mvt:elseif expr="'Stainless Steel' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_karat" value="'Steel'" />
	</mvt:if>

	<mvt:comment>
	#
	# COLOR
	#
	</mvt:comment>

	<mvt:if expr="'Rose Gold' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_color" value="'Rose Gold'" />
	<mvt:elseif expr="'Two Tone' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_color" value="'Two Tone Gold'" />
	<mvt:elseif expr="'Two-Tone' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_color" value="'Two Tone Gold'" />
	<mvt:elseif expr="'White Gold' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_color" value="'White Gold'" />
	<mvt:elseif expr="'Gold' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_color" value="'Yellow Gold'" />
	</mvt:if>
	<mvt:comment>
	#
	# GENDER
	#
	</mvt:comment>	
	<mvt:if expr="'Women' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_gender" value="'Women'" />
	<mvt:elseif expr="'Woman' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_gender" value="'Women'" />
	<mvt:elseif expr="'Men' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_gender" value="'Men'" />
	<mvt:elseif expr="'Man' CIN l.settings:product:name">
		<mvt:assign name="l.settings:f_gender" value="'Men'" />
	</mvt:if>
	<mvt:comment>
	#
	# Save Custom Field Info
	#
	</mvt:comment>

	<mvt:assign name="l.f_karat_ok" value="''" />
	<mvt:assign name="l.f_color_ok" value="''" />
	<mvt:assign name="l.f_gender_ok" value="''" />

<mvt:if expr="g.write_custom_fields EQ 1">
	<mvt:if expr="l.settings:f_karat">
		<mvt:do file="g.Module_Root $ '/modules/util/customfld.mvc'" name="l.f_karat_ok" value="ProductFieldValue_Set(l.settings:field_karat:id,l.settings:product:id,l.settings:f_karat)" />
	</mvt:if>
	<mvt:if expr="l.settings:f_color">
		<mvt:do file="g.Module_Root $ '/modules/util/customfld.mvc'" name="l.f_color_ok" value="ProductFieldValue_Set(l.settings:field_color:id,l.settings:product:id,l.settings:f_color)" />
	</mvt:if>
	<mvt:if expr="l.settings:f_gender">
		<mvt:do file="g.Module_Root $ '/modules/util/customfld.mvc'" name="l.f_gender_ok" value="ProductFieldValue_Set(l.settings:field_gender:id,l.settings:product:id,l.settings:f_gender)" />
	</mvt:if>
<mvt:else>
	<mvt:assign name="l.f_karat_ok" value="'1'" />
	<mvt:assign name="l.f_color_ok" value="'1'" />
	<mvt:assign name="l.f_gender_ok" value="'1'" />
</mvt:if>

<mvt:comment>
#
# table row output with error / success highlights
#
</mvt:comment>

<tr>
<td>&mvt:counter;.</td>
<td>&mvt:product:code;</td>
<td>&mvt:product:name;</td>
<mvt:if expr="NOT g.write_custom_fields">
	<td>&mvt:f_karat;</td>
<mvt:elseif expr="g.write_custom_fields EQ 1 AND l.settings:f_karat">
			<mvt:if expr="l.f_karat_ok EQ 1">
			<td class="text-success">&mvt:f_karat;</td>
		<mvt:else>
		<td class="table-danger">&mvt:f_karat;</td>
		</mvt:if>
<mvt:else>
	<td></td>
</mvt:if>

<mvt:if expr="NOT g.write_custom_fields">
	<td>&mvt:f_color;</td>
<mvt:elseif expr="g.write_custom_fields EQ 1 AND l.settings:f_color">
	<mvt:if expr="l.f_color_ok EQ 1">
		<td class="text-success">&mvt:f_color;</td>
	<mvt:else>
		<td class="table-danger">&mvt:f_color;</td>
	</mvt:if>
<mvt:else>
	<td></td>
</mvt:if>

<mvt:if expr="NOT g.write_custom_fields">
	<td>&mvt:f_gender;</td>
<mvt:elseif expr="g.write_custom_fields EQ 1 AND l.settings:f_gender">
	<mvt:if expr="l.f_gender_ok EQ 1">
		<td class="text-success">&mvt:f_gender;</td>
	<mvt:else>
		<td class="table-danger">&mvt:f_gender;</td>
	</mvt:if>
<mvt:else>
	<td></td>
</mvt:if>
</tr>
</mvt:foreach>
</table>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>

https://www.scotsscripts.com/mvblog/facets-workbench-to-set-facet-values-on-parsed-product-name.html

mvkb_facets