Tabela Magento core_url_rewrite jest zbyt duża

105

Zauważyłem dużą liczbę raportów, że sama tabela może być bardzo zagracona, prowadzę witrynę z ~ 5000 SKU i ~ 250 kategoriami (w jednym sklepie) oraz wynikową core_url_rewritetabelą zawierającą ponad 600 000 linii i ponad 500 MB dużych, które jest szalony.

Może to spowolnić działanie witryny i spowodować powstanie bardzo obszernej bazy danych. Zrobiłem trochę kopania i znalazłem sporo postów na ten temat, w szczególności:

// Te linki zostały usunięte od czasu wdrożenia nowych płyt

Teraz rozumiem, że tabela może zostać obcięta i ponownie indeksowana, ale to nie rozwiązuje problemu, tylko przedłuża problem.

Z tego, co rozumiem, częścią problemu są produkty, które mają ten sam klucz adresu URL na podstawie nazwy produktu, co powoduje indeksowane linki.

Wspomniana poprawka to:

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

Zmiana:

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

Do:

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

Ale nawet to nie rozwiązuje całkowicie problemu.

Moje pytanie jest następujące:

Jeśli doświadczyłeś tego problemu, czy udało Ci się skonfigurować skuteczny, logiczny i wydajny algorytm, który nie wymaga „zarządzania” wielokrotnie, ale faktyczne rozwiązanie problemu raz na zawsze?

Czy naprawdę docenić pewien wgląd w to.

BTW: Zrób sobie przysługę i sprawdź, jak teraz wygląda twój stół, możesz mieć ten problem i wpływ na wydajność, nawet o tym nie wiedząc - nie wiedziałem.

Edycja: Byłem w kontakcie ze stroną www.Nexcess.net (platynowy partner Magento) i potwierdzili oni, że klienci żądają, aby ich core_url_rewritetabela wymagała obcięcia ze względu na zbyt duże rozmiary.

Moim największym zmartwieniem jest to, że może to mieć wpływ na SEO, dlatego chciałbym rozwiązania, a nie odkładania problemu na później.

Aktualizacja: Nexcess wspomniał, że przy zduplikowanych produktach w tabeli może to w rzeczywistości zaszkodzić SEO.

Łoś
źródło
Wow, to niesamowicie duży stół. Sprawdziłem własny (200 produktów) i ma on tylko ~ 800 wierszy, ale nie mamy problemu z powieleniem nazwy produktu / adresów URL. Jako punkt odniesienia mamy około 6,6 wierszy na widoczny produkt. Przyznaję, że to nie jest straszne realistyczne porównanie, ale w takim tempie, przy 5000 produktów mamy około 30 000 wierszy. Rozumiem twoją potrzebę rozwiązania i będę obserwował to pytanie, gdy zamierzam wdrożyć znacznie większą witrynę.
Pete855217,
@ Pete855217: to pytanie brzmi interesująco, mimo że go nie głosowałeś.
Mohammad Faisal
1
W EE1.12 wystąpił błąd, który powoduje, że ponowne zapisywanie jest tworzone przy każdym zapisie. Możliwe, że Twoja wersja 1.7 ma ten sam błąd. O ile pamiętam, łatka do wersji 1.12 działała również na wersji 1.7
brentwpeterson
1
Bardzo pomocny artykuł! Mamy 130 000 aktywnych produktów i 25 000 niepełnosprawnych produktów, nasz core_url_rewrite_table zawiera 2744023 zapisy ..... więc w tym tygodniu zabieramy się do naprawy tego !! Ten artykuł wydaje się być dobrym punktem wyjścia.
MagentoMac,
Edytowałem post, aby uwzględnić, jak nie usuwać niestandardowych zapisów w Magento.
espradley

Odpowiedzi:

76

Udało mi się ustabilizować problem w następujący sposób:

Krok 1: Przepisz model katalogu URL (używając własnego modułu: jak to zrobić )

Uwaga: jeśli nadpisasz plik podstawowy bez użycia przepisywania, spowoduje to, że Twoja instancja Magento nie będzie w stanie wykonać przyszłych aktualizacji.

Zgodnie z rozwiązaniem Jahnniego na tablice MagentoCommerce(nie jest już aktywny z nową tablicą), app/code/core/Mage/Catalog/Model/Url.php[wokół linii 807 Mage_Catalog_Model_Url::getProductRequestPath()]

Od:

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

Do:

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

Krok 2: Obetnij

Obetnij core_url_rewritestół

Krok 3: Reindex i Flush Cache

Zainicjuj proces ponownej indeksacji w Core URL Rewrites. Następnie będziesz musiał opróżnić pamięć podręczną i pamięć podręczną Magento.

SystemCache ManagementFlush Magento Cache

SystemCache ManagementFlush Cache Storage

Voila, wszystko gotowe. Zauważysz, że jeśli uruchomisz ponownie indeksatora, tabela powinna pozostać na stałym poziomie (chyba że dodałeś więcej produktów między nimi lub jeśli masz zduplikowane nazwy kategorii).

Łoś
źródło
5
Świetnie, moja tabela core_url_rewrite miała 3,2 GB, teraz ma 36,8 MB: D autor: muppet
Fabian Blechschmidt
Mam podobny problem. Przepisz adres URL Magento, dodaj losową liczbę do adresu URL. Proszę zobaczyć zrzut ekranu dołączony z narzędzi Google Master Webmaster. Jak widać, produkt „Beżowy haftowany sari weselny” ma dziewięć różnych adresów URL, ale jest to tylko jeden produkt i wskazuje tylko jeden adres URL kończący się na 878. Rzeczywisty klucz adresu URL nie ma na końcu losowej liczby (zrzut ekranu załączony ). Mój sklep jest dość nowy, a rozmiar core_url_rewrite nie jest aż taki duży. Nie jestem więc pewien, czy powinienem zrobić krok 1 i 2, czy tylko krok 1. Jeśli wykonam krok 2, stracę niestandardowe przepisywanie.
Zoya,
Korzystam z wersji 1.9.1 i tutaj brakuje adresów URL zrzutów ekranu. monosnap.com/image/duL0f64WWlACtlt9kcn04BWqY3L5Xl monosnap.com/image/osFk8kYNAr00XLdFTGTIOaydaW5yqS
Zoya
2
Najpierw wyeksportowałbym istniejącą tabelę. Następnie przejdę do kroków 1, 2 i 3. Spójrz core_url_rewriteteraz na tabelę i zanotuj liczbę rekordów. Ponownie uruchom krok 3 (ponowne indeksowanie) i odśwież widok na core_url_rewritestole. Jeśli numer jest taki sam, problem został rozwiązany. Następnie śmiało połącz ręcznie niestandardowe przepisywania. Wszystkiego najlepszego.
Łoś
2
Ta poprawka działa tylko w przypadku produktów, a nie kategorii z identycznymi kluczami URL. Zobacz odpowiedź @ Simona na lepsze rozwiązanie (z plikiem poprawki)
Giel Berkers
45

Chociaż mam nadzieję, że ktoś tu znajdzie odpowiedź, nie wiem, czy ją znajdziesz. Ten stół robi się nieporęczny z wielu różnych powodów. Błędy we wcześniejszych (i prawdopodobnie aktualnych) wersjach Magento to jedno. Inna jest logika w tej tabeli, która próbuje śledzić zmiany wartości klucza adresu URL, dzięki czemu przepisywania 301/302 są konfigurowane dla starych produktów. Z tego powodu i komplikowanie rzeczy, obcinanie tabeli i regenerowanie może sprawić, że istniejące przepisywania adresów URL znikną, a to będzie miało nieznany wpływ na twoją listę wyszukiwarek (nie jest to zła konieczność, tylko trudne do przewidzenia).

Moja ogólna rada dla klientów, którzy pytają to:

  1. Opuść gigantyczny stół do uprawy tak, jakbyś nie miał dobrego zdania na temat swojej URL / SEO

  2. Dopóki rozmiar tabeli nie będzie stanowić problemu (na przykład generowanie map witryn). Kiedy tak się stanie, uzyskaj kontrolę nad swoją sytuacją dotyczącą adresów URL / SEO.

  3. Po opanowaniu sytuacji dotyczącej adresu URL / SEO należy wykonać kopię zapasową tabeli, a następnie ją obciąć i zregenerować. Rozwiązuj wszelkie problemy związane z adresami URL / SEO spowodowane przycinaniem.

  4. Zautomatyzuj krok 3

Próbowanie naprawy tego na poziomie kodu Magento jest godne podziwu, ale będziesz pływał pod prąd. Czasami lepiej jest zaakceptować, że „To tylko Magento jest Magento” i rozwiązać problem z procesem zewnętrznym.

Alan Storm
źródło
dziękuję za radę, szkoda sytuacji, ale myślę, że będzie to musiało być rozwiązane przez proces zewnętrzny, jak już wspomniałeś, ugh.
Łoś
2
Ten gigantyczny stół może już powodować problemy z SEO, ponieważ kanoniczność dla danego produktu będzie się ciągle zmieniać. Jeśli masz oddzielny widok sklepu na urządzenia mobilne i stacjonarne, jest jeszcze gorzej, ponieważ ich adresy URL będą się różnić.
Melvyn
Trochę rozczarowująca odpowiedź dla mnie ...
Fra
@Alan Storm, co sądzisz o odpowiedzi opublikowanej przez Moose po opublikowaniu tej odpowiedzi? Czy widzisz takie same ryzyko?
Goose
24

Chciałbym dodać poprawkę do tego błędu indeksowania przepisywania adresów URL, który został opracowany podczas bugathonu w marcu 2013 r. I który został później ulepszony. To powinno rozwiązać ten problem. Jako odniesienie, oto plik łatki z linku:

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


Dodatkowo chciałbym dodać łatkę EE PATCH_SUPEE-389_EE_1.12.0.2_v2.sh, która jest teraz dostępna na 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
             );
         }

Jeśli chcesz używać tej poprawki z CE, sprawdź ją poprawnie, ponieważ została opracowana dla EE.

Szymon
źródło
Czy sam testowałeś tę łatkę EE na CE?
Tyler V.
@TylerV. Nie ...
Simon
3
Wypróbowałem tę poprawkę w EE 1.9.1.1 i mogę się upewnić, że działa. Rozwiązuje problem z produktami i kategoriami z identycznymi kluczami URL. Miejmy nadzieję, że wkrótce wprowadzą to w przyszłej wersji.
Giel Berkers,
1
Dzięki Simon, właśnie przeszedłem z 1 GB do 3 MB na stronie jednego klienta ... Musiałem go obcinać co 6 miesięcy, mam nadzieję, że pozostanie teraz mały :)
willem wigman
1
Właśnie próbowałem tego na moim 1.9 CE i chociaż działa to na produkty - kategorie nie są całkiem odpowiednie. Jeśli mam kategorię o nazwie „Test”, która podaje adres URL „... / test”, a następnie utworzę kolejną o nazwie „Test”, powinna ona podać adres URL „... / test-2”, ale zamiast tego podaje tylko liczbę nie nazwa: „... / - 2”
dziwna kaczka
11

Po zastosowaniu poprawki opublikowanej przez Simona możesz użyć następującego zapytania, aby usunąć niepotrzebne dane:

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

W przeciwieństwie do zapytania Ashisha Hiry, wpływa to tylko na adresy URL, które mają liczbę całkowitą, ponieważ ostatnia część była - w moim przypadku - przyczyną bałaganu.

Próbuje nie dotykać poprawnych zapisów, które na przykład mogły zostać utworzone podczas aktualizacji klucza adresu URL.

Alex
źródło
6

Z powodzeniem zastosowałem przyjętą odpowiedź. Podczas kolejnej instalacji Magento musiałem zachować niektóre niestandardowe przepisywania, więc usunąłem wszystkie wpisy, które zakończyły się na - a następnie liczbę o długości do 5 cyfr z:

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

To w większości działało, ale nadal dostaję 2 kolejne wiersze przy każdym ponownym indeksowaniu. Nie pewny dlaczego. Myślałem, że podzielę się tym doświadczeniem.

Andy Myers
źródło
1
Prawdopodobnie usunąłeś adresy URL, które są prawidłowe, ale kończą się numerem. Znajdziesz ich z$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('url_key', array('regexp' => '[0-9]$'));
Melvyn
5

Główna zmiana, o której wspomniałeś, wydaje się potrzebna tylko wtedy, gdy masz produkty bez kluczy url, jednak Magento zawsze powinno tworzyć dla Ciebie klucze url_keys. Jeśli masz importera, który tworzy produkty bez kluczy url_, to problem pojawi się w przypadku tych produktów. Spróbuj uruchomić następujące zapytanie, aby znaleźć takie produkty:

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

Jeśli jakiekolwiek produkty powrócą z tego zapytania, nie mają klucza url_ i będą stanowić problem.

Tyler V.
źródło
2
Pamiętaj, że wartością domyślną entity_type_iddla produktów jest 4, a nie 10.
Simon
3

Postępowałem zgodnie z zatwierdzonym rozwiązaniem, aby zapobiec powtórnemu zapisywaniu adresów URL, a następnie eksportowałem core_url_rewritejako plik CSV. Był w stanie otworzyć ten plik CSV i usunąć wszystkie oprócz ręcznie utworzonych przeróbek adresów URL.

Następnie obciąłem core_url_rewritetabelę i zaimportowałem zapisany plik CSV z ręcznie utworzonymi przepisem adresów URL.

Po wszystkich zmianach zmieniono z 940 tys. Wierszy na 32 tys. Ogromna poprawa.

JonW
źródło
3

Oto łatka (lokalne przepisywanie) dla społeczności Magento, aby naprawić, że https://github.com/biotech/Magento-URL-Rewrite W rzeczywistości robi to samo, co łatka EE PATCH_SUPEE-389_EE_1.12.0.2_v2.sh - sprawdź każde przepisanie i unikaj tworzenia zduplikowanych rekordów. Działa dobrze przez ostatnie 2 miesiące w produkcji CE 1.9, 15 tys. Produktów, 4 sklepy, pełne ponowne indeksowanie każdej nocy po zmianach importu produktów masowych.

FireBear
źródło
Jak dokładnie to przetestowano? Wygląda na to, że został opublikowany godzinę temu ....
SR_Magento,
Czy zostało to naprawione w wersji 1.9.2.x, więc nie musimy się już martwić o rozdęcie stołu?
Fiasco Labs,
Odpowiedzi na pojedyncze łącze nie są najlepszymi odpowiedziami, nawet jeśli mogłyby rozwiązać problem. Wyjaśnij trochę, co robi Twój kod.
Marius
@FiascoLabs tak, działa dobrze na wszystkich CE 1.9.x
FireBear
1
@FiascoLabs: 1.9.2.x nadal ma ten problem „przerób bloat” i nie zawiera tej poprawki, jednak, jak powiedział FireBear, łatka EE będzie działać z CE 1.9.2.x. (nie próbowałem osobiście; chciałem tylko wyjaśnić, że 1.9.2.2 zdecydowanie nadal ma ten problem)
Eric Seastrand,
2

Ponieważ nie jest to jeszcze wspomniane w tym wątku, chciałem podzielić się fajną wiadomością, że ten problem został rozwiązany w Magento 1.9.3.9 i nowszych. Zobacz powiązane informacje o wersji :

Magento nie wykonuje już niepotrzebnych operacji zapisu na tabeli core_url_rewrite.

Tak więc wszystkie poprawki dla tego problemu wspomniane tutaj nie są konieczne, gdy używasz wersji Magento większej lub równej niż 1.9.3.9. Nadal sugeruję usunięcie starych wartości zgodnie z opisem w odpowiedzi Alexa .

Szymon
źródło
1

Uruchom to zapytanie

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

Pomoże to z pewnością zmniejszyć rozmiar core_url_sizetabeli poprzez usunięcie niepotrzebnych danych.

Asish Hira
źródło
Czy na pewno są to niepotrzebne dane? Wydaje mi się, że usunęło to także przepisania, które zostały utworzone podczas zmiany klucza adresu URL!
Alex
Sprawdź wyrażenie regularne. oznacza to, że nie mają ważnego identyfikatora
Asish Hira
Ale te identyfikatory są również tworzone podczas ręcznej zmiany klucza URL w wewnętrznej bazie danych. Zobacz także moją odpowiedź.
Alex
0

Pozbyć się .html

  1. Nie używaj przyrostka .html
  2. Ustaw w .htaccess

    ## Redirect all htmls.
    RewriteRule (.+)\.html$ /$1 [L,R=301]
    
  3. Usuń wszystkie .htmlprzekierowania:

    DELETE FROM core_url_rewrite WHERE request_path LIKE '%.html'
lycenok
źródło
0

Oficjalną odpowiedzią powinna być instalacja SUPEE-389. Proste.

Doskonale współpracuje z Magento CE, ponieważ dzielą ten sam kawałek kodu w tym obszarze.

Możesz znaleźć plik łatki tutaj, https://gist.github.com/piotrekkaminski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-sh

Wystąpił ten problem i wygenerowano tysiące nowych wierszy po każdym ponownym indeksowaniu adresu URL katalogu. Teraz problem zniknął ... z wyjątkiem faktu, że musimy wyczyścić DB.

Przedstawiony tutaj skrypt wydaje się dobrym początkiem, ale nie jest to idealne rozwiązanie,

php shell / rewrites_doctor.php --remove_rewrites 4

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

Frédéric Gauthier-Boutin
źródło
-2

Istnieje również dedykowany moduł https://github.com/vladsmirnov/url-rewrites , więc nie musisz ponownie nakładać łaty po każdej aktualizacji Magento. Moduł składa się z dwóch części: aktualnego modułu, aby zapobiec duplikowaniu, oraz skryptu powłoki, aby wyczyścić istniejącą bazę danych.

Władysław Smirnow
źródło