Hapus Semua Penulisan Ulang URL - Perusahaan (1.13)

27

Setelah beberapa impor kacau, saya ditinggalkan dengan banyak penulisan ulang URL yang perlu saya hapus.

Saya menjalankan Enterprise 1.13

Ketika saya memiliki masalah ini di komunitas, saya hanya terpotong core_url_rewrite, dan diindeks ulang.

Namun, di Enterprise, saya perhatikan bahwa ada sejumlah tabel berbeda yang mengontrol penulisan ulang.

  • 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

Apakah saya aman untuk memotong semuanya?

Saya sepenuhnya mengantisipasi seseorang untuk memberi tahu saya bahwa saya seharusnya tidak pernah memotong tabel ini, jadi mohon maaf atas kenaifan sebelumnya.

JamesAllwood
sumber
Apa yang Anda maksud dengan 'sejumlah tabel berbeda yang mengontrol penulisan ulang'? Pada EE saya biasanya melakukan hal yang sama seperti pada CE. Potong core_url_rewritedan berhasil.
Marius
Hai Marius. Ini adalah tabel yang terlihat untuk mengontrol penulisan ulang. Saya telah memotong core_url_rewrites, tetapi itu tidak berpengaruh pada yang terdaftar di 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 Terima kasih
JamesAllwood
Oh maaf. Salahku. Saya melewatkan baris ini "Saya menjalankan Enterprise 1.13". Saya belum punya pengalaman (belum) dengan EE 1.13. Abaikan saya untuk saat ini.
Marius
1
Sesuatu untuk dipertimbangkan: gist.github.com/Vinai/5451584
B00MER
1
Kami baru saja memperbarui Magento EE 1.12 ke EE 1.13 untuk salah satu toko kami dan kami menulis posting di situs web kami tentang perubahan dan masalah yang mungkin muncul: code4business.de/update-magento-enterprise-edition-1-13-0-2 / ... Posting memiliki terjemahan bahasa Inggris di bagian bawah halaman.
user2830524

Jawaban:

30

Kami berada dalam situasi yang sama dengan Anda James. Setelah banyak menggali, inilah yang saya temukan:

The core_url_rewritetabel sekarang tidak berlaku lagi bukan Magento EE 1,13 sekarang menyimpan penulisan ulang di enterprise_url_rewrite.

Tabel: enterprise_*_category_rewritegunakan catalog_*_entity_url_keytabel untuk membangun kembali dua tabel penulisan ulang saat Anda menjalankanphp indexer.php --reindex catalog_url_*

Ketika Anda menambahkan 'URL Redirect' di admin Catalog-> URL Redirect untuk URL khusus itu akan ditambahkan ke enterprise_url_rewrite_redirecttabel dan bendera untuk Magento bahwa indeks sekarang sudah usang dimasukkan ke dalam enterprise_url_rewrite_redirect_cltabel yang ketika menjalankan php indexer.php --reindex url_redirectmembangun kembali enterprise_url_rewrite_redirect_rewritetabel.

Catatan cepat, setiap tabel yang diakhiri dengan _cl aman untuk dipotong, 'CL' adalah singkatan dari Change Log dan digunakan oleh Magento untuk memeriksa apakah pengindeksan ulang diperlukan.

Sejauh tabel URL Key pergi, saya masih tidak mengerti mengapa ada dua entri URL Key satu catalog_*_entity_url_keydan satu di catalog_*_entity_varchar(atribut id 90), tapi saya berasumsi inilah yang terjadi:

Ketika Anda membuat produk / kategori baru Magento menggunakan nama untuk menghasilkan url_key yang ditempatkan di catalog_*_entity_url_keyDAN di catalog_*_entity_varchar, tetapi tabel utama yang digunakan oleh Magento adalah catalog_*_entity_url_keykarena jika Anda memotongnya dan menjalankan tabel php indexer.php --reindex catalog_url_*Anda enterprise_*_category_rewriteakan kosong dan produk / kategori dalam frontend akan menampilkan url jelek yaitu http://example.com/catalog/product/view/id/123/etc/etc(tidak ramah SOE) Saya percaya kedua tabel terkait dan digunakan untuk membangun enterprise_url_rewritetabel karena tabel ini menyimpan 'request_path' kemungkinan besar url_key di dalam catalog_*_entity_varchartabel dan 'identifier' yang merupakan primary Kunci URL dari catalog_*_entity_url_keytabel. Saya bisa sepenuhnya salah tentang tabel url_key dan varchar, jadi saya hanya berpikir keras.

Pokoknya untuk berhasil memotong dan membangun kembali semua tabel penulisan ulang Anda dapat menjalankan:

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;

lalu jalankan:

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

Jika Anda juga memotong enterprise_url_rewrite_redirectmaka Anda akan kehilangan semua pengalihan kustom yang Anda lihat di panel admin Anda, mungkin ini adalah tujuan Anda karena Anda ditinggalkan dengan satu ton URL yang tidak berguna. Selama Anda TIDAK memotong tabel '* _entity_url_key' Anda akan baik-baik saja.

Kisah kami sedikit berbeda, karena kami memiliki duplikat Kunci URL dan masalah besar dengan nama produk dari impor excel setelah memutakhirkan menjadi 1,13 dari 1,11 jadi saya menulis skrip cepat ini untuk mengatur ulang catalog_product_entity_url_keytabel dan kunci URL serta jalur URL di catalog_product_entity_varchartabel menggunakan produk nama. Saya melampirkan kode di bawah ini, tetapi jika Anda menggunakannya, gunakan dengan risiko Anda sendiri.

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

Kode dapat di-tweak untuk menggunakan metode Magentos formatKey di sini: http://www.magentocommerce.com/wiki/3_-_store_setup_and_management/seo/url_key_characters_conversion sayangnya saya menemukan wiki setelah saya memperbarui semua kunci sehingga saya tidak repot-repot melakukan reupdating semuanya lagi.

Semoga itu bisa membantu :)!

Oleg
sumber
sudo php indexer.php --reindex catalog_url_catalogseharusnya sudo php indexer.php --reindex catalog_url_category.
Matthias Zeis
Saya mencoba melakukan hal yang sama sekarang. Setelah memangkas semua tabel, hanya URL kategori dan produk langsung yang diindeks ulang. Saya tidak dapat menemukan entri untuk produk dalam kategori suka catalog/product/view/id/XXX/category/YYY. Bisakah Anda mengonfirmasi bahwa ini sama untuk Anda? Saya agak tidak mengerti tentang ini ... Apakah ini bug, atau apakah saya melakukan sesuatu yang salah? Saya mencoba melakukan hal yang sama pada instalasi baru 1.13.0.2, hal yang sama terjadi. Penulisan ulang bekerja dengan baik di frontend, tetapi tidak ada kategori yang ditetapkan.
fmrng
9

Berdasarkan apa yang saya lihat bermain-main dengan EE 1.13 di lingkungan pengujian dan tes kecil cepat yang baru saja saya lakukan, Anda harus dapat memotong tabel-tabel tersebut dan kemudian secara manual membangun kembali semua indeks URL dari CLI.

Tabel * _cl digunakan dalam PEMICU yang ditemukan di atas catalog_product_entity_url_keytabel. Catatan yang mereka masukkan ke dalam tabel * _cl ini adalah apa, saya pikir, digunakan untuk menunjukkan apa yang perlu diindeks ulang setelah disimpan.

Inilah yang saya lakukan. Setelah menggunakan alat CLI untuk membangun kembali indeks, semuanya tampak baik untuk dilakukan. Pemotongan 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`;

Kemudian pada CLI ...

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

Beri tahu kami hasil Anda ... seperti Marius, saya belum membangun situs EE 1.13 dan hanya memiliki pengalaman bermain-main dengan itu sejak Imagine. :)

davidalger
sumber
1
Hai David, Terima kasih atas tanggapan terperinci Anda. Saya mencoba instruksi Anda, tetapi sayangnya tidak berhasil. Itu menghapus semua penulisan ulang, tetapi menjalankan indexer.php tidak membuat ulang apa pun. Semalam, dukungan Magento benar-benar kembali kepada saya, dan saran mereka adalah bahwa penulisan ulang URL sekarang disimpan di: - catalog_product_entity_url_key untuk produk - catalog_category_entity_url_key untuk kategori Saya sudah mencoba membersihkannya juga, walaupun sebenarnya hanya ada 2 entri di dalamnya, tetapi sekali lagi sekarang keberuntungan. Saya telah meminta mereka untuk klarifikasi lebih lanjut, jadi saya akan memberi tahu Anda segera setelah mereka kembali kepada saya.
JamesAllwood
Satu hal yang saya perhatikan ketika melihat ini adalah bahwa penulisan ulang URL disimpan dalam enterprise_url_rewritevs core_url_rewriteseperti sebelumnya. The catalog_*_entity_url_keytabel tampaknya menjadi meja direplikasi dengan url-kunci untuk digunakan oleh pengindeks, dan mereka juga tabel dengan pemicu yang berkaitan dengan penulisan ulang URL.
davidalger
@ Francesco, apakah Anda sebelumnya menjalankan skrip itu setelah memutakhirkan dari 1,12? Jika tidak, maka Anda diharapkan untuk menjalankannya, dan saya tidak akan menyebut kereta itu karena itu bagian dari proses peningkatan yang terdokumentasi mulai dari 1,12 ke 1,13.
davidalger
@davidalger: Anda benar skrip bekerja dengan sangat baik (ini membuat beberapa Url aneh tetapi hanya beberapa). Namun fungsi url menulis ulang cukup lemah dalam rilis EE ini (misalnya mengubah url-key untuk suatu produk dan menyimpannya, tidak t bekerja seperti yang diharapkan)
Fra
Jawaban ini harus diterima. Saya dapat mengkonfirmasi ini berfungsi pada EE 1.13.
musicliftsme
4

Catatan tentang penggunaan TRUNCATE:

TRUNCATE TABLE `enterprise_url_rewrite`;

memberikan kesalahan karena referensi kunci asing:

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)

Menjalankan perintah truncate / delete seperti ini akan bekerja:

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
sumber
Gunakan SET FOREIGN_KEY_CHECKS = 0;sebelum Anda TRUNCATE ...dan SET FOREIGN_KEY_CHECKS = 1;di bagian paling bawah, setelahDELETE FROM ...
Oleg
4

Jawaban sederhananya adalah Tidak , tidak aman untuk memotong tabel ini, setidaknya jika Anda tidak tahu konsekuensinya:

  • Pangkas semua tabel penulisan ulang dan jalankan indeks ulang mengarah ke situs yang berfungsi

Namun:

  • Anda akan kehilangan semua penulisan ulang kustom (itu normal)
  • Catalog -> Url Redirectakan kosong (pada EE 1.13.1) (yang terlihat seperti bug menurut Magento ini adalah perilaku yang diharapkan pada 1.13.1) (lihat juga di bawah komentar)
Fra
sumber
2
Saya hanya ingin menambahkan yang Catalog -> Url Redirecthanya menunjukkan penulisan ulang non-sistem. Jadi, hanya penulisan ulang kustom Anda yang akan ditampilkan di sini. yaitu baris dengan enterprise_url_rewrite.system = 0.
musicliftsme
ya Anda benar, saya telah meningkatkan jawabannya dengan info terakhir yang saya dapatkan dari Tim Dukungan Magento. Jangan ragu untuk meningkatkan jawaban saya jika Anda mau
Fra