Magento core_url_rewrite tablo aşırı büyük


105

Bu tablonun kendisinin son derece darmadağın olabileceğine dair çok sayıda rapor gördüm, ~ 5000 SKU ve ~ 250 kategori (tek mağaza) ve core_url_rewrite600.000'den fazla satırın ve sonuçta ortaya çıkan bir tablonun bulunduğu ve 500 MB’ın üzerinde delirmiş.

Bu, site performansını yavaşlatabilir ve çok hantal bir veritabanına neden olabilir. Bazı kazma çalışmaları yaptım ve bununla ilgili epeyce mesaj buldum:

// Bu linkler yeni kurulların uygulanmasından bu yana kaldırıldı.

Şimdi tablo kesildi ve reindexed olabileceğini anlıyoruz, ancak bu değil çözmek sorunu, sadece tekrar meydana sorunu uzatır.

Anladığım kadarıyla, sorunun bir kısmı, ürünün adına göre aynı URL anahtarına sahip ve bu nedenle dizine alınmış bağlantılarla sonuçlanan ürünler.

Bahsedilen bir düzeltme:

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

Değişiklik:

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

Kime:

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

Ancak bu bile sorunu tamamen çözmüyor.

Sorum şu:

Bu sorunu yaşadıysanız , konuyu tekrar tekrar "yönetmeyi" içermeyen, ancak konuyu bir kez ve herkes için çözmeyi içeren etkili, mantıklı ve verimli bir algoritma kurmayı başardınız mı?

Misiniz gerçekten bu işe bazı bilgiler için teşekkür ederiz.

BTW: Lütfen kendinize bir iyilik yapın ve masanızın şu an nasıl göründüğünü kontrol edin, bu sorunu yaşıyor olabilirsiniz ve bunun sonucu olarak performans etkisi bile bilmeden - yapmadım.

Düzenleme: www.Nexcess.net (Magento platin barındırma ortağı) ile iletişim kurdum ve müşterilerin core_url_rewritemasalarının çok hacimli olması nedeniyle kesilmelerini gerektirdiğini talep ettiklerini onayladılar .

Benim için büyük bir endişe bu olabilir SEO etkisi, bu yüzden sorunu yeniden ortaya çıkmasını ertelemeye karşı bir çözüm istiyorum.

Güncelleme: Nexcess, tablodaki yinelenen ürünlerle aslında olduğu gibi SEO'ya zarar verebileceğini belirtti.


Vay, bu şaşırtıcı derecede büyük bir masa. Kendi ürünümü (200 ürün) kontrol ettim ve yalnızca ~ 800 satır var, ancak ürün adını / URL'lerini çoğaltmada bir sorunumuz yok. Referans noktası olarak, görünür ürün başına yaklaşık 6.6 satır var. Bunun korkunç ve gerçekçi bir karşılaştırma olmadığını kabul edeceğim, ancak bu oranda, 5.000 ürünle sadece ~ 30.000 satır elde edebileceğiz. Bir çözüme olan ihtiyacınızı iyi anlayabiliyorum ve daha büyük bir site uygulamak üzereyken bu soruyu izleyeceğim.
Pete855217

@ Pete855217: Bu soru, siz onu henüz beğenmemiş olsanız bile ilginç kılıyor.
Mohammad Faisal

1
EE1.12'de her kayıtta yeniden yazmaların yeniden oluşturulmasına neden olan bir hata vardı. 1.7 sürümünüzde de aynı hata olması mümkündür. 1.12 için yamayı hatırladığımda, 1.7 de çalıştı
brentwpeterson

1
Çok yardımcı makale! 130.000 aktif ürünümüz ve 25.000 engelli ürünümüz var, core_url_rewrite_table içinde 2744023 kayıttır. ..... bu hafta bunu telafi etmeye çalışacağız !! Bu makale iyi bir başlangıç ​​noktası gibi görünüyor.
MagentoMac

Özel yeniden yazmalarınızı Magento'da silmemeyi içerecek şekilde yazıyı düzenledi.
espradley

Yanıtlar:


76

Sorunu şu şekilde dengelemeyi başardım:

Adım 1: Katalog URL modelini yeniden yazın (Kendi modülünüzü kullanarak: Nasıl Yapılır )

Not: Yeniden yazma yapmadan çekirdek dosyanın üzerine yazarsanız, bu, Magento örneğinizi gelecekteki güncellemelerden mahrum bırakacaktır.

Jahnni'nin çözümüne göre MagentoCommerce kurulları(artık yeni kart ile aktif değil), app/code/core/Mage/Catalog/Model/Url.php[yaklaşık 807 Mage_Catalog_Model_Url::getProductRequestPath()]

Gönderen:

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

Kime:

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

2. Adım: Kısaltın

core_url_rewriteMasayı kes

Adım 3: Reindex ve Flush Caches

Çekirdek URL Yeniden Yazma işleminde yeniden dizin oluşturma işlemini başlatın. Bundan sonra, Magento önbelleğini ve depolama önbelleğini temizlemek isteyeceksiniz.

SystemCache ManagementFlush Magento Cache

SystemCache ManagementFlush Cache Storage

Voila, hepiniz hazırsınız. Dizinleyiciyi yeniden çalıştırırsanız, tablonun sabit kalması gerektiğini fark edersiniz (aralarında daha fazla ürün eklemeden veya yinelenen kategori adlarınız yoksa).


5
Harika, core_url_rewrite masam 3,2 GB idi şimdi 36,8 MB: D, muppet
Fabian Blechschmidt

Benim de benzer bir problemim var. Magento URL yeniden yazma URL'sine rasgele bir sayı ekler. Lütfen google web ana araçlarından eklenen ekran görüntüsüne bakın. Gördüğünüz gibi "Bej İşlemeli Düğün Saree" nin dokuz farklı URL'si var, ancak tek bir ürün ve 878 ile biten tek bir URL'yi gösteriyor. Gerçek URL anahtarının sonunda rastgele bir sayı yok (ekran görüntüsü ekli) ). Mağazam oldukça yenidir ve core_url_rewrite'ın boyutu o kadar büyük değildir. Bu yüzden devam edip Adım 1 ve 2'yi mi yoksa Yalnızca Adım 1'i mi yapmam gerektiğinden emin değilim. Adım 2'yi uygularsam, özel tekrar yazmalarımı kaybedeceğim.
Zoya

1.9.1 kullanıyorum ve burada ekran görüntüsü URL'lerini kaçırdım. monosnap.com/image/duL0f64WWlACtlt9kcn04BWqY3L5Xl monosnap.com/image/osFk8kYNAr00XLdFTGTIOaydaW5yqS
Zoya

2
Önce mevcut masayı verecektim. Sonra 1, 2 ve 3. adımlarla devam edeceğim. core_url_rewriteŞimdi tabloya bir göz atın ve kayıt sayısını not edin. 3. adımı tekrar çalıştırın (yeniden indeksleme) ve core_url_rewritetablodaki görünümünüzü yenileyin . Numara aynıysa, başarıyla çözdünüz. Sonra devam edin ve özel yeniden yazmalarınızı el ile birleştirin. Herşey gönlünce olsun.
Moose

2
Bu düzeltme yalnızca aynı URL anahtarlarına sahip kategoriler için değil ürünler için geçerlidir. Daha iyi bir çözüm için @Simon un yanıtını görün (yama dosyasıyla birlikte)
Giel Berkers

45

Umarım burada birileri bir cevap bulsa da, bir tane bulacağını bilmiyorum. Bu tablo birçok farklı nedenden ötürü hantallaşıyor. Magento'nun önceki (ve muhtemelen güncel) sürümlerindeki hatalar bunlardan biridir. Bir diğeri de, bu tabloda URL anahtar değerindeki değişiklikleri izlemeye çalışan bir mantık var, böylece 301/302 yeniden yazma işlemi eski ürünler için ayarlandı. Bu nedenle ve işleri karmaşık hale getirmek için, masanın kesilmesi ve yenilenmesi mevcut URL yeniden yazmalarının ortadan kalkmasına neden olabilir ve bunun arama motoru listenizde bilinmeyen bir etkisi olacaktır (zorunluluk değil, sadece tahmin etmesi zor).

Soran müşterilere genel tavsiyem:

  1. URL / SEO durumunuz üzerinde iyi bir tutamağınız yokmuş gibi dev büyüyen tabloyu bırakın

  2. Tablo boyutu bir sorun olmaya başlayana kadar (örneğin, site haritaları oluşturmak). Bu olduğunda, URL / SEO durumunuzu ele alın.

  3. URL / SEO durumunuzu ele aldığınızda, masayı yedekleyin, ardından masayı kesin ve yeniden oluşturun. Kısaltmadan kaynaklanan herhangi bir URL / SEO sorununu giderin.

  4. 3. adımı otomatikleştirin

Bunu Magento kod seviyesinde düzeltmeye çalışmak hayranlık uyandırıcıdır, ancak yukarı akıntıya gireceksiniz. Bazen "Bu sadece Magento olan Magento" olduğunu kabul etmek ve problemi dışsal süreçle çözmek daha iyidir.


Tavsiyeniz için teşekkürler, bu durum hakkında üzücü ama bahsettiğiniz gibi dış bir işlem tarafından ele alınması gerekeceğini düşünüyorum ugh.
Moose

2
Belirli bir ürün için kanonik sürekli değişeceği için bu dev tablo zaten SEO sorunlarına neden olabilir. Mobil ve masaüstü için ayrı bir ekran görünümünüz varsa, URL'leri farklılık göstereceğinden daha da kötüdür.
Melvyn

Bana biraz hayal kırıklığı yaratan bir cevap ...
Fra

@Alan Fırtına, bu cevabı gönderdikten sonra Moose tarafından gönderilen cevap hakkında ne düşünüyorsun? Aynı riskleri görüyor musunuz?
Kaz,

24

Mart 2013'te bugathon'da geliştirilen ve daha sonra daha da geliştirilmiş olan bu URL yeniden yazma endeksleyici hatası için bir düzeltme eklemek istiyorum . Bu sorunu çözmeli. Referans olarak, linkteki yama dosyası:

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()


Ek olarak, GitHub'daPATCH_SUPEE-389_EE_1.12.0.2_v2.sh mevcut olan EE yamasını eklemek istiyorum :

#!/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
             );
         }

Bu yamayı CE ile kullanmak istiyorsanız, EE için geliştirilmiş olduğundan, doğru şekilde test ettiğinizden emin olun.


CE'de bu EE yamasını kendiniz test ettiniz mi?
Tyler V.

@TylerV. Hayır ...
Simon

3
Bu yamayı EE 1.9.1.1'de denedim ve çalışmasını sağlayabilirim. Aynı url tuşlarına sahip ürünleri ve kategorileri ile ilgili sorunu giderir. Umarız bunu yakında gelecek sürümlerde uygularlar.
Giel Berkers

1
Teşekkürler Simon, sadece bir müşterinin web sitesinde 1 GB’dan 3 MB’a çıktı ... Her 6 ayda bir kesmek zorunda kaldım, şimdi küçük kalacağını umuyorum :)
willem wigman

1
1.9 CE'mde bunu yeni denedim ve ürünler için çalışsa da kategoriler pek doğru değil. 'Test' adında bir kategorim varsa, url '... / test' i verin ve sonra 'Test' adında bir tane daha yarattığımda '... / test-2' URL'sini vermelidir, ancak bunun yerine sadece sayı yazmaz. adı: '... / - 2'
odd_duck

11

Simon tarafından gönderilen düzeltme ekini uyguladıktan sonra, önemsiz verileri kaldırmak için aşağıdaki sorguyu kullanabilirsiniz:

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

Ashish Hira'nın sorgusunun aksine, bu sadece son kısımda bir tamsayıya sahip olan URL'leri etkiler - bu - benim durumumda - karışıklığın nedeni.

Örneğin, bir URL anahtarını güncellerken oluşturulmuş olabilecek geçerli yeniden yazmalara dokunmamaya çalışır.


6

Kabul edilen cevabı başarı ile uyguladım. Başka bir Magento kurulumunda bazı özel yeniden yazmaları korumam gerekiyordu, bu yüzden a ile biten tüm girişleri sildim ve ardından en fazla 5 rakam olan bir sayı:

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

Bu çoğunlukla işe yaradı, ancak her yeniden dizinde 2 satır daha alıyorum. Emin değilim neden. Bu deneyimi paylaşacağımı düşündüm.


1
Muhtemelen geçerli olan URL’leri sildiniz, ancak bir rakamla bitirdiniz. Bunları bulacaktın$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('url_key', array('regexp' => '[0-9]$'));
Melvyn

5

Bahsettiğiniz temel değişiklik, yalnızca url_keys olmayan ürünleriniz varsa gerekli görünmektedir, ancak Magento her zaman sizin için url_keys oluşturmalıdır. URL'ler olmadan ürünler üreten bir ithalatçı varsa, bu sorun bu ürünler için ortaya çıkacaktır. Bu ürünleri bulmak için aşağıdaki sorguyu çalıştırmayı deneyin:

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 = ''

Herhangi bir ürün bu sorgudan dönerse, bir url_key anahtarına sahip değildir ve bir sorun olacaktır.


2
entity_type_idÜrünler için varsayılan
Simon

3

Yinelenen URL yeniden yazmalarını önlemek için onaylanmış bir çözümü izledim, sonra core_url_rewriteCSV dosyası olarak dışa aktardım . Bu CSV'yi açabiliyor ve manuel olarak oluşturulmuş tüm URL'leri yeniden yazıyor.

Sonra core_url_rewritetabloyu kırptım ve kaydedilmiş CSV'mi manuel olarak oluşturulmuş URL yeniden yazma ile aldım.

Tüm değişikliklerden sonra 940K'dan 32K'ya geçti. Büyük gelişme.


3

İşte düzeltme için Magento Topluluğu için yama (yerel yeniden yazma) 'dir https://github.com/biotech/Magento-URL-Rewrite EE yama ile aynı yapar Aslında PATCH_SUPEE-389_EE_1.12.0.2_v2.sh - her yeniden yazma kontrol ve çoğaltılan kayıtların oluşturulmasından kaçının. Toplu ürün ithalat değişikliklerinden sonra her gece CE 1.9, 15k ürün, 4 mağaza, tam endeksli üretimde son 2 aydır iyi çalışıyor.


Bu ne kadar ayrıntılı olarak test edildi? Sadece bir saat önce gönderildi gibi görünüyor ....
SR_Magento

1.9.2.x'te bu sorun giderildi mi? Artık masa şişmesi için endişelenmemize gerek yok mu?
Fiasco Labs,

Tek linkli cevaplar sorunu çözseler bile en iyi cevaplar değildir. Lütfen kodunuzun ne yaptığını biraz açıklayın.
Marius

@FiascoLabs evet, tüm CE 1.9.x'de iyi çalışıyor
FireBear

1
@FiascoLabs: 1.9.2.x hala bu "yeniden yazma şişmesi" sorununa sahip ve bu düzeltmeyi içermiyor ancak FireBear'ın dediği gibi, EE yaması CE 1.9.2.x ile çalışacak. (şahsen denemedim, sadece 1.9.2.2 kesinlikle hala bu sorunu olduğuna açıklık getirmek istedik)
Eric Seastrand

2

Bu konuya henüz değinilmediğinden, bu sorunun Magento 1.9.3.9 ve sonrasında düzeltildiği haberi paylaşmak istedim. İlgili sürüm notlarına bakın :

Magento artık core_url_rewrite tablosunda gereksiz yazma işlemleri gerçekleştirmiyor.

Dolayısıyla, burada bahsedilen bu sorun için tüm düzeltmeler, Magento'nun 1.9.3.9'dan büyük veya ona eşit bir sürümünü kullanırken gerekli değildir. Alex cevabında açıklandığı gibi eski değerleri silmeyi hala tavsiye ediyorum .


1

Bu sorguyu çalıştır

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

Bu kesinlikle core_url_sizeönemsiz verileri silerek tablonun boyutunu azaltmanıza yardımcı olacaktır .


Bunun önemsiz veri olduğundan emin misiniz? Bir URL anahtarını değiştirirken oluşturulan yeniden yazma da silindiğini düşünüyorum!
Alex,

Regex'i kontrol et. geçerli bir kimliği olmayan bu demek
Asish Hira

Ancak, bu ID'ler, URL anahtarını arka uçta manuel olarak değiştirirken de yaratılır. Ayrıca cevabımı gör.
Alex,

0

Kurtulmak .html

  1. Sonek kullanmayın .html
  2. .Htaccess olarak ayarla

    ## Redirect all htmls.
    RewriteRule (.+)\.html$ /$1 [L,R=301]
  3. Tüm .htmlyönlendirmeleri sil :

    DELETE FROM core_url_rewrite WHERE request_path LIKE '%.html'

0

Resmi cevap SUPEE-389'u kurmak olmalıdır. Bu kadar basit.

Bu alanda aynı kod parçasını paylaştığı için Magento CE ile mükemmel çalışır.

Yama dosyasını burada bulabilirsiniz, https://gist.github.com/piotrekkaminski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-sh

Bu sorunu yaşadık ve her bir Katalog URL'sinin yeniden endekslenmesinden sonra binlerce yeni satır üretti. Şimdi sorun çözüldü ... DB'yi temizlememiz gerekmediği sürece.

Burada sağlanan senaryo iyi bir başlangıç ​​gibi gözükse de mükemmel bir çözüm değil.

php shell / rewrites_doctor.php --remove_rewrites 4

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


-2

Ayrıca https://github.com/vladsmirnov/url-rewrites isimli özel bir modül de vardır , bu nedenle her Magento güncellemesinden sonra yamayı yeniden uygulamanıza gerek kalmaz. Modül iki bölümden oluşur: bundan sonra çoğaltmayı önlemek için gerçek modül ve mevcut veritabanını temizlemek için kabuk betiği.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.