Create a customer address attribute programmatically in Magento 2 using the simple module by Best Coding Standard Approach using Setup patch data.
In our demo, I have created a simple text field attribute for a customer address called Nickname.
You can see a customer attribute in backend using Customer -> All Customer -> Click on Edit Customer Link.
Go to Addresses Tab and edit or add new Address.
Create a customer address attribute we need to create a PHP file for defining our custom, customer address attribute name and attribute_code.
We need to create a PHP file inside the Setup\Patch\Data folder.
Let’s start with a simple custom module to create custom customer address attribute,
You need to create the first registration.php and module.xml file for defining our module to Magento. Here I have used Rbj as Packagename where AddressAttribute is module name.
Path: app/code/Rbj/AddressAttribute/registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Rbj_AddressAttribute',
__DIR__
);
Create module.xml file, Path: app/code/Rbj/AddressAttribute/etc/module.xml
<?xml version="1.0" ?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Rbj_AddressAttribute" setup_version="1.0.0"> </module> </config>
Create AddressAttribute.php file to define our custom customer address attribute,
Path: app/code/Rbj/AddressAttribute/Setup/Patch/Data/AddressAttribute.php
<?php declare(strict_types=1);
/**
* Patch to create Customer Address Attribute
*
* Creates nickname custom address attribute
*
* @author Rakesh Jesadiya
* @package Rbj_CustomerAddress
*/
namespace Rbj\CustomerAddress\Setup\Patch\Data;
use Magento\Eav\Model\Config;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\Patch\DataPatchInterface;
/**
* Class AddressAttribute
*/
class AddressAttribute implements DataPatchInterface
{
/**
* @var Config
*/
private $eavConfig;
/**
* @var EavSetupFactory
*/
private $eavSetupFactory;
/**
* AddressAttribute constructor.
*
* @param Config $eavConfig
* @param EavSetupFactory $eavSetupFactory
*/
public function __construct(
Config $eavConfig,
EavSetupFactory $eavSetupFactory
) {
$this->eavConfig = $eavConfig;
$this->eavSetupFactory = $eavSetupFactory;
}
/**
* {@inheritdoc}
*/
public static function getDependencies(): array
{
return [];
}
/**
* {@inheritdoc}
*/
public function apply()
{
$eavSetup = $this->eavSetupFactory->create();
$eavSetup->addAttribute('customer_address', 'nickname', [
'type' => 'varchar',
'input' => 'text',
'label' => 'Nickname',
'visible' => true,
'required' => false,
'user_defined' => true,
'system' => false,
'group' => 'General',
'global' => true,
'visible_on_front' => false,
]);
$customAttribute = $this->eavConfig->getAttribute('customer_address', 'nickname');
$customAttribute->setData(
'used_in_forms',
['adminhtml_customer_address',
'customer_address_edit',
'customer_register_address']
);
$customAttribute->save();
}
/**
* {@inheritdoc}
*/
public function getAliases(): array
{
return [];
}
}
In the above file, You can set used_in_forms value as per your requirement to display attribute in a different section of customer page.
Now Run the command from the Magento root instance,
php bin/magento setup:upgrade
You can see the new Customer address attribute is generated in a defined scope above.
One new entry generated in the eav_attribute table.

Can nickname be displayed on frontend using the above code
Hi Mohan, You can display this new field in frontend but for that you have to override
vendor/magento/module-customer/view/frontend/templates/address/edit.phtmlfile in your module or theme and add below code in it.getAttributeData()->getFrontendLabel('nickname'); ?>
<input type="text" name="nickname" value="getAddress()->getCustomAttribute('nickname') === null) ? "" : $block->getAddress()->getCustomAttribute('nickname')->getValue(); ?>" title="" class="input-text" id="nickname">
This is working for me, hope this will work for you. Thank you