How to create customer attribute for specific website level Magento 2?

You can create user-defined customer attributes using Patch Data in Magento 2.

If you have some requirement to show customer attributes to only a given website in multi website setup.
This article displays customer attributes for specific website levels.

Let’s hope you have created a simple module,
Just create a new Data Patch file under the path, app/code/<Vendor>/<Modulename>/Setup/Patch/Data/CustomerAttributes.php

We have to create a new attribute called ‘mobile’ and display it on the customer registration page, and customer edit page.

<?php declare(strict_types=1);

namespace Rbj\Blog\Setup\Patch\Data;

use Exception;
use Magento\Customer\Api\CustomerMetadataInterface;
use Magento\Customer\Api\Data\AttributeMetadataInterface;
use Magento\Customer\Model\Customer;
use Magento\Customer\Model\ResourceModel\Attribute as AttributeResource;
use Magento\Customer\Setup\CustomerSetup;
use Magento\Customer\Setup\CustomerSetupFactory;
use Magento\Framework\Exception\AlreadyExistsException;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\Patch\DataPatchInterface;
use Magento\Framework\Validator\ValidateException;
use Magento\Store\Api\Data\WebsiteInterface;
use Magento\Store\Api\WebsiteRepositoryInterface;
use Psr\Log\LoggerInterface;

class CustomerAttributes implements DataPatchInterface
{
    private ?CustomerSetup $customerSetup = null;
    private const MOBILE_CUSTOMER_ATTRIBUTE = 'mobile';
    public function __construct(
        private ModuleDataSetupInterface $moduleDataSetup,
        private CustomerSetupFactory $customerSetupFactory,
        private AttributeResource $attributeResource,
        private WebsiteRepositoryInterface $websiteRepository,
        private LoggerInterface $logger
    ) {
    }

    public function apply(): self
    {
        try {
            $this->createMobileAttribute();
        } catch (Exception $exception) {
            $this->logger->error($exception->getMessage());
        }

        return $this;
    }

    public static function getDependencies(): array
    {
        return [];
    }

    public function getAliases(): array
    {
        return [];
    }

    public function createMobileAttribute(): void
    {
        $this->createAttribute(self::MOBILE_CUSTOMER_ATTRIBUTE);
        $this->updateAttribute(self::MOBILE_CUSTOMER_ATTRIBUTE);
    }

    /**
     * Create New Customer Attribute called Mobile
     *
     * @param string $attributeCode
     * @return void
     * @throws LocalizedException
     * @throws ValidateException
     */
    private function createAttribute(string $attributeCode): void
    {
        $customerAttributeSetup = $this->getCustomerSetup();
        $attribute = $customerAttributeSetup->getEavConfig()->getAttribute(Customer::ENTITY, $attributeCode);

        if ($attribute && $attribute->getId()) {
            return;
        }

        $customerAttributeSetup->addAttribute(
            Customer::ENTITY,
            $attributeCode,
            [
                'type' => 'varchar',
                'label' => 'Mobile',
                'input' => 'text',
                'position' => 70,
                'used_in_forms' => ['customer_account_create', 'customer_account_edit'],
                AttributeMetadataInterface::REQUIRED => false,
                AttributeMetadataInterface::VISIBLE => false,
                AttributeMetadataInterface::USER_DEFINED => true,
                AttributeMetadataInterface::SYSTEM => 0,
                AttributeMetadataInterface::IS_USED_IN_GRID => false,
                AttributeMetadataInterface::IS_VISIBLE_IN_GRID => false,
                AttributeMetadataInterface::IS_FILTERABLE_IN_GRID => true,
                AttributeMetadataInterface::IS_SEARCHABLE_IN_GRID => true
            ]
        );

        $attributeGroupId = $customerAttributeSetup->getDefaultAttributeGroupId(
            CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER,
            CustomerMetadataInterface::ATTRIBUTE_SET_ID_CUSTOMER
        );

        $customerAttributeSetup->addAttributeToSet(
            CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER,
            CustomerMetadataInterface::ATTRIBUTE_SET_ID_CUSTOMER,
            (int)$attributeGroupId,
            $attributeCode
        );
    }

    /**
     * This method used to assigned customer attribute to only specific website only in multiple websites.
     *
     * @param string $attributeCode
     * @return void
     * @throws LocalizedException
     * @throws AlreadyExistsException
     */
    private function updateAttribute(string $attributeCode): void
    {
        $website = $this->getUsWebsite();

        if (!$website) {
            return;
        }

        $customerAttributeUpdateSetup = $this->getCustomerSetup();

        $attribute = $customerAttributeUpdateSetup->getEavConfig()
            ->getAttribute(Customer::ENTITY, $attributeCode)
            ->loadByCode(Customer::ENTITY, $attributeCode);

        if (!$attribute || !$attribute->getId()) {
            return;
        }

        $attribute->setWebsite($website);
        $attribute->setData('scope_is_visible', 1);

        $usedInForms = ['customer_account_create', 'customer_account_edit'];
        $attribute->setData('used_in_forms', $usedInForms);

        $this->attributeResource->save($attribute);
    }

    private function getUsWebsite(): ?WebsiteInterface
    {
        try {
            $website = $this->websiteRepository->get('us_site'); // REPLACE 'us_site' WITH YOUR WEBSITE CODE
        } catch (NoSuchEntityException $exception) {
            return null;
        }

        return $website;
    }

    private function getCustomerSetup(): CustomerSetup
    {
        if (!$this->customerSetup) {
            $this->customerSetup = $this->customerSetupFactory->create(['setup' => $this->moduleDataSetup]);
        }

        return $this->customerSetup;
    }
}

Now, Run the Setup upgrade command to install the customer attribute.

php bin/magento setup:upgrade