2

How to save customer attribute value in custom script in Magento 2.

The prerequisite is to add first your new attribute programatically.

To do add a customer attribute please review these:

17

This is how it can be done with customer save method:

/** @var \Magento\Customer\Model\CustomerFactory $customerFactory */
/** @var \Magento\Customer\Model\Customer $customer */
/** @var \Magento\Customer\Model\Data\Customer $customerData */

$customer = $customerFactory->create()
$customerData = $customer->getDataModel();
$customerData->setCustomAttribute('my_attr_code', $val);
$customer->updateData($customerData);
$customer->save();

And this is how it can be done updating only one attribute value:

/** @var \Magento\Customer\Model\CustomerFactory $customerFactory */
/** @var \Magento\Customer\Model\Customer $customer */
$customer = $customerFactory->create();
//$customer->setId($customerId); // This seem redundant
/** @var \Magento\Customer\Model\Data\Customer $customerData */
// interface \Magento\Customer\Api\Data\CustomerInterface
$customerData = $customer->getDataModel();
$customerData->setId($customerId);

$customerData->setCustomAttribute('my_custom_attribute', $value);

$customer->updateData($customerData);

/** @var \Magento\Customer\Model\ResourceModel\Customer $customerResource */
/** @var \Magento\Customer\Model\ResourceModel\CustomerFactory $customerResourceFactory */
$customerResource = $customerResourceFactory->create();

if ($value != "") {
    $customerResource->saveAttribute($customer, 'my_custom_attribute');
}
|improve this answer|||||
  • I have followed the same, but its not saving. could you please help me. – Venu Joginpally Feb 20 '17 at 14:53
  • Dunno why but i got my script working with this approach, whereas using $customer->setCustomAttribute('attr','val') was working only on the first entry I was saving. in my dev environment it was working also the other way, but not in my stage environment... really strange. Any clue? – sissy Feb 22 '18 at 9:34
  • I saw this kind of behaviour too. I don't recall if there were products or customers. And Magento 2 was in a kind of infinite loop. The debug trace had Gbs. – obscure Feb 22 '18 at 9:37
  • 1
    It may not be your case, but my workaround to the save issue that took too long, was to use object manager instead of injecting classes in constructor. – obscure Feb 23 '18 at 8:49
  • magento.stackexchange.com/questions/191947/… it working without effecting customer session – Kanhaiya lal Jul 13 '18 at 10:57
0

I have a quite nice solution for this :

protected $customerRepository;

public function __construct(
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
) {
    $this->customerRepository = $customerRepository;
}

...

public function updateCustomerAttribute($customerId, $attributeCode, $value) {
    $customerData = $this->customerRepository->getById($customerId);
    $customerData->setCustomAttribute($attributeCode, $value);
    $this->customerRepository->save($customerData);
}
|improve this answer|||||

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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