Limpar todas as regravações de URL - Empresa (1,13)

27

Depois de várias importações bagunçadas, fiquei com uma carga de reescrições de URL que preciso remover.

Estou executando o Enterprise 1.13

Quando tive esse problema na comunidade, simplesmente truncei core_url_rewritee reindexei.

No entanto, no Enterprise, percebo que existem várias tabelas diferentes que controlam as reescritas.

  • enterprise_url_rewrite
  • enterprise_url_rewrite_category_cl
  • enterprise_url_rewrite_product_cl
  • enterprise_url_rewrite_redirect
  • enterprise_url_rewrite_redirect_cl
  • enterprise_url_rewrite_redirect_rewrite

Estou seguro para truncar todos eles?

Prevejo totalmente que alguém me diga que nunca deveria truncar essas tabelas, portanto peço desculpas pela ingenuidade com antecedência.

JamesAllwood
fonte
O que você quer dizer com "várias tabelas diferentes que controlam reescritas"? No EE, geralmente fazia o mesmo que no CE. Truncar core_url_rewritee funcionou.
Marius
Oi Marius. Estas são as tabelas que procuram controlar reescritas. Eu havia truncado core_url_rewrites, mas isso não afetou os listados em admin. enterprise_url_rewrite enterprise_url_rewrite_category_cl enterprise_url_rewrite_product_cl enterprise_url_rewrite_redirect enterprise_url_rewrite_redirect_cl enterprise_url_rewrite_redirect_rewrite Obrigado
JamesAllwood 22-13 de May13
Oh, desculpe. Minha culpa. Eu perdi essa linha "Estou executando o Enterprise 1.13". Ainda não tenho experiência com o EE 1.13. Me ignore por enquanto.
Marius
11
Algo a considerar: gist.github.com/Vinai/5451584
B00MER
11
Atualizamos recentemente o Magento EE 1.12 para o EE 1.13 para uma de nossas lojas e escrevemos um post em nosso site sobre mudanças e problemas que podem surgir: code4business.de/update-magento-enterprise-edition-1-13-0-2 /… A postagem tem uma tradução em inglês na parte inferior da página.
user2830524

Respostas:

30

Estamos em uma situação semelhante à sua, James. Depois de muita pesquisa, é isso que eu criei:

A core_url_rewritetabela agora está obsoleta. Em vez disso, o Magento EE 1.13 agora armazena as regravações enterprise_url_rewrite.

Tabelas: enterprise_*_category_rewriteuse catalog_*_entity_url_keytabelas para recriar as duas tabelas de reescrita ao executarphp indexer.php --reindex catalog_url_*

Quando você adiciona um 'URL Redirect' em admin Catalog-> URL Redirects para um URL personalizado, ele é adicionado à enterprise_url_rewrite_redirecttabela e o sinalizador para Magento de que o índice agora está desatualizado é inserido na enterprise_url_rewrite_redirect_cltabela que, ao executar, php indexer.php --reindex url_redirectreconstrói a enterprise_url_rewrite_redirect_rewritetabela.

Nota rápida, qualquer tabela que termina em _cl é segura para truncar, o 'CL' significa Change Log e é usado pelo Magento para verificar se é necessária uma nova indexação.

No que diz respeito às tabelas URL Key, ainda estou um pouco sem noção do motivo pelo qual existem duas entradas de chave URL uma dentro catalog_*_entity_url_keye outra dentro catalog_*_entity_varchar(atributo 90), mas presumo que seja isso o que acontece:

Quando você cria um novo produto / categoria, o Magento usa o nome para gerar uma url_key que é colocada em catalog_*_entity_url_keyAND catalog_*_entity_varchar, mas a tabela principal usada pelo Magento é catalog_*_entity_url_keyporque, se você o truncar e executar, php indexer.php --reindex catalog_url_*suas enterprise_*_category_rewritetabelas estarão vazias e os produtos / categorias em o frontend exibirá URLs feias, ou seja, http://example.com/catalog/product/view/id/123/etc/etcnão amigável para SOE. Acredito que as duas tabelas estejam relacionadas e sejam usadas para criar a enterprise_url_rewritetabela, porque essa tabela armazena um 'caminho_de_ requisição', provavelmente a url_key dentro da catalog_*_entity_varchartabela e um 'identificador', que é o principal Chave de URL da catalog_*_entity_url_keytabela. Eu poderia estar completamente errado sobre as tabelas url_key e varchar, então estou pensando em voz alta.

De qualquer forma, para truncar e reconstruir com êxito todas as tabelas de reescrita, você pode executar:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE `core_url_rewrite`;
TRUNCATE TABLE `enterprise_catalog_category_rewrite`;
TRUNCATE TABLE `enterprise_catalog_product_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite_category_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_product_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_rewrite`;
SET FOREIGN_KEY_CHECKS = 1;

e então execute:

sudo php indexer.php --reindex catalog_url_product
sudo php indexer.php --reindex catalog_url_category
sudo php indexer.php --reindex url_redirect

Se você também truncar enterprise_url_rewrite_redirect, perderá todos os redirecionamentos personalizados que vê no painel do administrador, talvez seja esse o seu objetivo, pois você ficou com uma tonelada de URLs inúteis. Contanto que você NÃO trunque as tabelas '* _entity_url_key', você estará bem.

Nossa história foi um pouco diferente, porque tivemos chaves de URL duplicadas e grandes problemas com nomes de produtos das importações do Excel após a atualização para 1,13 da 1,11, então escrevi esse script rápido para redefinir a catalog_product_entity_url_keytabela e as chaves de URL e os caminhos de URL na catalog_product_entity_varchartabela usando o produto nomes. Anexei o código abaixo, mas se você usá-lo, use-o por sua conta e risco.

<?php
include_once('app/Mage.php');
Mage::app();

$dbHandle          = Mage::getSingleton('core/resource')->getConnection('core_write');
$productCounter    = 0;
$nameFixCounter    = 0;
$vUrlKeyFixCounter = 0;
$urlPathCounter    = 0;
$urlKeyCounter     = 0;
$productCollection = $dbHandle->query("SELECT entity_id, sku FROM catalog_product_entity");

while($product = $productCollection->fetch()) {    
  $dataString       = null;

  $oldProductName   = $dbHandle->query("SELECT value FROM catalog_product_entity_varchar WHERE entity_id = '".$product['entity_id']."' AND attribute_id = 65")->fetch();
  $oldVarcharUrlKey = $dbHandle->query("SELECT value FROM catalog_product_entity_varchar WHERE entity_id = '".$product['entity_id']."' AND attribute_id = 90")->fetch();
  $oldUrlPath       = $dbHandle->query("SELECT value FROM catalog_product_entity_varchar WHERE entity_id = '".$product['entity_id']."' AND store_id = 0 AND attribute_id = 91")->fetch();
  $oldUrlKey        = $dbHandle->query("SELECT value FROM catalog_product_entity_url_key WHERE entity_id = '".$product['entity_id']."'")->fetch();

  $newProductName   = preg_replace('/\s+/', ' ', trim(preg_replace('/[^\x20-\x21\x23-\x2B\x2D-\xE7]/', ' ', $oldProductName['value'])));
  $newUrlKey        = preg_replace('/\s+/', '-', trim(preg_replace('/[^\x30-\x39\x61-\x7A]/', ' ', strtolower($newProductName))));

  if (strcmp($oldProductName['value'], $newProductName)) {
    echo "-[".$oldProductName['value']."]\n";
    echo "+[".$newProductName."]\n";
    $dbHandle->query('UPDATE catalog_product_entity_varchar SET value = "'.$newProductName.'" WHERE entity_id = "'.$product['entity_id'].'" AND attribute_id = 65');
    ++$nameFixCounter;
  }

  if (strcmp($oldVarcharUrlKey['value'], $newUrlKey)) {
    echo "-[".$oldVarcharUrlKey['value']."]\n";
    echo "+[".$newUrlKey."]\n";
    if ($oldVarcharUrlKey['value'] === null) {
      $dbHandle->query("INSERT INTO catalog_product_entity_varchar (entity_type_id, attribute_id, store_id, entity_id, value) VALUES ('4', '90', '0', '".$product['entity_id']."', '".$newUrlKey."')");
    } else {
      $dbHandle->query("UPDATE catalog_product_entity_varchar SET value = '".$newUrlKey."' WHERE entity_id = '".$product['entity_id']."' AND attribute_id = 90");
    }
    ++$vUrlKeyFixCounter;
  }

  if (strcmp($oldUrlPath['value'], $newUrlKey.'.html')) {
    echo "-[".$oldUrlPath['value']."]\n";
    echo "+[".$newUrlKey.".html]\n";
    if ($oldUrlPath['value'] === null) {
      $dbHandle->query("INSERT INTO catalog_product_entity_varchar (entity_type_id, attribute_id, store_id, entity_id, value) VALUES ('4', '91', '0', '".$product['entity_id']."', '".$newUrlKey.".html')");
    } else {
      $dbHandle->query("UPDATE catalog_product_entity_varchar SET value = '".$newUrlKey.".html' WHERE entity_id = '".$product['entity_id']."' AND store_id = 0 AND attribute_id = 91");
    }
    ++$urlPathCounter;
  }

  if (strcmp($oldUrlKey['value'], $newUrlKey)) {
    echo "-[".$oldUrlKey['value']."]\n";
    echo "+[".$newUrlKey."]\n";
    if ($oldUrlKey['value'] === null) {
      $dbHandle->query("INSERT INTO catalog_product_entity_url_key (entity_type_id, attribute_id, store_id, entity_id, value) VALUES ('4', '90', '0', '".$product['entity_id']."', '".$newUrlKey."')");
    } else {
      $dbHandle->query("UPDATE catalog_product_entity_url_key SET value = '".$newUrlKey."' WHERE entity_id = '".$product['entity_id']."'");
    }
    ++$urlKeyCounter;
  }

  $report  = "[".++$productCounter."] ";
  $report .= "NAME: [".(strcmp($oldProductName['value'], $newProductName)?'!=':'==')."] ";
  $report .= "V_KEY: [".(strcmp($oldVarcharUrlKey['value'], $newUrlKey)?'!=':'==')."] ";
  $report .= "PATH: [".(strcmp($oldUrlPath['value'], $newUrlKey.'.html')?'!=':'==')."] ";
  $report .= "KEY: [".(strcmp($oldUrlKey['value'], $newUrlKey)?'!=':'==')."]\n";
  echo $report;

}
echo 'Total Products: ['.$productCounter.'] Names: ['.$nameFixCounter.'] V_Keys: ['.$vUrlKeyFixCounter.'] Paths: ['.$urlPathCounter.'] Keys: ['.$urlKeyCounter.']';

O código pode ser ajustado para usar o método Magentos formatKey aqui: http://www.magentocommerce.com/wiki/3_-_store_setup_and_management/seo/url_key_characters_conversion infelizmente me deparei com o wiki depois que eu atualizei todas as chaves para que eu não me incomodei reupdating tudo de novo.

Espero que ajude :)!

Oleg
fonte
sudo php indexer.php --reindex catalog_url_catalogdeveria ser sudo php indexer.php --reindex catalog_url_category.
Matthias Zeis 10/10
Estou tentando fazer o mesmo agora. Depois de truncar todas as tabelas, apenas os URLs diretos de categoria e produto são reindexados. Não encontrei nenhuma entrada para produtos em categorias como catalog/product/view/id/XXX/category/YYY. Você pode confirmar que isso é o mesmo para você? Eu sou meio ignorante sobre isso ... É um bug ou estou fazendo algo errado? Tentei fazer o mesmo em uma nova instalação da 1.13.0.2, a mesma coisa aconteceu. As regravações funcionam bem no frontend, mas nenhuma categoria está definida.
fmrng
9

Com base no que eu vi brincando com o EE 1.13 em um ambiente de teste e em alguns pequenos testes que acabei de fazer, você deve poder truncar essas tabelas e reconstruir manualmente manualmente todos os índices de URL da CLI.

As tabelas * _cl são usadas nos TRIGGERS encontrados na catalog_product_entity_url_keytabela. Os registros que eles inserem nessa tabela * _cl são o que, penso eu, é usado para indicar o que precisa ser reindexado após as gravações.

Aqui está o que eu fiz. Depois de usar a ferramenta CLI para recriar os índices, tudo parecia estar pronto. Truncamento MySql…

TRUNCATE TABLE `enterprise_url_rewrite_redirect_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect`;
TRUNCATE TABLE `enterprise_url_rewrite_product_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_category_cl`;
TRUNCATE TABLE `enterprise_url_rewrite`;
TRUNCATE TABLE `enterprise_catalog_product_rewrite`;
TRUNCATE TABLE `enterprise_catalog_category_rewrite`;
TRUNCATE TABLE `core_url_rewrite`;

Então na CLI…

php shell/indexer.php --reindex catalog_url_product
php shell/indexer.php --reindex catalog_url_category
php shell/indexer.php --reindex url_redirect

Deixe-nos saber seus resultados ... como Marius, ainda não construí um site EE 1.13 e tenho apenas a experiência de mexer com ele desde o Imagine. :)

davidalger
fonte
11
Olá David, Obrigado pela sua resposta detalhada. Eu tentei suas instruções, mas sem sorte, infelizmente. Ele limpou todas as reescritas, mas a execução de indexer.php não regenerou nenhuma. Da noite para o dia, o suporte do Magento realmente voltou para mim, e seu conselho era que as regravações de URL agora sejam salvas em: - catalog_product_entity_url_key para produtos - catalog_category_entity_url_key para categorias Tentei limpá-las também, embora na verdade houvesse apenas duas entradas, mas novamente agora sorte. Pedi-lhes mais esclarecimentos, para que você saiba assim que voltarem para mim.
JamesAllwood
Uma coisa que notei ao analisar isso foi que as reescritas de URL são armazenadas em enterprise_url_rewritevs core_url_rewritecomo eram antes. As catalog_*_entity_url_keytabelas parecem ser uma tabela replicada com as teclas de URL para uso do indexador e também são as tabelas com os gatilhos relacionados às reescritas de URL.
Davidalger #
@Francesco, você já executou esse script após a atualização da 1.12? Caso contrário, seria de esperar que você precisasse executá-lo, e eu não chamaria isso de buggy, pois faz parte do processo de atualização documentada que vai de 1.12 a 1.13.
davidalger
@avidalger: você está certo, o script funciona quase bem (ele cria alguns URLs estranhos, mas apenas alguns). No entanto, a funcionalidade de reescrita de URL é bastante fraca nesta versão do EE (por exemplo, alterar a chave de URL de um produto e salvá-lo, não é ' t trabalha como esperado)
Fra
Esta resposta deve ser aceita. Posso confirmar que isso funciona no EE 1.13.
Musicliftsme
4

Uma observação sobre o uso do TRUNCATE:

TRUNCATE TABLE `enterprise_url_rewrite`;

dá um erro devido a referências de chave estrangeira:

ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`customerx_dev`.`enterprise_catalog_category_rewrite`, CONSTRAINT `FK_415B32DA3DF924D5C803CF24EB3AC1D9` FOREIGN KEY (`url_rewrite_id`) REFERENCES `customerx_dev`.`enterprise_url_rewrite` (`url_rewrite_i)

Executar comandos truncar / excluir como este funcionaria:

TRUNCATE TABLE `enterprise_url_rewrite_redirect_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect`;
TRUNCATE TABLE `enterprise_url_rewrite_product_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_category_cl`;
TRUNCATE TABLE `enterprise_catalog_product_rewrite`;
TRUNCATE TABLE `enterprise_catalog_category_rewrite`;
TRUNCATE TABLE `core_url_rewrite`;
DELETE FROM `enterprise_url_rewrite`;
Sven
fonte
Use SET FOREIGN_KEY_CHECKS = 0;antes do seu TRUNCATE ...e SET FOREIGN_KEY_CHECKS = 1;na parte inferior, depois deDELETE FROM ...
Oleg
4

A resposta simples é Não , não é seguro truncar essas tabelas, pelo menos se você não souber a consequência:

  • Truncar todas as tabelas de reescrita e executar a indexação de leads em um site de trabalho

Contudo:

  • Você perderá todas as regravações personalizadas (isso é normal)
  • Catalog -> Url Redirectestará vazio (no EE 1.13.1) (que parece um bug de acordo com o Magento, este é o comportamento esperado no 1.13.1) (veja também o comentário abaixo)
Fra
fonte
2
Gostaria de acrescentar que Catalog -> Url Redirectmostra apenas reescritas que não são do sistema. Portanto, apenas suas reescritas personalizadas serão exibidas aqui. ou seja, linhas com enterprise_url_rewrite.system = 0.
Musicliftsme
sim, você está certo, melhorei a resposta com as últimas informações que recebi da equipe de suporte do Magento. Sinta-se livre para melhorar a minha resposta, se desejar
Fra