82

How to get specific product attribute value if i know product ID without loading whole product?

Denis Óbukhov
  • 4,129
  • 4
  • 20
  • 27

13 Answers13

142
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
Aziz Shaikh
  • 16,245
  • 11
  • 62
  • 79
Daniel Kocherga
  • 1,444
  • 1
  • 10
  • 2
41

A way that I know of:

$product->getResource()->getAttribute($attribute_code)
        ->getFrontend()->getValue($product)
Mr_Green
  • 40,727
  • 45
  • 159
  • 271
Lucas Moeskops
  • 5,445
  • 3
  • 28
  • 42
27

you can use

<?php echo $product->getAttributeText('attr_id')  ?> 
Rakhi
  • 929
  • 15
  • 41
  • 2
    this code working nice. i searched many blog but no one code worked for me except this. Really nice. – Dixit Patel Jul 05 '14 at 05:27
  • 3
    this code works only when the product model contains the attribute value, when you know only product id it will not work – Jiří Chmiel Sep 15 '14 at 06:27
  • 1
    This works for attributes like dropdown lists but if the attribute is a simple text field then a different function is needed. Say the attribute is my_name then the code becomes $product->getMyName() – Ken Dec 01 '14 at 11:55
  • 1
    @Ken, if you need to get a dynamic attribute from the product, then you can use `$product->getData('my_name')` – pavlindrom Aug 05 '15 at 14:30
  • And ho would we get the Option Id? $product->getAttributeId('attr_id') ??? – snh_nl Nov 08 '18 at 15:01
10

Please see Daniel Kocherga's answer, as it'll work for you in most cases.

In addition to that method to get the attribute's value, you may sometimes want to get the label of a select or multiselect. In that case, I have created this method which I store in a helper class:

/**
 * @param int $entityId
 * @param int|string|array $attribute atrribute's ids or codes
 * @param null|int|Mage_Core_Model_Store $store
 *
 * @return bool|null|string
 * @throws Mage_Core_Exception
 */
public function getAttributeRawLabel($entityId, $attribute, $store=null) {
    if (!$store) {
        $store = Mage::app()->getStore();
    }

    $value = (string)Mage::getResourceModel('catalog/product')->getAttributeRawValue($entityId, $attribute, $store);
    if (!empty($value)) {
        return Mage::getModel('catalog/product')->getResource()->getAttribute($attribute)->getSource()->getOptionText($value);
    }

    return null;
}
Community
  • 1
  • 1
Tyler V.
  • 2,471
  • 21
  • 44
8

It seems impossible to get value without loading product model. If you take a look at file app/code/core/Mage/Eav/Model/Entity/Attribute/Frontend/Abstract.php you'll see the method

public function getValue(Varien_Object $object)
{
    $value = $object->getData($this->getAttribute()->getAttributeCode());
    if (in_array($this->getConfigField('input'), array('select','boolean'))) {
        $valueOption = $this->getOption($value);
        if (!$valueOption) {
            $opt = new Mage_Eav_Model_Entity_Attribute_Source_Boolean();
            if ($options = $opt->getAllOptions()) {
                foreach ($options as $option) {
                    if ($option['value'] == $value) {
                        $valueOption = $option['label'];
                    }
                }
            }
        }
        $value = $valueOption;
    }
    elseif ($this->getConfigField('input')=='multiselect') {
        $value = $this->getOption($value);
        if (is_array($value)) {
            $value = implode(', ', $value);
        }
    }
    return $value;
}

As you can see this method requires loaded object to get data from it (3rd line).

azakolyukin
  • 1,201
  • 9
  • 7
5

First we must ensure that the desired attribute is loaded, and then output it. Use this:

$product = Mage::getModel('catalog/product')->load('<product_id>', array('<attribute_code>'));
$attributeValue = $product->getResource()->getAttribute('<attribute_code>')->getFrontend()->getValue($product);
Sveta Oksen
  • 401
  • 4
  • 5
4

Try this

 $attribute = $_product->getResource()->getAttribute('custom_attribute_code');
    if ($attribute)
    {
        echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
    }
Keshav Kalra
  • 305
  • 5
  • 8
2

You don't have to load the whole product. Magentos collections are very powerful and smart.

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('entity_id', $product->getId());
$collection->addAttributeToSelect('manufacturer');
$product = $collection->getFirstItem();
$manufacturer = $product->getAttributeText('manufacturer');

At the moment you call getFirstItem() the query will be executed and the result product is very minimal:

[status] => 1
[entity_id] => 38901
[type_id] => configurable
[attribute_set_id] => 9
[manufacturer] => 492
[manufacturer_value] => JETTE
[is_salable] => 1
[stock_item (Varien_Object)] => Array
    (
        [is_in_stock] => 1
    )
Eydamos
  • 562
  • 4
  • 16
1

This one works-

echo $_product->getData('ATTRIBUTE_NAME_HERE');
th3pirat3
  • 559
  • 8
  • 19
0

You can get attribute value by following way

$model = Mage::getResourceModel('catalog/product');
$attribute_value = $model->getAttributeRawValue($productId, 'attribute_code', $storeId);
Magecode
  • 225
  • 2
  • 6
  • 16
-1

$orderId = 1; // YOUR ORDER ID
$items = $block->getOrderItems($orderId);
 
foreach ($items as $item) {
    $options = $item->getProductOptions();        
    if (isset($options['options']) && !empty($options['options'])) {        
        foreach ($options['options'] as $option) {
            echo 'Title: ' . $option['label'] . '<br />';
            echo 'ID: ' . $option['option_id'] . '<br />';
            echo 'Type: ' . $option['option_type'] . '<br />';
            echo 'Value: ' . $option['option_value'] . '<br />' . '<br />';
        }
    }
}

all things you will use to retrieve value product custom option cart order in Magento 2: https://www.mageplaza.com/how-get-value-product-custom-option-cart-order-magento-2.html

-2

If you have an text/textarea attribute named my_attr you can get it by: product->getMyAttr();

Shahroq
  • 969
  • 1
  • 8
  • 15
-2

You could write a method that would do it directly via sql I suppose.

Would look something like this:

Variables:

$store_id = 1;
$product_id = 1234;
$attribute_code = 'manufacturer';

Query:

SELECT value FROM eav_attribute_option_value WHERE option_id IN (
    SELECT option_id FROM eav_attribute_option WHERE FIND_IN_SET(
        option_id, 
        (SELECT value FROM catalog_product_entity_varchar WHERE
            entity_id = '$product_id' AND 
            attribute_id = (SELECT attribute_id FROM eav_attribute WHERE
                attribute_code='$attribute_code')
        )
    ) > 0) AND
    store_id='$store_id';

You would have to get the value from the correct table based on the attribute's backend_type (field in eav_attribute) though so it takes at least 1 additional query.

Lucas Moeskops
  • 5,445
  • 3
  • 28
  • 42
  • Thanks! Looks good, but not all attributes are varchar and 3 select inclusions are not good. Maybe it's better to use join? – Denis Óbukhov Aug 03 '11 at 13:56
  • I might be wrong, but as far as I know there is no big difference between select and join as they are optimised by the query processor. But regarding not all attributes being varchar, you first need to get the backend_type of the attribute you want to get and then use the table sprintf('catalog_product_entity_%s', $backend_type) ^^. But also the other types can't be obtained by using FIND_IN_SET, so you will have to find something for that as well. Good luck! – Lucas Moeskops Aug 03 '11 at 14:04