Tabel core_url_rewrite Magento terlalu besar

105

Saya telah memperhatikan sejumlah besar laporan bahwa tabel ini sendiri dapat menjadi sangat berantakan, saya menjalankan situs dengan ~ 5000 SKU dan ~ 250 kategori (satu toko) dan core_url_rewritetabel yang dihasilkan lebih dari 600.000 baris dan lebih dari 500MB besar yang gila.

Ini dapat memperlambat kinerja situs dan menghasilkan basis data yang sangat besar. Saya telah melakukan beberapa penggalian dan menemukan beberapa posting mengenai hal ini, terutama:

// Tautan ini telah dihapus sejak penerapan dewan baru

Sekarang saya mengerti bahwa tabel dapat dipotong dan diindeks ulang, tetapi ini tidak menyelesaikan masalah, itu hanya memperpanjang masalah terjadi lagi.

Dari apa yang saya mengerti, bagian dari masalah adalah produk yang memiliki kunci url yang sama berdasarkan nama produk, sehingga menghasilkan tautan yang diindeks.

Perbaikan yang disebutkan adalah:

app/code/core/Mage/Catalog/Model/Url.php on line ~ 807:

Perubahan:

 if ($product->getUrlKey() == '' && !empty($requestPath)
       && strpos($existingRequestPath, $requestPath) === 0
 ) 

Untuk:

 if (!empty($requestPath)
       && strpos($existingRequestPath, $requestPath) === 0
 ) 

Tetapi bahkan ini tidak sepenuhnya menyelesaikan masalah.

Pertanyaan saya adalah sebagai berikut:

Jika Anda pernah mengalami masalah ini, sudahkah Anda mengatur algoritme yang efektif, logis & efisien yang tidak melibatkan "pengelolaan" masalah berulang kali, tetapi sebenarnya menyelesaikan masalah ini untuk selamanya?

Akan sangat menghargai beberapa wawasan tentang ini.

BTW: Tolong bantulah dirimu sendiri dan periksa seperti apa meja Anda sekarang, Anda mungkin mengalami masalah ini dan dampak kinerja sebagai akibatnya tanpa menyadarinya - saya tidak.

Sunting: Saya telah melakukan kontak dengan www.Nexcess.net (mitra hosting Magento platinum) dan mereka telah mengkonfirmasi bahwa mereka telah meminta klien meminta core_url_rewritemeja mereka karena pemotongan karena terlalu besar.

Kekhawatiran besar saya adalah dampak SEO yang mungkin terjadi, itulah sebabnya saya ingin solusi daripada menunda-nunda masalah agar tidak muncul lagi.

Pembaruan: Nexcess menyebutkan bahwa dengan produk duplikat di dalam tabel itu sebenarnya dapat merugikan SEO apa adanya.

Moose
sumber
Wow, itu meja yang sangat besar. Saya memeriksa sendiri (200 produk) saya dan hanya memiliki ~ 800 baris, tetapi kami tidak memiliki masalah menduplikasi nama produk / URL. Sebagai titik referensi, kami memiliki sekitar 6,6 baris per produk yang terlihat. Saya akui ini bukan perbandingan realistis yang mengerikan, tetapi pada tingkat itu, dengan 5.000 produk kami hanya memiliki ~ 30.000 baris. Saya dapat dengan baik memahami kebutuhan Anda akan solusi, dan akan menonton pertanyaan ini karena saya akan mengimplementasikan situs yang jauh lebih besar.
Pete855217
@ Pete855217: pertanyaan ini terdengar menarik meskipun Anda belum memutarnya.
Mohammad Faisal
1
Ada bug di EE1.12 yang menyebabkan penulisan ulang harus dibuat kembali pada setiap penyimpanan. Mungkin versi 1.7 Anda memiliki bug yang sama. Seingat saya patch untuk 1,12 juga bekerja pada 1,7
brentwpeterson
1
Artikel yang sangat membantu! Kami memiliki 130.000 produk aktif, dan 25.000 produk dinonaktifkan, core_url_rewrite_table kami memiliki 2744023 catatan di dalamnya ..... jadi minggu ini kami akan mulai memperbaiki ini !! Artikel ini tampaknya menjadi titik awal yang baik.
MagentoMac
Mengedit posting untuk menyertakan bagaimana tidak menghapus penulisan ulang kustom Anda di Magento.
espradley

Jawaban:

76

Saya telah berhasil menstabilkan masalah ini sebagai berikut:

Langkah 1: Tulis ulang model URL Katalog (Menggunakan modul Anda sendiri: Cara )

Catatan: Jika Anda menimpa file inti tanpa menggunakan penulisan ulang, ini akan membuat instance Magento Anda tidak mampu melakukan peningkatan di masa mendatang.

Sesuai solusi Jahnni pada papan MagentoCommerce(tidak lagi aktif dengan papan baru), app/code/core/Mage/Catalog/Model/Url.php[sekitar baris 807 Mage_Catalog_Model_Url::getProductRequestPath()]

Dari:

if ($product->getUrlKey() == '' && !empty($requestPath)
   && strpos($existingRequestPath, $requestPath) === 0
) 

Untuk:

if (!empty($requestPath)
           && strpos($existingRequestPath, $requestPath) === 0
) 

Langkah 2: Potong

Pangkas core_url_rewritemeja

Langkah 3: Reindex & Flush Caches

Mulai proses pengindeksan ulang pada Core URL Rewrites. Setelah itu, Anda ingin membersihkan cache Magento & cache penyimpanan.

SystemCache ManagementFlush Magento Cache

SystemCache ManagementFlush Cache Storage

Voila, kamu sudah siap. Anda akan melihat jika Anda menjalankan kembali pengindeks, ukuran tabel harus tetap konstan (kecuali jika Anda telah menambahkan lebih banyak produk di antara atau jika Anda memiliki nama kategori rangkap).

Moose
sumber
5
Hebat, tabel core_url_rewrite saya adalah 3,2 GB sekarang adalah 36,8 MB: D oleh muppet
Fabian Blechschmidt
Saya memiliki masalah serupa. Penulisan ulang URL Magento menambahkan nomor acak di Url. Silakan lihat screenshot yang dilampirkan dari alat master web google. Seperti yang Anda lihat produk "Beige Embedded Wedding Saree" memiliki sembilan URL berbeda tetapi hanya satu produk dan menunjuk ke hanya satu URL yang berakhir dengan 878. Kunci URL yang sebenarnya tidak memiliki nomor acak pada akhirnya (tangkapan layar terpasang) ). Toko saya cukup baru dan ukuran core_url_rewrite tidak sebesar itu. Jadi saya tidak yakin apakah saya harus melanjutkan dan melakukan Langkah 1 & 2 atau Hanya Langkah 1. Jika saya melakukan langkah 2 saya akan kehilangan penulisan ulang kustom saya.
Zoya
Saya menjalankan 1.9.1 dan di sini ada url tangkapan layar yang terlewat. monosnap.com/image/duL0f64WWlACtlt9kcn04BWqY3L5Xl monosnap.com/image/osFk8kYNAr00XLdFTGTIOaydaW5yqS
Zoya
2
Saya akan mengekspor tabel yang ada terlebih dahulu. Kemudian saya akan melanjutkan dengan langkah 1, 2 dan 3. Lihatlah core_url_rewritetabel sekarang dan catat jumlah catatan. Jalankan langkah 3 lagi (pengindeksan ulang), dan segarkan tampilan Anda di atas core_url_rewritemeja. Jika angkanya sama, Anda telah berhasil menyelesaikannya. Kemudian lanjutkan dan secara manual gabungkan penulisan ulang kustom Anda. Semua yang terbaik.
Moose
2
Perbaikan ini hanya berfungsi untuk produk, bukan untuk kategori dengan kunci URL yang identik. Lihat jawaban @Simon s untuk solusi yang lebih baik (dengan file tambalan)
Giel Berkers
45

Sementara saya berharap seseorang di sini memberikan jawaban, saya tidak tahu bahwa Anda akan menemukannya. Tabel ini menjadi besar karena banyak alasan berbeda. Bug di versi Magento sebelumnya (dan mungkin saat ini) adalah satu. Lain adalah ada logika dalam tabel ini yang mencoba melacak perubahan ke nilai kunci URL sehingga 301/302 penulisan ulang diatur untuk produk lama. Karena hal ini, dan hal-hal rumit, memotong tabel dan regenerasi dapat membuat penulisan ulang URL yang ada hilang, dan ini akan memiliki efek yang tidak diketahui pada daftar mesin pencari Anda (tidak perlu buruk, hanya sulit untuk diprediksi).

Nasihat umum saya untuk klien yang bertanya adalah

  1. Tinggalkan tabel pertumbuhan raksasa seolah-olah Anda tidak memiliki pegangan yang baik pada situasi URL / SEO Anda

  2. Hingga ukuran tabel mulai menjadi masalah (menghasilkan peta situs, misalnya). Ketika itu terjadi, dapatkan penanganan pada situasi URL / SEO Anda.

  3. Setelah Anda memiliki pegangan pada situasi URL / SEO Anda, buat cadangan tabel, lalu potong tabel dan buat ulang. Alamat setiap URL / masalah SEO yang disebabkan oleh pemotongan.

  4. Otomatiskan langkah 3

Mencoba untuk memperbaikinya pada tingkat kode Magento sangat mengagumkan, tetapi Anda akan berenang di hulu. Terkadang lebih baik untuk menerima bahwa "Itu hanya Magento menjadi Magento", dan untuk menyelesaikan masalah dengan proses eksternal.

Alan Storm
sumber
terima kasih atas sarannya, sangat disayangkan tentang situasinya tetapi saya pikir itu harus ditangani oleh proses eksternal seperti yang Anda sebutkan, urgh.
Moose
2
Tabel raksasa ini sudah dapat menyebabkan masalah SEO, karena kanonik untuk produk yang diberikan akan berubah secara konstan. Jika Anda memiliki tampilan toko terpisah untuk seluler dan desktop, maka ini lebih buruk karena URL mereka akan berbeda.
Melvyn
Jawaban yang sedikit mengecewakan bagi saya ...
Fra
@Alan Storm, bagaimana perasaan Anda tentang jawaban yang diposting oleh Moose setelah Anda memposting jawaban ini? Apakah Anda melihat risiko yang sama?
Angsa
24

Saya ingin menambahkan perbaikan untuk bug pengindeks url penulisan ulang ini yang telah dikembangkan di bugathon pada Maret 2013 dan yang telah diperbaiki setelahnya. Seharusnya mengatasi masalah ini. Sebagai referensi, berikut adalah file tambalan dari tautan:

diff -rupN mage_org/app/code/core/Mage/Catalog/Model/Url.php src_shop/app/code/core/Mage/Catalog/Model/Url.php
--- mage_org/app/code/core/Mage/Catalog/Model/Url.php   2013-11-19 00:48:25.679009391 +0100
+++ src_shop/app/code/core/Mage/Catalog/Model/Url.php   2013-11-19 00:49:24.188005601 +0100
@@ -643,13 +643,24 @@ class Mage_Catalog_Model_Url
                 $this->_rewrite = $rewrite;
                 return $requestPath;
             }
+
+            // avoid unnecessary creation of new url_keys for duplicate url keys
+            $noSuffixPath = substr($requestPath, 0, -(strlen($suffix)));
+            $regEx = '#^('.preg_quote($noSuffixPath).')(-([0-9]+))?('.preg_quote($suffix).')#i';
+            $currentRewrite = $this->getResource()->getRewriteByIdPath($idPath, $storeId);
+            if ($currentRewrite && preg_match($regEx, $currentRewrite->getRequestPath(), $match)) {
+                $this->_rewrite = $currentRewrite;
+                return $currentRewrite->getRequestPath();
+            }
+
             // match request_url abcdef1234(-12)(.html) pattern
             $match = array();
             $regularExpression = '#^([0-9a-z/-]+?)(-([0-9]+))?('.preg_quote($suffix).')?$#i';
             if (!preg_match($regularExpression, $requestPath, $match)) {
                 return $this->getUnusedPath($storeId, '-', $idPath);
             }
-            $match[1] = $match[1] . '-';
+            $match[1] = $noSuffixPath . '-'; // always use full prefix of url_key
+            unset($match[3]); // don't start counting with a possible number in the url_key
             $match[4] = isset($match[4]) ? $match[4] : '';

             $lastRequestPath = $this->getResource()


Selain itu, saya ingin menambahkan patch EE PATCH_SUPEE-389_EE_1.12.0.2_v2.sh, yang sekarang tersedia di GitHub :

#!/bin/bash
# Patch apllying tool template
# v0.1.2
# (c) Copyright 2013. Magento Inc.
#
# DO NOT CHANGE ANY LINE IN THIS FILE.

# 1. Check required system tools
_check_installed_tools() {
    local missed=""

    until [ -z "$1" ]; do
        type -t $1 >/dev/null 2>/dev/null
        if (( $? != 0 )); then
            missed="$missed $1"
        fi
        shift
    done

    echo $missed
}

REQUIRED_UTILS='sed patch'
MISSED_REQUIRED_TOOLS=`_check_installed_tools $REQUIRED_UTILS`
if (( `echo $MISSED_REQUIRED_TOOLS | wc -w` > 0 ));
then
    echo -e "Error! Some required system tools, that are utilized in this sh script, are not installed:\nTool(s) \"$MISSED_REQUIRED_TOOLS\" is(are) missed, please install it(them)."
    exit 1
fi

# 2. Determine bin path for system tools
CAT_BIN=`which cat`
PATCH_BIN=`which patch`
SED_BIN=`which sed`
PWD_BIN=`which pwd`
BASENAME_BIN=`which basename`

BASE_NAME=`$BASENAME_BIN "$0"`

# 3. Help menu
if [ "$1" = "-?" -o "$1" = "-h" -o "$1" = "--help" ]
then
    $CAT_BIN << EOFH
Usage: sh $BASE_NAME [--help] [-R|--revert] [--list]
Apply embedded patch.

-R, --revert    Revert previously applied embedded patch
--list          Show list of applied patches
--help          Show this help message
EOFH
    exit 0
fi

# 4. Get "revert" flag and "list applied patches" flag
REVERT_FLAG=
SHOW_APPLIED_LIST=0
if [ "$1" = "-R" -o "$1" = "--revert" ]
then
    REVERT_FLAG=-R
fi
if [ "$1" = "--list" ]
then
    SHOW_APPLIED_LIST=1
fi

# 5. File pathes
CURRENT_DIR=`$PWD_BIN`/
APP_ETC_DIR=`echo "$CURRENT_DIR""app/etc/"`
APPLIED_PATCHES_LIST_FILE=`echo "$APP_ETC_DIR""applied.patches.list"`

# 6. Show applied patches list if requested
if [ "$SHOW_APPLIED_LIST" -eq 1 ] ; then
    echo -e "Applied/reverted patches list:"
    if [ -e "$APPLIED_PATCHES_LIST_FILE" ]
    then
        if [ ! -r "$APPLIED_PATCHES_LIST_FILE" ]
        then
            echo "ERROR: \"$APPLIED_PATCHES_LIST_FILE\" must be readable so applied patches list can be shown."
            exit 1
        else
            $SED_BIN -n "/SUP-\|SUPEE-/p" $APPLIED_PATCHES_LIST_FILE
        fi
    else
        echo "<empty>"
    fi
    exit 0
fi

# 7. Check applied patches track file and its directory
_check_files() {
    if [ ! -e "$APP_ETC_DIR" ]
    then
        echo "ERROR: \"$APP_ETC_DIR\" must exist for proper tool work."
        exit 1
    fi

    if [ ! -w "$APP_ETC_DIR" ]
    then
        echo "ERROR: \"$APP_ETC_DIR\" must be writeable for proper tool work."
        exit 1
    fi

    if [ -e "$APPLIED_PATCHES_LIST_FILE" ]
    then
        if [ ! -w "$APPLIED_PATCHES_LIST_FILE" ]
        then
            echo "ERROR: \"$APPLIED_PATCHES_LIST_FILE\" must be writeable for proper tool work."
            exit 1
        fi
    fi
}

_check_files

# 8. Apply/revert patch
# Note: there is no need to check files permissions for files to be patched.
# "patch" tool will not modify any file if there is not enough permissions for all files to be modified.
# Get start points for additional information and patch data
SKIP_LINES=$((`$SED_BIN -n "/^__PATCHFILE_FOLLOWS__$/=" "$CURRENT_DIR""$BASE_NAME"` + 1))
ADDITIONAL_INFO_LINE=$(($SKIP_LINES - 3))p

_apply_revert_patch() {
    DRY_RUN_FLAG=
    if [ "$1" = "dry-run" ]
    then
        DRY_RUN_FLAG=" --dry-run"
        echo "Checking if patch can be applied/reverted successfully..."
    fi
    PATCH_APPLY_REVERT_RESULT=`$SED_BIN -e '1,/^__PATCHFILE_FOLLOWS__$/d' "$CURRENT_DIR""$BASE_NAME" | $PATCH_BIN $DRY_RUN_FLAG $REVERT_FLAG -p0`
    PATCH_APPLY_REVERT_STATUS=$?
    if [ $PATCH_APPLY_REVERT_STATUS -eq 1 ] ; then
        echo -e "ERROR: Patch can't be applied/reverted successfully.\n\n$PATCH_APPLY_REVERT_RESULT"
        exit 1
    fi
    if [ $PATCH_APPLY_REVERT_STATUS -eq 2 ] ; then
        echo -e "ERROR: Patch can't be applied/reverted successfully."
        exit 2
    fi
}

REVERTED_PATCH_MARK=
if [ -n "$REVERT_FLAG" ]
then
    REVERTED_PATCH_MARK=" | REVERTED"
fi

_apply_revert_patch dry-run
_apply_revert_patch

# 9. Track patch applying result
echo "Patch was applied/reverted successfully."
ADDITIONAL_INFO=`$SED_BIN -n ""$ADDITIONAL_INFO_LINE"" "$CURRENT_DIR""$BASE_NAME"`
APPLIED_REVERTED_ON_DATE=`date -u +"%F %T UTC"`
APPLIED_REVERTED_PATCH_INFO=`echo -n "$APPLIED_REVERTED_ON_DATE"" | ""$ADDITIONAL_INFO""$REVERTED_PATCH_MARK"`
echo -e "$APPLIED_REVERTED_PATCH_INFO\n$PATCH_APPLY_REVERT_RESULT\n\n" >> "$APPLIED_PATCHES_LIST_FILE"

exit 0


SUPEE-389 | EE_1.12.0.2 | v1 | 53c8ca52583358953b143aaa1a78cf409e8dd846 | Thu Jun 20 10:36:39 2013 +0300 | v1.12.0.2..HEAD

__PATCHFILE_FOLLOWS__
diff --git app/code/core/Mage/Catalog/Model/Url.php app/code/core/Mage/Catalog/Model/Url.php
index fa55fc5..a755b46 100644
--- app/code/core/Mage/Catalog/Model/Url.php
+++ app/code/core/Mage/Catalog/Model/Url.php
@@ -609,6 +609,23 @@ class Mage_Catalog_Model_Url
      */
     public function getUnusedPath($storeId, $requestPath, $idPath)
     {
+        $urlKey = '';
+        return $this->getUnusedPathByUrlkey($storeId, $requestPath, $idPath, $urlKey);
+    }
+
+    /**
+     * Get requestPath that was not used yet.
+     *
+     * Will try to get unique path by adding -1 -2 etc. between url_key and optional url_suffix
+     *
+     * @param int $storeId
+     * @param string $requestPath
+     * @param string $idPath
+     * @param string $urlKey
+     * @return string
+     */
+    public function getUnusedPathByUrlkey($storeId, $requestPath, $idPath, $urlKey = '')
+    {
         if (strpos($idPath, 'product') !== false) {
             $suffix = $this->getProductUrlSuffix($storeId);
         } else {
@@ -645,21 +662,22 @@ class Mage_Catalog_Model_Url
             }
             // match request_url abcdef1234(-12)(.html) pattern
             $match = array();
-            $regularExpression = '#^([0-9a-z/-]+?)(-([0-9]+))?('.preg_quote($suffix).')?$#i';
+            $regularExpression = '#(?P<prefix>(.*/)?' . preg_quote($urlKey) . ')(-(?P<increment>[0-9]+))?(?P<suffix>'
+                . preg_quote($suffix) . ')?$#i';
             if (!preg_match($regularExpression, $requestPath, $match)) {
-                return $this->getUnusedPath($storeId, '-', $idPath);
+                return $this->getUnusedPathByUrlkey($storeId, '-', $idPath, $urlKey);
             }
-            $match[1] = $match[1] . '-';
-            $match[4] = isset($match[4]) ? $match[4] : '';
+            $match['prefix'] = $match['prefix'] . '-';
+            $match['suffix'] = isset($match['suffix']) ? $match['suffix'] : '';

             $lastRequestPath = $this->getResource()
-                ->getLastUsedRewriteRequestIncrement($match[1], $match[4], $storeId);
+                ->getLastUsedRewriteRequestIncrement($match['prefix'], $match['suffix'], $storeId);
             if ($lastRequestPath) {
-                $match[3] = $lastRequestPath;
+                $match['increment'] = $lastRequestPath;
             }
-            return $match[1]
-                . (isset($match[3]) ? ($match[3]+1) : '1')
-                . $match[4];
+            return $match['prefix']
+                . (isset($match['increment']) ? ($match['increment']+1) : '1')
+                . $match['suffix'];
         }
         else {
             return $requestPath;
@@ -699,7 +717,7 @@ class Mage_Catalog_Model_Url
     {
         $storeId = $category->getStoreId();
         $idPath  = $this->generatePath('id', null, $category);
-        $suffix  = $this->getCategoryUrlSuffix($storeId);
+        $categoryUrlSuffix = $this->getCategoryUrlSuffix($storeId);

         if (isset($this->_rewrites[$idPath])) {
             $this->_rewrite = $this->_rewrites[$idPath];
@@ -713,27 +731,27 @@ class Mage_Catalog_Model_Url
             $urlKey = $this->getCategoryModel()->formatUrlKey($category->getUrlKey());
         }

-        $categoryUrlSuffix = $this->getCategoryUrlSuffix($category->getStoreId());
         if (null === $parentPath) {
             $parentPath = $this->getResource()->getCategoryParentPath($category);
         }
         elseif ($parentPath == '/') {
             $parentPath = '';
         }
-        $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath,
-                                                                           true, $category->getStoreId());
+        $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath, true, $storeId);

-        $requestPath = $parentPath . $urlKey . $categoryUrlSuffix;
-        if (isset($existingRequestPath) && $existingRequestPath == $requestPath . $suffix) {
+        $requestPath = $parentPath . $urlKey;
+        $regexp = '/^' . preg_quote($requestPath, '/') . '(\-[0-9]+)?' . preg_quote($categoryUrlSuffix, '/') . '$/i';
+        if (isset($existingRequestPath) && preg_match($regexp, $existingRequestPath)) {
             return $existingRequestPath;
         }

-        if ($this->_deleteOldTargetPath($requestPath, $idPath, $storeId)) {
+        $fullPath = $requestPath . $categoryUrlSuffix;
+        if ($this->_deleteOldTargetPath($fullPath, $idPath, $storeId)) {
             return $requestPath;
         }

-        return $this->getUnusedPath($category->getStoreId(), $requestPath,
-                                    $this->generatePath('id', null, $category)
+        return $this->getUnusedPathByUrlkey($storeId, $fullPath,
+            $this->generatePath('id', null, $category), $urlKey
         );
     }

@@ -798,7 +816,8 @@ class Mage_Catalog_Model_Url
             $this->_rewrite = $this->_rewrites[$idPath];
             $existingRequestPath = $this->_rewrites[$idPath]->getRequestPath();

-            if ($existingRequestPath == $requestPath . $suffix) {
+            $regexp = '/^' . preg_quote($requestPath, '/') . '(\-[0-9]+)?' . preg_quote($suffix, '/') . '$/i';
+            if (preg_match($regexp, $existingRequestPath)) {
                 return $existingRequestPath;
             }

@@ -836,7 +855,7 @@ class Mage_Catalog_Model_Url
         /**
          * Use unique path generator
          */
-        return $this->getUnusedPath($storeId, $requestPath.$suffix, $idPath);
+        return $this->getUnusedPathByUrlkey($storeId, $requestPath.$suffix, $idPath, $urlKey);
     }

     /**
@@ -891,8 +910,8 @@ class Mage_Catalog_Model_Url
                 $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath,
                     true, $category->getStoreId());

-                return $this->getUnusedPath($category->getStoreId(), $parentPath . $urlKey . $categoryUrlSuffix,
-                    $this->generatePath('id', null, $category)
+                return $this->getUnusedPathByUrlkey($category->getStoreId(), $parentPath . $urlKey . $categoryUrlSuffix,
+                    $this->generatePath('id', null, $category), $urlKey
                 );
             }

@@ -913,14 +932,14 @@ class Mage_Catalog_Model_Url
                 $this->_addCategoryUrlPath($category);
                 $categoryUrl = Mage::helper('catalog/category')->getCategoryUrlPath($category->getUrlPath(),
                     false, $category->getStoreId());
-                return $this->getUnusedPath($category->getStoreId(), $categoryUrl . '/' . $urlKey . $productUrlSuffix,
-                    $this->generatePath('id', $product, $category)
+                return $this->getUnusedPathByUrlkey($category->getStoreId(), $categoryUrl . '/' . $urlKey . $productUrlSuffix,
+                    $this->generatePath('id', $product, $category), $urlKey
                 );
             }

             // for product only
-            return $this->getUnusedPath($category->getStoreId(), $urlKey . $productUrlSuffix,
-                $this->generatePath('id', $product)
+            return $this->getUnusedPathByUrlkey($category->getStoreId(), $urlKey . $productUrlSuffix,
+                $this->generatePath('id', $product), $urlKey
             );
         }

Jika Anda ingin menggunakan tambalan ini dengan CE, pastikan untuk mengujinya dengan benar, karena telah dikembangkan untuk EE.

Simon
sumber
Sudahkah Anda menguji sendiri patch EE ini pada CE?
Tyler V.
@TylerV. Tidak ...
Simon
3
Saya sudah mencoba tambalan ini di EE 1.9.1.1 dan dapat menyesuaikannya berfungsi. Ini memperbaiki masalah dengan produk dan kategori dengan kunci url identik. Mari berharap mereka segera mengimplementasikannya dalam rilis mendatang.
Giel Berkers
1
Terima kasih Simon, baru saja beralih dari 1GB ke 3MB di satu situs web klien ... Harus memotongnya sebelum setiap 6 bulan, harap ini akan tetap kecil sekarang :)
willem wigman
1
Saya baru saja mencoba ini pada 1.9 CE saya dan meskipun berfungsi untuk produk - kategorinya tidak tepat. Jika saya memiliki kategori yang disebut 'Test' yang memberikan url '... / test' dan kemudian saya membuat yang lain disebut 'Test' itu harus memberikan url '... / test-2' tetapi sebaliknya hanya memberikan nomor tidak nama: '... / - 2'
odd_duck
11

Setelah menerapkan tambalan yang diposting oleh Simon, Anda dapat menggunakan kueri berikut untuk menghapus data sampah:

DELETE FROM core_url_rewrite
WHERE is_system <> 1 AND id_path REGEXP "^[0-9]+_[0-9]+$" AND
      (request_path REGEXP ".*-[0-9]*\.html" 
          OR target_path = request_path);

Berbeda dengan permintaan Ashish Hira, ini hanya efek URL yang memiliki nomor integer karena ada bagian terakhir - ini adalah - dalam kasus saya - alasan kekacauan.

Mencoba untuk tidak menyentuh penulisan ulang yang valid, yang misalnya mungkin telah dibuat ketika memperbarui kunci URL.

Alex
sumber
6

Saya telah menerapkan jawaban yang diterima dengan sukses. Pada pemasangan Magento yang lain, saya harus menyimpan beberapa penulisan ulang kustom sehingga saya menghapus semua entri yang diakhiri dengan - dan kemudian nomor hingga 5 digit dengan:

DELETE FROM `core_url_rewrite` WHERE `request_path` REGEXP '\\-[0-9]{1,5}$';

Ini sebagian besar bekerja tetapi saya masih mendapatkan 2 baris lagi pada setiap indeks ulang. Tidak yakin kenapa. Saya pikir saya akan membagikan pengalaman ini.

Andy Myers
sumber
1
Anda mungkin menghapus URL yang valid, namun diakhiri dengan angka. Anda akan menemukan mereka dengan$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('url_key', array('regexp' => '[0-9]$'));
Melvyn
5

Perubahan inti yang Anda sebutkan tampaknya hanya diperlukan jika Anda memiliki produk tanpa url_keys, namun Magento harus selalu membuat url_keys untuk Anda. Jika Anda memiliki beberapa importir yang membuat produk tanpa url_keys, maka masalah ini akan muncul untuk produk-produk tersebut. Coba jalankan permintaan berikut untuk menemukan produk-produk tersebut:

SELECT cpe.entity_id, cpe.sku, cpev.value
FROM catalog_product_entity cpe
LEFT JOIN catalog_product_entity_varchar cpev
ON cpe.entity_id = cpev.entity_id AND cpev.attribute_id = (
    SELECT attribute_id
    FROM eav_attribute
    WHERE `entity_type_id` = 4
    AND `attribute_code` = 'url_key'
)
WHERE cpev.value IS NULL OR cpev.value = ''

Jika ada produk yang kembali dari permintaan itu, mereka tidak memiliki url_key dan akan menjadi masalah.

Tyler V.
sumber
2
Pikirkan bahwa standar entity_type_iduntuk produk adalah 4 dan bukan 10.
Simon
3

Saya mengikuti solusi yang disetujui untuk mencegah duplikasi penulisan ulang URL, lalu diekspor core_url_rewritesebagai file CSV. Dapat membuka CSV ini dan menghapus semua kecuali penulisan ulang URL yang dibuat secara manual.

Lalu saya memotong core_url_rewritetabel, dan mengimpor CSV saya yang disimpan dengan penulisan ulang URL yang dibuat secara manual.

Setelah semua perubahan, beralih dari baris 940K ke 32K. Perbaikan besar.

JonW
sumber
3

Berikut ini adalah tambalan (penulisan ulang lokal) untuk Komunitas Magento untuk memperbaikinya https://github.com/biotech/Magento-URL-Rewrite Faktanya melakukan hal yang sama dengan patch EE PATCH_SUPEE-389_EE_1.12.0.2_v2.sh - periksa setiap penulisan ulang dan hindari pembuatan rekaman duplikat. Bekerja dengan baik 2 bulan terakhir pada produksi CE 1.9, produk 15k, 4 toko, indeks ulang penuh setiap malam setelah perubahan impor produk massal.

FireBear
sumber
Seberapa menyeluruh hal ini telah diuji? Sepertinya sudah diposting satu jam yang lalu ....
SR_Magento
Apakah ini sudah diperbaiki di 1.9.2.x sehingga kita tidak perlu lagi khawatir tentang mengasapi meja?
Fiasco Labs
Jawaban tautan tunggal bukan jawaban terbaik bahkan jika mereka dapat memecahkan masalah. Tolong jelaskan sedikit apa yang kode Anda lakukan.
Marius
@FiascoLabs ya, bekerja dengan baik pada semua CE 1.9.x
FireBear
1
@FiascoLabs: 1.9.2.x masih memiliki masalah "tulis ulang mengasapi" ini, dan tidak termasuk perbaikan ini, namun, seperti yang dikatakan FireBear, patch EE akan bekerja dengan CE 1.9.2.x. (belum mencoba secara pribadi; hanya ingin menjelaskan bahwa 1.9.2.2 pasti masih memiliki masalah ini)
Eric Seastrand
2

Karena ini belum disebutkan di utas ini, saya ingin berbagi berita keren bahwa masalah ini diperbaiki di Magento 1.9.3.9 dan yang lebih baru. Lihat catatan rilis terkait :

Magento tidak lagi melakukan operasi penulisan yang tidak perlu pada tabel core_url_rewrite.

Jadi semua perbaikan untuk masalah ini yang disebutkan di sini tidak diperlukan saat menggunakan versi Magento yang lebih besar atau sama dengan 1.9.3.9. Saya masih menyarankan menghapus nilai-nilai lama seperti yang dijelaskan dalam jawaban Alex .

Simon
sumber
1

Jalankan kueri ini

DELETE FROM core_url_rewrite WHERE is_system <> 1 AND id_path REGEXP "^[0-9]+_[0-9]+$";

Ini pasti akan membantu Anda mengurangi ukuran core_url_sizetabel dengan menghapus data sampah.

Asish Hira
sumber
Apakah Anda yakin ini adalah data sampah? Saya pikir itu dihapus juga penulisan ulang yang dibuat ketika mengubah kunci URL!
Alex
Periksa regex. ini berarti yang tidak memiliki id yang valid
Asish Hira
Tetapi ID tersebut juga dibuat ketika mengubah kunci URL secara manual di backend. Lihat juga jawaban saya.
Alex
0

Singkirkan itu .html

  1. Jangan gunakan akhiran .html
  2. Diatur dalam .htaccess

    ## Redirect all htmls.
    RewriteRule (.+)\.html$ /$1 [L,R=301]
  3. Hapus semua arahan .htmlulang:

    DELETE FROM core_url_rewrite WHERE request_path LIKE '%.html'
lycenok
sumber
0

Jawaban resmi adalah menginstal SUPEE-389. Sederhana seperti itu.

Ini bekerja dengan baik dengan Magento CE karena mereka berbagi bagian kode yang sama di area ini.

Anda dapat menemukan file tambalan di sini, https://gist.github.com/piotrekkaminski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-sh

Kami mengalami masalah ini dan menghasilkan ribuan baris baru setelah setiap URL Katalog diindeks ulang. Sekarang masalahnya hilang ... kecuali fakta bahwa kita harus membersihkan DB.

Skrip yang disediakan di sini sepertinya awal yang baik tetapi itu bukan solusi yang sempurna,

php shell / rewrites_doctor.php --remove_rewrites 4

Lihat https://www.atwix.com/magento/duplicated-product-url-keys-in-community-edition/

Frédéric Gauthier-Boutin
sumber
-2

Ada juga modul khusus https://github.com/vladsmirnov/url-rewrites , jadi Anda tidak perlu mendaftar kembali tambalan setelah setiap pembaruan Magento. Modul berisi dua bagian: modul aktual, untuk mencegah duplikasi mulai sekarang dan skrip shell untuk membersihkan database yang ada.

Vladyslav Smirnov
sumber