
Você precisa que Camiseta Preta Tamanho GG vire camiseta-preta-tamanho-gg, e que Ação & Cia vire acao-cia. São três coisas na sequência: transliterar o acento, trocar o resto por hífen e limpar as pontas. Nessa ordem, sempre.
<?php
function gerar_slug(string $texto, string $fallback = 'item'): string
{
$tr = Transliterator::create('Any-Latin; Latin-ASCII; Lower()');
if ($tr === null) {
throw new RuntimeException('intl fora do ar: ' . intl_get_error_message());
}
$texto = preg_replace('/[^a-z0-9]+/', '-', $tr->transliterate($texto));
$slug = trim((string) $texto, '-');
return $slug === '' ? $fallback : $slug;
}
echo gerar_slug('Camiseta Preta Tamanho GG'); // camiseta-preta-tamanho-gg
echo gerar_slug('Ação & Cia — 50% OFF'); // acao-cia-50-offO Any-Latin; Latin-ASCII; Lower() é um encadeamento do ICU: o primeiro converte qualquer escrita para o alfabeto latino, o segundo joga fora os acentos, o terceiro baixa a caixa. Como o ICU vem com as tabelas dentro, o resultado é igual no seu Mac e no servidor. Precisa da extensão intl ligada, confira com php -m | grep intl.
E repare no $slug === '' no lugar de um ?:: produto chamado só 0 gera o slug 0, que é falsy, e o operador curto trocaria por item sem você perceber.
O truque antigo era iconv('UTF-8', 'ASCII//TRANSLIT', $texto). Ele funciona na sua máquina e explode em produção porque o resultado depende do locale do processo. Com LC_ALL=C, que é o padrão de muito container e de muito job de cron, o glibc não sabe o que fazer com o ç e devolve ? ou 'c com apóstrofo. Aí o slug sai a-ao e ninguém entende por quê.
Dois produtos chamados Camiseta Preta geram o mesmo slug. Antes de gravar, teste se já existe e vá somando sufixo: camiseta-preta-2, -3. E ponha um índice UNIQUE na coluna, porque duas requisições simultâneas passam pelo mesmo teste no mesmo milissegundo.
Se travou nisso e precisa de ajuda, me chama aqui.
O banner registra o clique só no navegador e some. Veja a tabela MySQL e o endpoint que gravam a…
A classe do comando existe e o bin/magento list ignora ela. Falta o registro no di.xml: aqui vai a classe…
Como traduzir duas mil linhas do pt_BR.csv do Magento 2 lendo com fgetcsv e regravando com fputcsv, sem encostar na…
Produto variável respondendo "Desculpe, este produto não está disponível" mesmo com a variação ativa: limpe os transients do WooCommerce e…
O site responde 503 com "Momentaneamente indisponível para manutenção programada" depois de um update interrompido. Apague o .maintenance e feche…
Troque o intervalo R$ 49,00 – R$ 129,00 do produto variável por A partir de R$ 49,00 com o filtro…