Cancella tutte le riscritture URL - Enterprise (1.13)


27

Dopo varie importazioni incasinate, mi è rimasto un carico di riscritture di URL che devo rimuovere.

Sto eseguendo Enterprise 1.13

Quando ho avuto questo problema in comunità, ho semplicemente troncato core_url_rewritee il reindicizzato.

Tuttavia, in Enterprise, noto che esistono diverse tabelle che controllano le riscritture.

  • 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

Sono sicuro di troncarli tutti?

Prevedo pienamente che qualcuno mi dica che non dovrei mai troncare queste tabelle, quindi mi scuso per l'ingenuità in anticipo.


Cosa intendi con "un numero di tabelle diverse che controllano le riscritture"? Su EE di solito facevo la stessa cosa su CE. Tronca core_url_rewritee ha funzionato.
Marius

Ciao Marius. Queste sono le tabelle che cercano di controllare le riscritture. Avevo troncato core_url_rewrites, ma non ha avuto alcun effetto su quelli elencati in 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 Grazie
JamesAllwood

Oh scusa. Colpa mia. Ho perso questa riga "Sto eseguendo Enterprise 1.13". Non ho (ancora) esperienza con EE 1.13. Ignorami per ora.
Marius

1
Qualcosa da considerare: gist.github.com/Vinai/5451584
B00MER,

1
Di recente abbiamo aggiornato Magento EE 1.12 a EE 1.13 per uno dei nostri negozi e abbiamo scritto un post sul nostro sito Web su modifiche e problemi che potrebbero presentarsi: code4business.de/update-magento-enterprise-edition-1-13-0-2 / ... Il post ha una traduzione in inglese nella parte inferiore della pagina.
user2830524

Risposte:


30

Siamo nella stessa situazione di te James. Dopo molte ricerche, ecco cosa mi è venuto in mente:

La core_url_rewritetabella è ora obsoleta, invece Magento EE 1.13 ora memorizza le riscritture enterprise_url_rewrite.

Tabelle: enterprise_*_category_rewriteutilizzare le catalog_*_entity_url_keytabelle per ricostruire le due tabelle di riscrittura durante l'esecuzionephp indexer.php --reindex catalog_url_*

Quando aggiungi un 'Reindirizzamento URL' nel Catalogo admin-> Reindirizzamenti URL per un URL personalizzato, questo viene aggiunto alla enterprise_url_rewrite_redirecttabella e il flag per Magento che l'indice è ora obsoleto viene inserito nella enterprise_url_rewrite_redirect_cltabella che durante l'esecuzione php indexer.php --reindex url_redirectricostruisce la enterprise_url_rewrite_redirect_rewritetabella.

Nota veloce, qualsiasi tabella che termina con _cl è sicura da troncare, il 'CL' sta per Change Log ed è usato da Magento per verificare se è necessario reindicizzare.

Per quanto riguarda le tabelle delle chiavi URL, sono ancora un po 'all'oscuro del perché ci sono due voci della chiave URL una dentro catalog_*_entity_url_keye una in catalog_*_entity_varchar(attributo id 90), ma suppongo che sia quello che succede:

Quando crei un nuovo prodotto / categoria Magento usa il nome per generare un url_key che viene inserito in catalog_*_entity_url_keyAND in catalog_*_entity_varchar, ma la tabella principale usata da Magento è la catalog_*_entity_url_keyperché se lo tronchi ed esegui le php indexer.php --reindex catalog_url_*tue enterprise_*_category_rewritetabelle saranno vuote e prodotti / categorie in il frontend mostrerà brutti URL cioè http://example.com/catalog/product/view/id/123/etc/etc(non compatibili con SOE) Credo che le due tabelle siano correlate e vengano utilizzate per costruire la enterprise_url_rewritetabella perché questa tabella memorizza un 'request_path' molto probabilmente l'url_key all'interno della catalog_*_entity_varchartabella e un 'identificatore' che è il principale Chiave URL dalla catalog_*_entity_url_keytabella. Potrei sbagliarmi completamente sulle tabelle url_key e varchar, quindi sto solo pensando ad alta voce.

In ogni caso, per troncare e ricostruire correttamente tutte le tabelle di riscrittura è possibile eseguire:

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 quindi eseguire:

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

Se tronchi anche enterprise_url_rewrite_redirectallora perderai tutti i reindirizzamenti personalizzati che vedi nel tuo pannello di amministrazione, forse questo è il tuo obiettivo poiché ti sono rimasti un sacco di URL inutili. Finché NON tronchi le tabelle '* _entity_url_key', starai bene.

La nostra storia era un po 'diversa, perché avevamo duplicati dei codici URL e maggiori problemi con i nomi dei prodotti dalle importazioni Excel dopo l'aggiornamento a 1.13 da 1.11, quindi ho scritto questo veloce script per ripristinare la catalog_product_entity_url_keytabella e le chiavi URL e i percorsi URL nella catalog_product_entity_varchartabella usando il prodotto nomi. Ho allegato il codice seguente, ma se lo usi, lo usi a tuo rischio.

<?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.']';

Il codice può essere modificato per usare il metodo Magentos formatKey qui: http://www.magentocommerce.com/wiki/3_-_store_setup_and_management/seo/url_key_characters_conversion sfortunatamente mi sono imbattuto nel wiki dopo aver aggiornato tutte le chiavi in ​​modo da non preoccuparmi di ricuperare tutto di nuovo.

Spero che sia d'aiuto :)!


sudo php indexer.php --reindex catalog_url_catalogdovrebbe essere sudo php indexer.php --reindex catalog_url_category.
Matthias Zeis,

Sto provando a fare lo stesso adesso. Tuttavia, dopo aver troncato tutte le tabelle, vengono reindicizzati solo gli URL diretti di categoria e prodotto. Non sono riuscito a trovare alcuna voce per prodotti in categorie come catalog/product/view/id/XXX/category/YYY. Potete per favore confermare che questo è lo stesso per voi? Sono un po 'all'oscuro di questo ... È un bug o sto facendo qualcosa di sbagliato? Ho provato a fare lo stesso su una nuova installazione di 1.13.0.2, è successa la stessa cosa. Riscrive funziona perfettamente in frontend, ma nessuna categoria è impostata.
fmrng,

9

Sulla base di ciò che ho visto fare casini con EE 1.13 in un ambiente di test e alcuni piccoli test che ho appena fatto, dovresti essere in grado di troncare semplicemente quelle tabelle e quindi ricostruire manualmente tutti gli indici URL dalla CLI.

Le tabelle * _cl sono utilizzate nei TRIGGERS presenti nella catalog_product_entity_url_keytabella. I record che inseriscono in questa tabella * _cl sono ciò che, a mio avviso, viene utilizzato per indicare ciò che deve essere reindicizzato dopo i salvataggi.

Ecco cosa ho fatto. Dopo aver utilizzato lo strumento CLI per ricostruire gli indici, tutto sembrava essere pronto. Troncamento di 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`;

Quindi sulla CLI ...

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

Facci sapere i tuoi risultati ... come Marius, non ho ancora creato un sito EE 1.13 e ho solo l'esperienza di rovinarlo da quando Imagine. :)


1
Ciao David, grazie per la tua risposta dettagliata. Ho provato le tue istruzioni, ma sfortunatamente non ho avuto fortuna. Ha cancellato tutte le riscritture, ma l'esecuzione di indexer.php non ha rigenerato nessuno. Durante la notte, il supporto di Magento mi è tornato in mente e il loro consiglio era che le riscritture degli URL sono ora salvate in: - catalog_product_entity_url_key per i prodotti - catalog_category_entity_url_key per le categorie che ho provato a cancellare anche queste, anche se in realtà c'erano solo 2 voci in esse, ma di nuovo ora fortuna. Ho chiesto loro ulteriori chiarimenti, quindi ti farò sapere non appena torneranno da me.
James Allwood,

Una cosa che ho notato guardando questo è che le riscritture degli URL sono archiviate in enterprise_url_rewritevs core_url_rewritecome prima. Le catalog_*_entity_url_keytabelle sembrano essere una tabella replicata con le chiavi url utilizzate dall'indicizzatore e sono anche le tabelle con i trigger relativi alla riscrittura degli URL.
davidalger,

@Francesco, hai già eseguito quello script dopo l'aggiornamento dalla 1.12? Altrimenti, ci si aspetterebbe che tu debba eseguirlo, e non lo chiamerei buggy poiché fa parte del processo di aggiornamento documentato che va dall'1.12 all'1.11.
davidalger,

@davidalger: hai ragione lo script funziona quasi bene (crea alcuni Url bizzarri ma solo pochi) Tuttavia la funzionalità di riscrittura dell'URL è piuttosto debole in questa versione EE (per es. cambiare la chiave url per un prodotto e salvarlo, non lo fa ' funziona come previsto)
Fra

Questa risposta dovrebbe essere accettata. Posso confermare che funziona su EE 1.13.
musicliftsme,

4

Una nota sull'uso di TRUNCATE:

TRUNCATE TABLE `enterprise_url_rewrite`;

dà un errore a causa di riferimenti a chiave esterna:

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)

L'esecuzione di comandi di troncamento / eliminazione in questo modo funzionerebbe:

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`;

Usa SET FOREIGN_KEY_CHECKS = 0;prima del tuo TRUNCATE ...e SET FOREIGN_KEY_CHECKS = 1;in fondo, dopoDELETE FROM ...
Oleg il

4

La semplice risposta è No, non è sicuro troncare queste tabelle, almeno se non si conoscono le conseguenze:

  • Troncare tutte le tabelle di riscrittura e l'esecuzione di reindicizzazione conduce a un sito di lavoro

Tuttavia:

  • Perderai tutte le riscritture personalizzate (è normale)
  • Catalog -> Url Redirectsarà vuoto (su EE 1.13.1) (che sembra un bug secondo Magento questo è il comportamento previsto su 1.13.1) (vedi anche il commento sotto)

2
Vorrei solo aggiungere che Catalog -> Url Redirectmostra solo riscritture non di sistema. Quindi, solo le riscritture personalizzate verranno visualizzate qui. cioè righe con enterprise_url_rewrite.system = 0.
musicliftsme,

sì, hai ragione, ho migliorato la risposta con le ultime informazioni che ho ricevuto dal team di supporto Magento. Sentiti libero di migliorare la mia risposta se lo desideri
Fra
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.