Adicionar atributos de produto dinamicamente

Você pode estender atributos de produto sem registrá-los no Adobe Commerce criando um plug-in para adicionar os atributos durante o processo de sincronização de dados.

NOTE
A melhor maneira de estender atributos de produto é adicioná-los a Adobe Commerce where you can configure and manage them from the Commerce Admin. Only add them dynamically if you need them solely for Commerce storefront services and do not want to register them in Adobe Commerce. You also have the option to manage custom attributes using API Mesh com o Catalog Service para estender o esquema Catalog Service GraphQL.

Adicionar atributos de produto

Crie um plug-in que adicione um customer_attribute à classe Magento\CatalogDataExporter\Model\Provider\Product\Attributes.

  1. Atualize o arquivo de configuração de injeção de dependência (di.xml) para definir o plug-in.

    code language-xml
    <type name="Magento\CatalogDataExporter\Model\Provider\Product\Attributes">
      <plugin name="product_customer_attributes" type="Vendor\CatalogDataExporter\Model\Plugin\AddAttribute"/>
    </type>
    
  2. Crie o plug-in.

    code language-php
     <?php
     declare(strict_types=1);
    
     namespace Vendor\CatalogDataExporter\Model\Plugin;
    
     use Magento\CatalogDataExporter\Model\Provider\Product\Attributes;
    
     class AddAttribute {
    
          /**
           * @param Attributes $subject
           * @param array $result
           * @param $arguments
           * @return array
           * @throws \Zend_Db_Statement_Exception
           */
           public function afterGet(Attributes $subject, array $result, $arguments): array
           {
               $additionalAttributes = [];
               $attributeCode = 'customer_attribute';
               foreach ($result as $product) {
                   if (!isset($product['productId']) || !isset($product['storeViewCode'])) {
                       continue;
                   }
                   // HINT: if needed, do filtration by "storeViewCode" and or "productId"
    
                   $productId = $product['productId'];
                   $storeViewCode = $product['storeViewCode'];
    
                   $newKey = \implode('-', [$product['storeViewCode'], $product['productId'], $attributeCode]);
                   if (isset($additionalAttributes[$newKey])) {
                       continue;
                   }
                   $additionalAttributes[$newKey] = [
                       'productId' => $productId,
                       'storeViewCode' => $storeViewCode,
                       'attributes' => [
                           'attributeCode' => $attributeCode,
                           // provide single or multiple values for the attribute
                           'value' => [
                               rand(1, 42)
                           ]
                       ]
                   ];
    
               }
    
               return array_merge($result, $additionalAttributes);
           }
     }
    

    Após adicionar o plug-in, as alterações são sincronizadas com os serviços da loja conectados durante a próxima sincronização agendada. Para enviar as atualizações imediatamente, use o seguinte comando da CLI para iniciar o processo de sincronização manualmente.

    code language-shell
    bin/magento saas:resync --feed=products
    

Declarar metadados de atributo de produto personalizado

Se você criar dinamicamente um atributo de produto personalizado e quiser usá-lo para exibição, pesquisa ou filtragem nos serviços da loja, adicione os metadados do atributo de produto para configurar o comportamento da loja.

  1. Atualize o arquivo de configuração de injeção de dependência (di.xml) para definir o plug-in para os metadados de atributo de produto.

    code language-xml
    <type name="Magento\CatalogDataExporter\Model\Provider\ProductMetadata">
      <plugin name="product_customer_attributes_metadata" type="Vendor\CatalogDataExporter\Model\Plugin\AddAttributeMetadata"/>
    </type>
    
  2. Crie o plug-in para o seguinte provedor Magento\CatalogDataExporter\Model\Provider\ProductMetadata.

    Verificar ProductAttributeMetadata em vendor/magento/module-catalog-data-exporter/etc/et_schema.xml quanto a campos obrigatórios.

    code language-php
     <?php
     declare(strict_types=1);
    
     namespace Vendor\CatalogDataExporter\Model\Plugin;
    
     use Magento\CatalogDataExporter\Model\Provider\ProductMetadata;
    
     class AddAttributeMetadata {
    
          /**
           * @param ProductMetadata $subject
           * @param array $result
           * @param $arguments
           * @return array
           * @throws \Zend_Db_Statement_Exception
           */
          public function afterGet(ProductMetadata $subject, array $result, $arguments): array
          {
               $result[] = [
                 'id' => '123',
                 // provide storeCode, websiteCode and storeViewCode applicable for your AC instance
                 'storeCode' => 'default',
                 'websiteCode' => 'base',
                 'storeViewCode' => 'default',
                 // specify the customer attribute code - should be the same as used in the products attributes plugin
                 'attributeCode' => 'customer_attribute',
                 // only product attributes are supported
                 'attributeType' => 'catalog_product',
                 // specify the data type
                 'dataType' => 'int',
                 'multi' => false,
                 'label' => 'Customer Attribute',
                 'frontendInput' => 'select',
                 'required' => false,
                 'unique' => false,
                 'global' => true,
                 'visible' => true,
                 'searchable' => true,
                 'filterable' => true,
                 // This value must be set to true to export it to the storefront services
                 'visibleInCompareList' => true,
                 'visibleInListing' => true,
                 'sortable' => true,
                 'visibleInSearch' => true,
                 'filterableInSearch' => true,
                 'searchWeight' => 1.0,
                 'usedForRules' => true,
                 'boolean' => false,
                 'systemAttribute' => false,
                 'numeric' => false,
                 // specify the list of attribute options
                 'attributeOptions' => [
                     'option1',
                     'option2',
                     'option3'
                 ]
              ];
    
               return $result;
          }
       }
    

    Após adicionar o plug-in, as alterações são sincronizadas com os serviços da loja conectados durante a próxima sincronização agendada. Para enviar as atualizações imediatamente, use o seguinte comando da CLI para iniciar o processo de sincronização manualmente.

    code language-shell
    bin/magento saas:resync --feed=productAttributes
    
recommendation-more-help
commerce-help-data-export