How to get specific product attribute value if i know product ID without loading whole product?
-
1Not a great answer, but you could create a model that queries the appropriate tables directly :) – Joe Mastey Aug 03 '11 at 12:18
13 Answers
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);

- 16,245
- 11
- 62
- 79

- 1,444
- 1
- 10
- 2
-
1
-
2
-
To get option text from this, see the answer below: https://stackoverflow.com/a/30519730/327862 – Mukesh Chapagain Dec 10 '21 at 16:18
A way that I know of:
$product->getResource()->getAttribute($attribute_code)
->getFrontend()->getValue($product)

- 40,727
- 45
- 159
- 271

- 5,445
- 3
- 28
- 42
-
4
-
29@Mr_Green Because this is Magento. No 'why' gets a reasonable answer. – nakajuice Apr 09 '15 at 12:52
-
@Mr_Green, this isn't saying to use it two times: the second line is a continuation of the first. You're calling getFrontend() on the object returned by getAttribute(). – Scott Buchanan Jul 21 '15 at 18:38
you can use
<?php echo $product->getAttributeText('attr_id') ?>

- 929
- 15
- 41
-
2this 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
-
3this 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
-
1This 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
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;
}
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).

- 1,201
- 9
- 7
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);

- 401
- 4
- 5
Try this
$attribute = $_product->getResource()->getAttribute('custom_attribute_code');
if ($attribute)
{
echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
}

- 305
- 5
- 8
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
)

- 562
- 4
- 16
You can get attribute value by following way
$model = Mage::getResourceModel('catalog/product');
$attribute_value = $model->getAttributeRawValue($productId, 'attribute_code', $storeId);

- 225
- 2
- 6
- 16
$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

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

- 969
- 1
- 8
- 15
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.

- 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