11

Working on a modification to shipping in Magento 2 and need to have a conditional based on a product attribute which is not currently exposed. How can this be done?

In my Shipping class, I can get access to the product in these two ways (productFactory is passed into construct of class):

$allItems = $request->getAllItems();
foreach ($allItems as $item) {
    //First way
    $desiredAttribute = $item->getData('desiredAttribute');
    $desiredAttribute = $item->getDataByKey('desiredAttribute');
    $productData = $item->getData();
    //Second way
    $product = $this->productFactory->create()->load($item->getId());
    $desiredAttribute = $product->getData('desiredAttribute');
    $desiredAttribute = $product->getDataByKey('desiredAttribute');
    $productData = $product->getData();
}

Neither have the custom attribute visible. I tried setting the attribute available for Promo code = Yes, but that still does not work. Can definitely see some data about the product such as dimensions and such which would be expected at this point. I can see in the $product object a protected array called _attributesByCode which does display this, however accessing the attribute by key is not working. Thanks in advance.

Final solution leveraging the XML from the answer below my code ended up looking something like this:

$allItems = $request->getAllItems();
foreach ($allItems as $item) {
    $desiredAttribute = $item->getProduct()->getDesiredAttribute();
}

If this attribute is a set of options it will return the optionId which you can use to get the optionText if need be by some additional code.

1 Answer 1

31

In order to make custom product attribute available in quote item, simply add the attribute in the file: Vendor/Module/etc/catalog_attributes.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="desiredAttribute"/>
    </group>
</config>

And you can simply get the product attribute via item object as: $item->getProduct()->getDesiredAttribute()

4
  • Is there anything I need to get this file loaded in developer mode? Or how am I to call the attribute? I am attempting $item->getDataByKey('desiredAttribute'); and $item->getDesiredAttribute(); and neither of those work. Issuing get_class($item) yields Magento\Quote\Model\Quote\Item as the class, so that matches the quote_item above I believe. Commented Mar 13, 2018 at 18:09
  • @JoshuaFricke Please check the updated Answer.
    – MagePsycho
    Commented Mar 15, 2018 at 7:17
  • @MagePsycho - Thanks for sharing this quickest and best solution for this. Commented Jun 8, 2020 at 1:10
  • @MagePsycho Is it possible to make custom customer attribute available in quote_item?
    – zlep
    Commented Apr 9, 2021 at 13:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.