Skip to content

product

Product Management - Product CRUD and Search

Overview

k.commerce.product provides product-related operations, including creation, query, update, delete, etc.

TypeScript definition

ts
interface KProduct {
    get(seoNameOrId: string): Product;
    list(query?: ProductQueryParams): Product[];
    create(product: NewProduct): Product;
    delete(productId: string): boolean;
    search(keyword: string, options?: SearchOptions): SearchResult;
    updateField(productId: string, field: string, value: any, lang?: string): void;
    updateFields(productId: string, updateContents: UpdateContent[]): void;
    getDiscountPrice(variantId: string, options?: DiscountOptions): number;
    createVariant(productId: string, variant: NewVariant): Product;
    updateVariantField(variantId: string, field: string, value: any): void;
    updateVariantFields(variantId: string, updateContents: UpdateContent[]): void;
    addCategory(productId: string, categoryId: string): void;
    removeCategory(productId: string, categoryId: string): void;
    addFileDigitalItem(variantId: string, name: string, filePath: string): void;
    addLinkDigitalItem(variantId: string, name: string, linkUrl: string): void;
    addTextDigitalItem(variantId: string, name: string, text: string): void;
    removeDigitalItem(variantId: string, digitalId: string): void;
}

core method

list()

Get product list.

ts
k.api.get(() => {
    const products = k.commerce.product.list()
    return { count: products.length, products }
})

Parameters:

ParameterTypeRequiredDescription
queryProductQueryParamsNoProduct list filters.
query.categoriesstring[]NoFilter by category ID.
query.includeOfflinebooleanNoWhether to include offline products. Default is false.
query.includeSubCategorybooleanNoWhether to include products from child categories. Default is false.

Returns: Product[]. Product list matching the filters.

get()

Get product details (including variations).

exception handling

When the get method cannot query the product, it will throw an exception "Product not found"

Parameters:

ParameterTypeRequiredDescription
seoNameOrIdstringYesProduct SEO name or product ID.

Returns: Product. Product detail, including variants.

ts
k.api.get(() => {
    const product = k.commerce.product.get('product-seo-name')
    return { title: product.title, variants: product.variants }
})

// Error handling example
k.api.get(() => {
    try {
        return k.commerce.product.get('product-id')
    } catch (e) {
        return { error: e.message }
    }
})

create()

Create products.

Parameters:

ParameterTypeRequiredDescription
productNewProductYesNew product data.

Returns: Product. Created product object.

ts
k.api.post(() => {
    const product = k.commerce.product.create({
        title: 'New Product',
        description: 'Product description',
        price: 99.9,
        active: true
    })
    return { id: product.id, title: product.title }
})

createVariant()

Create variations for your product.

Parameters:

ParameterTypeRequiredDescription
productIdstringYesProduct ID.
variantNewVariantYesNew variant data.

Returns: Product. Updated product object.

ts
k.api.post(() => {
    const product = k.commerce.product.createVariant(productId, {
        sku: 'SKU-001',
        price: 88,
        inventory: 100
    })
    return { variantCount: product.variants.length }
})

Search for products.

Parameters:

ParameterTypeRequiredDescription
keywordstringYesSearch keyword.
optionsSearchOptionsNoSearch filters.
options.categoriesstring[]NoFilter by category ID.
options.includeOfflinebooleanNoWhether to include offline products. Default is false.
options.includeSubCategorybooleanNoWhether to include products from child categories. Default is false.

Returns: SearchResult. Search result and facet data.

ts
k.api.get(() => {
    const result = k.commerce.product.search("wireless earbuds")
    return { count: result.list.length, facets: result.facets }
})

// Filter with parameters
k.api.get(() => {
    const result = k.commerce.product.search("wireless earbuds", {
        includeOffline: true,
        includeSubCategory: false
    })
    return { count: result.list.length }
})

updateField()

Update a single field.

Parameters:

ParameterTypeRequiredDescription
productIdstringYesProduct ID.
fieldstringYesField name.
valueanyYesField value.
langstringNoLanguage code for multilingual fields.

Returns: void.

ts
k.api.post(() => {
    // Standard update
    k.commerce.product.updateField(productId, "title", "Updated Title")
    return { success: true }
})

// Multilingual update (`lang` specifies the language)
k.api.post(() => {
    k.commerce.product.updateField(productId, "title", "New Title", "en")
    return { success: true }
})

updateFields()

Update fields in batches.

Parameters:

ParameterTypeRequiredDescription
productIdstringYesProduct ID.
updateContentsUpdateContent[]YesList of fields to update.
updateContents[].propertystringYesField name.
updateContents[].valueanyYesField value.
updateContents[].langstringNoLanguage code for multilingual fields.

Returns: void.

ts
k.api.post(() => {
    k.commerce.product.updateFields(productId, [
        { property: "title", value: "Updated Title", lang: "en" },
        { property: "tags", value: ["tag1", "tag2"] }
    ])
    return { success: true }
})

updateVariantField()

Update variant fields.

Parameters:

ParameterTypeRequiredDescription
variantIdstringYesVariant ID.
fieldstringYesField name.
valueanyYesField value.

Returns: void.

ts
k.api.post(() => {
    k.commerce.product.updateVariantField(variantId, "sku", "NEW-SKU")
    return { success: true }
})

updateVariantFields()

Batch update variant fields.

Parameters:

ParameterTypeRequiredDescription
variantIdstringYesVariant ID.
updateContentsUpdateContent[]YesList of fields to update.
updateContents[].propertystringYesField name.
updateContents[].valueanyYesField value.
updateContents[].langstringNoLanguage code for multilingual fields.

Returns: void.

ts
k.api.post(() => {
    k.commerce.product.updateVariantFields(variantId, [
        { property: "sku", value: "NEW-SKU", lang: "zh" }
    ])
    return { success: true }
})

getDiscountPrice()

Get discounted prices.

Parameters:

ParameterTypeRequiredDescription
variantIdstringYesVariant ID.
optionsDiscountOptionsNoDiscount calculation options.

Returns: number. Discounted price.

ts
k.api.get(() => {
    const price = k.commerce.product.getDiscountPrice(variantId)
    return { price }
})

delete()

Delete product.

Parameters:

ParameterTypeRequiredDescription
productIdstringYesProduct ID to delete.

Returns: boolean. Returns true when deletion succeeds.

ts
k.api.post(() => {
    const success = k.commerce.product.delete(productId)
    return { success }
})

Product structure

Product attributes

PropertyDescriptionType
IDProduct IDstring
titleProduct namestring
descriptionProduct Descriptionstring
featuredImageMain picturestring
imagesPicture liststring[]
seoNameSEO namestring
tagsLabelstring[]
pricePrice (default applied to first variant)number
inventoryin stocknumber
activeWhether to enableboolean
isDigitalIs it a digital product?boolean
autoDeliveryWhether to ship automaticallyboolean
variantImageVariant picturesstring
maxDownloadCountMaximum number of downloads (digital products)number
maxDownloadDayMaximum download days (digital products)number
attributesattribute key-value pair{key: string, value: string}[]
variantsVariation listVariant[]
categoriesCategory listCategory[]

Variant properties

PropertyDescriptionType
IDVariant IDstring
productIdProduct IDstring
createdAtcreation timeDate
updatedAtUpdate timeDate
skuSKU codestring
barcodebarcodestring
pricepricenumber
inventoryin stocknumber
weightweightnumber
ordersortnumber
salesSales volumenumber
activeWhether to enableboolean
autoDeliveryWhether to ship automaticallyboolean
imageVariant picturesstring
selectedOptionsOptions (e.g. color/size){name: string, value: string}[]
digitalsDigital product listDigital[]

Digital property

PropertyDescriptionType
IDNumeric Product IDstring
Typetype'file' | 'image' | 'video'
namenamestring
valueContent (file path/link/text)string
contentTypeContent type (file type only)string
sizesize (file type only)number