Magento API 上传的产品没有出现在前端 - 除非它们被重新保存在后端

Posted

技术标签:

【中文标题】Magento API 上传的产品没有出现在前端 - 除非它们被重新保存在后端【英文标题】:Magento API Uploaded products not appearing in frontend - Unless they are re-saved in backend 【发布时间】:2009-06-15 15:58:17 【问题描述】:

我正在通过 Magento API 上传产品,但它们没有显示在前端。我必须进入后端,打开它们,更改nothing,保存产品,然后它就会出现。

知道为什么吗?我假设将它保存在后端的行为是在数据库中保存一些额外的标志,我只是不知道是什么。

@史蒂夫马德森。这是代码,我认为我没有遗漏任何重要的东西,因为后端界面会提示我,然后我打开产品。

public void Import(Product product)
        
            var mageProduct = new catalogProductCreateEntity();
            mageProduct.name = product.Name;
            mageProduct.description = product.Description;
            mageProduct.price = product.Price.ToString();
            mageProduct.short_description = product.ShortDescription;
            mageProduct.description = product.Description;
            mageProduct.status = "1";
            mageProduct.weight = "0";
            mageProduct.tax_class_id = "2";

            mageProduct.gift_message_available = "0";


            var additionalattributes = new associativeEntity[4];

            var entity = new associativeEntity();
            entity.key = "ship_price";
            entity.value = product.PostageCost;
            additionalattributes[0] = entity;

            entity = new associativeEntity();
            entity.key = "depth_cm";
            entity.value = product.Depth;
            additionalattributes[1] = entity;

            entity = new associativeEntity();
            entity.key = "height_cm";
            entity.value = product.Height;
            additionalattributes[2] = entity;

            entity = new associativeEntity();
            entity.key = "width_cm";
            entity.value = product.Width;
            additionalattributes[3] = entity;

            mageProduct.additional_attributes = additionalattributes;

            _m.catalogProductCreate(MageSessionProvider.GetSession(), "simple", "26", product.SKU, mageProduct);

            var stock = new catalogInventoryStockItemUpdateEntity();
            stock.manage_stock = 0;
            stock.qty = "0";

            _m.catalogInventoryStockItemUpdate(MageSessionProvider.GetSession(), product.SKU, stock);
            Console.WriteLine(product.Name + " imported");
        

【问题讨论】:

发布上传新产品的代码。没有它,就不可能知道你是否遗漏了一个重要的属性。 【参考方案1】:

我已经看到很多手动或通过 API 插入 Magento 数据库的内容会缺少属性,无论出于何种原因,当保存在 Magento UI 中时,该属性被设置为默认值。 UI 正在正确设置默认值,而 API 或数据库插入没有设置属性。

所以,在你的情况下,我的第一行调试将是

    “上传”[原文如此] 带有 API 的产品(您使用什么 API 方法?或者您使用的是自定义 API?) 对该产品的属性值进行快照 通过 Magento UI 保存产品 对该产品的属性值进行快照 区分 #2 和 #4 确保您的“上传”[原文如此] 方法设置了 #4 中存在但 #2 中不存在的所有属性

Magento 使用Entity Attribute Value 建模方案,优化数据库灵活性而不是查询。长话短说,您可以运行以下查询来获取您的基本产品属性值。

您需要用数据库中的产品 ID 替换 [3455] 的每个实例。您可以通过在 Magento Admin UI 中检查产品的 URL 来获取此 ID。您可以不使用 WHERE 子句运行查询,尽管默认索引并未针对此用例进行优化,并且根据您的数据库大小,您将获得较慢的查询。

SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_varchar.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_varchar ON catalog_product_entity.entity_id = catalog_product_entity_varchar.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_varchar.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455

UNION

SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_text.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_text ON catalog_product_entity.entity_id = catalog_product_entity_text.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_text.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455

UNION

SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_datetime.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_datetime ON catalog_product_entity.entity_id = catalog_product_entity_datetime.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_datetime.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455

UNION

SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_decimal.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_decimal ON catalog_product_entity.entity_id = catalog_product_entity_decimal.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_decimal.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455

UNION

SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_gallery.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_gallery ON catalog_product_entity.entity_id = catalog_product_entity_gallery.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_gallery.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455

UNION

SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_int.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_int ON catalog_product_entity.entity_id = catalog_product_entity_int.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_int.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455;

【讨论】:

谢谢艾伦!非常感谢你发布这个。这非常令人沮丧,我试试你所说的并返回结果。 我使用您的 SQL 进行比较,那里有很多用空字符串设置的额外属性。所以我设置了所有这些。这似乎没有效果。最后归结为我设置 mageProduct.websites = new[] "base" ;【参考方案2】:

“我使用您的 SQL 进行比较,那里有很多用空字符串设置的额外属性。所以我设置了所有这些属性。这似乎没有效果。最后它归结为我设置 mageProduct.websites = new[] "base" ; – Dan Jun 16 at 14:12"

谢谢丹!这对我有用。类代码示例显示了 mageProduct.websites = new[] "0" ;这是不正确的,我将其更改为 mageProduct.websites = new[] "base" ;并且有效。

【讨论】:

【参考方案3】:

这个页面是最有帮助的。在执行 CSV 导入时,我发现我必须添加: _product_websites 并确保将其设置为每个导入产品的基础。还要确保将 is_in_stock 的字段设置为 1,之后我发现导入工作正常。

对我有用的最小字段列表是: 货号, _店铺, _attribute_set, _类型, _类别, _root_category, 描述, msrp_display_actual_price_type, msrp_enabled, 姓名, 简短的介绍, 数量, is_in_stock, 地位, tax_class_id, 能见度, 价格, 重量, _product_websites

样本记录:

ku,_store,_attribute_set,_type,_category,_root_category,description,msrp_display_actual_price_type,msrp_enabled,name,short_description,status,tax_class_id,visibility,price,weight,_product_websites,qty,is_in_stock
CC0003,,Default,simple,Specialist Therapeutics,Products,Conn Test #3,Use config,Use config,Conn Test #3,ConnTest,1,0,4,0,1,base,3000,1

【讨论】:

以上是关于Magento API 上传的产品没有出现在前端 - 除非它们被重新保存在后端的主要内容,如果未能解决你的问题,请参考以下文章

Magento - 无法在管理员中上传产品图片

Magento API:将预先存在的简单产品分配给可配置产品

如何在 Magento 中使用 REST API 获取产品信息

添加显示magento 2.0.7版本缺货的产品

用于添加产品愿望清单的 Magento 自定义 API

某些产品的页面Magento出现错误500