Saltar al contenido

Magento 2: ¿Cómo generar la clave de URL del producto al crear un producto desde la API Rest?

Recabamos en el mundo on line y así traerte la respuesta para tu problema, si continúas con alguna difcultad puedes dejar tu duda y contestamos con mucho gusto, porque estamos para servirte.

Solución:

He creado un código personalizado para verificar si la URL key existe o no. Según el flujo utilizado en la funcionalidad de importación de productos en Magento 2.

public function __construct(
    --
    MagentoStoreModelStoreManagerInterface $storeManager, 
    MagentoFrameworkAppResourceConnection $resource, 
    --
) 
    --
    $this->_storeManager = $storeManager;
    $this->_resource = $resource;
    --  




public function createUrlKey($title, $sku) 

    $url = preg_replace('#[^0-9a-z]+#i', '-', $title);
    $urlKey = strtolower($url);
    $storeId = (int) $this->_storeManager->getStore()->getStoreId();
    
    $isUnique = $this->checkUrlKeyDuplicates($sku, $urlKey, $storeId);
    if ($isUnique) 
        return $urlKey;
     else 
        return $urlKey . '-' . time();
    


/*
 * Function to check URL Key Duplicates in Database
 */

private function checkUrlKeyDuplicates($sku, $urlKey, $storeId) 

    $urlKey .= '.html';

    $connection = $this->_resource->getConnection(MagentoFrameworkAppResourceConnection::DEFAULT_CONNECTION);

    $tablename = $connection->getTableName('url_rewrite');
    $sql = $connection->select()->from(
                    ['url_rewrite' => $connection->getTableName('url_rewrite')], ['request_path', 'store_id']
            )->joinLeft(
                    ['cpe' => $connection->getTableName('catalog_product_entity')], "cpe.entity_id = url_rewrite.entity_id"
            )->where('request_path IN (?)', $urlKey)
            ->where('store_id IN (?)', $storeId)
            ->where('cpe.sku not in (?)', $sku);

    $urlKeyDuplicates = $connection->fetchAssoc($sql);

    if (!empty($urlKeyDuplicates)) 
        return false;
     else 
        return true;
    

Para realizar la función CreateUrlKey, agregué en la segunda línea este código:

$lastCharTitle = substr($title, -1);
$lastUrlChar = substr($url, -1);
if ($lastUrlChar == "-" && $lastCharTitle != "-")
    $url = substr($url, 0, strlen($url) - 1);

para eliminar el último “-” si este se genera a partir de la primera línea “preg_replace”. También reemplacé la marca de tiempo con el Sku único, porque en algún momento del proceso de importación automatizado, el tiempo () de dos registros adyacentes puede ser el mismo, por lo que no es único.

Ahora la función es:

public function createUrlKey($title, $sku)

    $url = preg_replace('#[^0-9a-z]+#i', '-', $title);
    $lastCharTitle = substr($title, -1);
    $lastUrlChar = substr($url, -1);
    if ($lastUrlChar == "-" && $lastCharTitle != "-")
        $url = substr($url, 0, strlen($url) - 1);
    

    $urlKey = strtolower($url);
    $storeId = (int) $this->_storeManager->getStore()->getStoreId();

    $isUnique = $this->checkUrlKeyDuplicates($sku, $urlKey, $storeId);
    if ($isUnique) 
        return $urlKey;
     else 
        return $urlKey . '-' . $sku;
    

Calificaciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *