Miva Merchant Development by Scot's Scripts

FACETS: Workbench to Set Facet Values on Parsed Product Name

Miva Knowledge Base
FACETS: Workbench to Set Facet Values on Parsed Product Name
Important Notice: This information is for internal reference only. Use at your own risk.
Does Google actually understand your Miva Merchant store? Our JSON-LD schema generator makes sure it does. Contact us to get started. (more info)

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