You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Magento 2 API获取分类的多选品牌值?

如何通过Magento 2 API获取分类的多选类型品牌值

嘿,我来帮你搞定Magento 2 API获取分类多选品牌值的问题!下面是一步步的具体实现方法,亲测有效~

首先得确保你的品牌属性配置到位,这是基础中的基础:

  • 登录Magento后台,进入Stores > Attributes > Category,创建或编辑你的品牌属性:
    • 把Input Type设为Multiselect(多选类型)
    • 给属性起个唯一的Attribute Code(比如category_brand,别和产品的品牌属性重名哦)
    • 切换到Storefront Properties标签,勾选Used in API为Yes,这样API才能访问到它
    • 最后把这个属性分配给对应的分类属性集(路径是Stores > Attributes > Attribute Set,选分类的属性集,把品牌属性拖到合适的分组里)

方法一:用默认分类API快速获取(无需自定义代码)

Magento自带的分类详情API就能搞定,只是默认不会返回自定义属性,咱们加个参数就行。

默认的API端点是:

GET /rest/V1/categories/{categoryId}

比如你要获取ID为3的分类的品牌值,请求URL可以写成这样:

GET /rest/V1/categories/3?fields=id,name,attributes[attribute_code,value]

返回的响应里,attributes数组会包含你的品牌属性,value字段是选中的选项ID的逗号分隔字符串(比如"value": "1,3,5")。

要是你需要对应的品牌名称(标签),可以再调用这个API获取属性的所有选项:

GET /rest/V1/products/attributes/category_brand/options

返回的结果里有每个选项的label和value,你把之前拿到的逗号分隔ID拆成数组,匹配对应的标签就行啦。

方法二:自定义API端点(返回带标签的品牌列表,更友好)

如果默认API返回的格式不够直观(只给ID不给标签),那可以自己写个自定义API,直接返回包含ID和标签的品牌列表,用起来更顺手。

步骤1:创建自定义模块(比如Vendor/CategoryBrand)

先在app/code/Vendor/CategoryBrand/etc/webapi.xml里定义API路由:

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route url="/V1/categories/:categoryId/brand-values" method="GET">
        <service class="Vendor\CategoryBrand\Api\CategoryBrandInterface" method="getBrandValues"/>
        <resources>
            <resource ref="Magento_Catalog::categories"/>
        </resources>
    </route>
</routes>

步骤2:定义API接口

创建app/code/Vendor/CategoryBrand/Api/CategoryBrandInterface.php:

<?php
namespace Vendor\CategoryBrand\Api;

interface CategoryBrandInterface
{
    /**
     * 获取分类的多选品牌值(带标签)
     *
     * @param int $categoryId
     * @return \Vendor\CategoryBrand\Api\Data\BrandValueInterface[]
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function getBrandValues(int $categoryId);
}

步骤3:实现接口逻辑

创建app/code/Vendor/CategoryBrand/Model/CategoryBrand.php:

<?php
namespace Vendor\CategoryBrand\Model;

use Vendor\CategoryBrand\Api\CategoryBrandInterface;
use Magento\Catalog\Model\CategoryRepository;
use Magento\Eav\Model\AttributeRepository;
use Magento\Framework\Exception\NoSuchEntityException;

class CategoryBrand implements CategoryBrandInterface
{
    protected $categoryRepository;
    protected $attributeRepository;

    public function __construct(
        CategoryRepository $categoryRepository,
        AttributeRepository $attributeRepository
    ) {
        $this->categoryRepository = $categoryRepository;
        $this->attributeRepository = $attributeRepository;
    }

    public function getBrandValues(int $categoryId)
    {
        // 获取分类信息
        $category = $this->categoryRepository->get($categoryId);
        // 替换成你的品牌属性代码
        $brandAttributeCode = 'category_brand';
        // 获取品牌属性的详情
        $attribute = $this->attributeRepository->get(\Magento\Catalog\Model\Category::ENTITY, $brandAttributeCode);
        
        // 拆分选中的选项ID
        $selectedOptionIds = explode(',', $category->getData($brandAttributeCode));
        // 获取属性的所有选项
        $options = $attribute->getSource()->getAllOptions();
        
        // 筛选出选中的品牌,组装成带ID和标签的数组
        $brandValues = [];
        foreach ($options as $option) {
            if (in_array($option['value'], $selectedOptionIds)) {
                $brandValues[] = [
                    'id' => $option['value'],
                    'label' => $option['label']
                ];
            }
        }
        
        return $brandValues;
    }
}

步骤4:启用模块并编译

在命令行执行以下命令:

bin/magento module:enable Vendor_CategoryBrand
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:clean

调用自定义API

现在你就可以用这个URL获取分类的品牌值了:

GET /rest/V1/categories/3/brand-values

返回的响应会是这样的友好格式:

[
    {"id": 1, "label": "Apple"},
    {"id": 3, "label": "Samsung"}
]

一些注意事项

  • 记得用正确的认证方式调用API,管理员可以通过POST /rest/V1/integration/admin/token获取Bearer Token,前端请求可以用客户Token。
  • 多选属性在Magento里默认是用逗号分隔的ID字符串存储的,所以一定要拆成数组再处理哦。
  • 如果你用的是GraphQL API,也可以用类似的思路写个自定义Resolver来获取这个属性,不过REST API是更常用的场景。

内容的提问来源于stack exchange,提问作者Raghu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:19:17