Magento core_url_rewrite tabella eccessivamente grande


105

Ho notato una grande quantità di segnalazioni che questa tabella stessa può diventare estremamente ingombra, sto gestendo un sito con ~ 5000 SKU e ~ 250 categorie (negozio singolo) e una core_url_rewritetabella risultante di oltre 600.000 righe e oltre 500 MB di dimensioni che è pazzo.

Ciò può rallentare le prestazioni del sito e generare un database molto voluminoso. Ho fatto un po 'di ricerche e ho trovato alcuni post su questo, in particolare:

// Questi collegamenti sono stati rimossi dall'implementazione delle nuove schede

Ora capisco che il tavolo può essere troncato e reindicizzato, ma questo non risolve il problema, ma prolunga il problema dal ripetersi.

Da quello che ho capito, parte del problema sono i prodotti che hanno la stessa chiave url in base al nome del prodotto, risultando in collegamenti indicizzati.

Una correzione menzionata è:

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

Modificare:

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

Per:

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

Ma anche questo non risolve completamente il problema.

La mia domanda è la seguente:

Se hai riscontrato questo problema, sei riuscito a impostare un algoritmo efficace, logico ed efficiente che non comporta la "gestione" ripetuta del problema, ma risolve effettivamente la questione una volta per tutte?

Sarebbe veramente apprezzare una certa comprensione in questo.

BTW: Per favore, fatevi un favore e verificate l'aspetto del vostro tavolo in questo momento, è possibile che si stia verificando questo problema e l'impatto delle prestazioni come risultato senza nemmeno saperlo - Non l'ho fatto.

Modifica: sono stato in contatto con www.Nexcess.net (un partner di hosting Platinum Magento) e hanno confermato di aver richiesto ai clienti che il loro core_url_rewritetavolo richiedesse il troncamento a causa dell'eccessiva ingombro.

Una mia grande preoccupazione è l'impatto SEO che questo potrebbe avere, motivo per cui mi piacerebbe una soluzione piuttosto che procrastinare il problema dal sorgere di nuovo.

Aggiornamento: Nexcess ha detto che con i prodotti duplicati all'interno della tabella potrebbe effettivamente danneggiare SEO così com'è.


Wow, è un tavolo incredibilmente grande. Ho controllato il mio (200 prodotti) e ha solo ~ 800 righe, ma non abbiamo problemi a duplicare il nome / URL del prodotto. Come punto di riferimento, abbiamo circa 6,6 righe per prodotto visibile. Devo ammettere che questo non è un terribile confronto realistico, ma a quel ritmo, con 5.000 prodotti avremmo solo circa 30.000 righe. Posso capire bene la tua necessità di una soluzione e guarderò questa domanda mentre sto per implementare un sito molto più grande.
Pete855217

@ Pete855217: questa domanda ti sembra interessante anche se non l'hai votata.
Mohammad Faisal,

1
Si è verificato un errore in EE1.12 che ha causato la riscrittura delle riscritture ad ogni salvataggio. È possibile che la tua versione di 1.7 abbia lo stesso bug. Come ricordo la patch per 1.12 ha funzionato anche su 1.7
brentwpeterson

1
Articolo molto utile! Abbiamo 130.000 prodotti attivi e 25.000 prodotti disabilitati, il nostro core_url_rewrite_table ha 2744023 record ..... quindi questa settimana stiamo lavorando per rimediare !! Questo articolo sembra essere un buon punto di partenza.
MagentoMac,

Ho modificato il post per includere come non eliminare le riscritture personalizzate in Magento.
Espradley,

Risposte:


76

Sono riuscito a stabilizzare il problema come segue:

Passaggio 1: riscrivere il modello di URL del catalogo (utilizzando il proprio modulo: come )

Nota: se si sovrascrive il file principale senza utilizzare una riscrittura, la propria istanza di Magento non sarà in grado di eseguire aggiornamenti futuri.

Secondo la soluzione di Jahnni su le schede MagentoCommerce(non più attivo con la nuova scheda), app/code/core/Mage/Catalog/Model/Url.php[intorno alla linea 807 Mage_Catalog_Model_Url::getProductRequestPath()]

A partire dal:

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

Per:

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

Passaggio 2: troncare

Tronca la core_url_rewritetabella

Passaggio 3: reindicizzare e svuotare le cache

Avviare il processo di reindicizzazione su Riscrittura URL principale. Successivamente, ti consigliamo di svuotare la cache di Magento e la cache di archiviazione.

SystemCache ManagementFlush Magento Cache

SystemCache ManagementFlush Cache Storage

Voila, sei pronto. Noterai che se esegui di nuovo l'indicizzatore, la tabella dovrebbe rimanere di dimensioni costanti (a meno che tu non abbia aggiunto più prodotti in mezzo o se hai nomi di categorie duplicati).


5
Ottimo, la mia tabella core_url_rewrite era 3.2 GB ora è 36.8 MB: D di muppet
Fabian Blechschmidt

Ho un problema simile. La riscrittura dell'URL Magento aggiunge un numero casuale nell'URL. Guarda lo screenshot allegato dagli strumenti principali di web di google. Come puoi vedere, il prodotto "Saree da matrimonio ricamato beige" ha nove URL diversi ma è solo un prodotto e punta a un solo URL che termina con 878. La chiave URL effettiva non ha un numero casuale alla fine (schermata allegata ). Il mio negozio è abbastanza nuovo e la dimensione di core_url_rewrite non è così grande. Quindi non sono sicuro se dovrei andare avanti e fare i passaggi 1 e 2 o solo il passaggio 1. Se eseguo il passaggio 2, perderò le riscritture personalizzate.
Zoya,


2
Vorrei prima esportare la tabella esistente. Quindi procederei con i passaggi 1, 2 e 3. Dai un'occhiata alla core_url_rewritetabella ora e annota il numero di record. Eseguire nuovamente il passaggio 3 (reindicizzazione) e aggiornare la vista sulla core_url_rewritetabella. Se il numero è lo stesso, hai risolto correttamente. Quindi vai avanti e unisci manualmente le riscritture personalizzate. Ti auguro il meglio.
Moose,

2
Questa correzione funziona solo per prodotti, non per categorie con chiavi URL identiche. Vedi la risposta di @Simon per una soluzione migliore (con il file patch)
Giel Berkers,

45

Mentre spero che qualcuno qui trovi una risposta, non so che ne troverai una. Questa tabella diventa ingombrante per molte ragioni diverse. I bug nelle versioni precedenti (e forse attuali) di Magento sono uno. Un'altra è la logica in questa tabella che tenta di tenere traccia delle modifiche al valore della chiave URL in modo che le riscritture 301/302 siano configurate per i vecchi prodotti. Per questo motivo, e complicando le cose, troncare la tabella e rigenerare può far sparire le riscritture degli URL esistenti, e ciò avrà un effetto sconosciuto sul tuo elenco di motori di ricerca (non necessariamente male, solo difficile da prevedere).

Il mio consiglio generale ai clienti che chiedono è

  1. Lascia la gigantesca tabella di crescita così com'è se non hai una buona padronanza della tua situazione URL / SEO

  2. Fino a quando le dimensioni della tabella non iniziano a costituire un problema (ad esempio la generazione di mappe del sito). Quando ciò accade, ottieni una gestione della tua situazione URL / SEO.

  3. Una volta che hai una maniglia sulla tua situazione URL / SEO, esegui il backup della tabella, quindi tronca la tabella e rigenera. Risolvi eventuali problemi URL / SEO causati dal troncamento.

  4. Automatizza il passaggio 3

Cercare di risolvere questo problema a livello di codice Magento è ammirevole, ma nuoterai a monte. A volte è meglio accettare che "Magento sia Magento" e risolvere il problema con un processo esterno.


grazie per il consiglio, è un peccato per la situazione, ma penso che dovrà essere gestito da un processo esterno come hai detto, urgh.
Moose,

2
Questa gigantesca tabella può già causare problemi SEO, poiché il canonico di un determinato prodotto cambierà costantemente. Se hai una visualizzazione negozio separata per dispositivi mobili e desktop, è ancora peggio perché i loro URL differiranno.
Melvyn,

Una risposta un po 'deludente per me ...
Fra

@Alan Storm, cosa ne pensi della risposta postata da Moose dopo aver pubblicato questa risposta? Vedi gli stessi rischi?
Oca,

24

Vorrei aggiungere una correzione per questo bug dell'indicizzatore di riscrittura dell'URL che è stato sviluppato alla bugathon nel marzo 2013 e che è stato ulteriormente migliorato in seguito. Dovrebbe risolvere questo problema. Come riferimento, ecco il file patch dal link:

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


Inoltre, vorrei aggiungere la patch EE PATCH_SUPEE-389_EE_1.12.0.2_v2.sh, che è ora disponibile su 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
             );
         }

Se si desidera utilizzare questa patch con CE, assicurarsi di testarla correttamente, poiché è stata sviluppata per EE.


Hai provato tu stesso questa patch EE su CE?
Tyler V.

@TylerV. No ...
Simon

3
Ho provato questa patch in EE 1.9.1.1 e posso conformarmi che funziona. Risolve il problema con prodotti e categorie con chiavi URL identiche. Speriamo che lo implementino presto in una versione futura.
Giel Berkers,

1
Grazie Simone, sono appena passato da 1 GB a 3 MB sul sito Web di un cliente ... Ho dovuto troncarlo prima ogni 6 mesi, spero che rimanga piccolo ora :)
Willem Wigman,

1
Ho appena provato questo sul mio 1.9 CE e anche se funziona per i prodotti - le categorie non sono del tutto giuste. Se ho una categoria chiamata 'Test' che fornisce l'URL '... / test' e quindi creo un altro chiamato 'Test', dovrebbe dare l'URL '... / test-2' ma invece dà solo il numero non il nome: '... / - 2'
odd_duck

11

Dopo aver applicato la patch pubblicata da Simon, è possibile utilizzare la seguente query per rimuovere i dati spazzatura:

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

Contrariamente alla domanda di Ashish Hira, questo ha effetto solo sugli URL che hanno un numero intero come ultima parte - questo è stato - nel mio caso - il motivo del disordine.

Cerca di non toccare riscritture valide, che ad esempio potrebbero essere state create durante l'aggiornamento di una chiave URL.


6

Ho implementato la risposta accettata con successo. In un'altra installazione di Magento avevo bisogno di conservare alcune riscritture personalizzate, quindi ho eliminato tutte le voci che terminavano con un - e quindi un numero lungo fino a 5 cifre con:

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

Questo per lo più ha funzionato, ma ho ancora altre 2 righe su ogni reindicizzazione. Non so perché. Ho pensato di condividere questa esperienza.


1
Probabilmente hai eliminato URL validi ma che finiscono con un numero. Troveresti quelli con$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('url_key', array('regexp' => '[0-9]$'));
Melvyn il

5

Il cambiamento fondamentale che hai citato sembra essere necessario solo se hai prodotti senza url_keys, tuttavia Magento dovrebbe sempre creare url_keys per te. Se hai un importatore che sta creando prodotti senza url_keys, questo problema si presenterà per quei prodotti. Prova a eseguire la seguente query per trovare tali prodotti:

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

Se alcuni prodotti restituiscono da quella query, non hanno un url_key e saranno un problema.


2
Ricorda che il valore predefinito entity_type_idper i prodotti è 4 e non 10.
Simon

3

Ho seguito una soluzione approvata per impedire la riscrittura di URL duplicati, quindi esportato core_url_rewritecome file CSV. È stato in grado di aprire questo CSV ed eliminare tutte le riscritture URL create manualmente.

Quindi ho troncato la core_url_rewritetabella e importato il mio CSV salvato con riscrittura URL creata manualmente.

Dopo tutte le modifiche, è passato da 940 KB a 32 KB. Enorme miglioramento.


3

Ecco la patch (riscrittura locale) per Magento Community per la correzione che https://github.com/biotech/Magento-URL-Rewrite In realtà fa lo stesso della patch EE PATCH_SUPEE-389_EE_1.12.0.2_v2.sh - controlla ogni riscrittura e evitare la creazione di record duplicati. Funziona bene negli ultimi 2 mesi sulla produzione CE 1.9, prodotti 15k, 4 negozi, reindicizzazione completa ogni notte dopo le modifiche all'importazione di prodotti sfusi.


Quanto accuratamente è stato testato? Sembra che sia stato pubblicato un'ora fa ....
SR_Magento

Questo problema è stato risolto in 1.9.2.x quindi non dobbiamo più preoccuparci del gonfiamento del tavolo?
Fiasco Labs,

Le risposte a collegamento singolo non sono le risposte migliori anche se potrebbero risolvere il problema. Per favore, spiega un po 'cosa fa il tuo codice.
Marius

@FiascoLabs sì, funziona bene su tutti i CE 1.9.x
FireBear

1
@FiascoLabs: 1.9.2.x presenta ancora questo problema di "riscrittura gonfia" e non include questa correzione, tuttavia, come ha detto FireBear, la patch EE funzionerà con CE 1.9.2.x. (non ho provato personalmente; volevo solo chiarire che 1.9.2.2 presenta ancora questo problema)
Eric Seastrand,

2

Dal momento che questo non è ancora menzionato in questo thread, ho voluto condividere la bella notizia che questo problema è stato risolto in Magento 1.9.3.9 e versioni successive. Vedi le note di rilascio correlate :

Magento non esegue più operazioni di scrittura non necessarie sulla tabella core_url_rewrite.

Quindi tutte le correzioni per questo problema menzionate qui non sono necessarie quando si utilizza una versione di Magento maggiore o uguale a 1.9.3.9. Consiglio ancora di cancellare i vecchi valori come descritto nella risposta di Alex .


1

Esegui questa query

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

Ciò ti aiuterà sicuramente a ridurre le dimensioni della core_url_sizetabella eliminando i dati inutili.


Sei sicuro che si tratti di dati spazzatura? Penso che abbia eliminato anche le riscritture che sono state create quando si cambia una chiave URL!
Alex

Controlla la regex. questo significa che non hanno un ID valido
Asish Hira,

Ma questi ID vengono creati anche quando si modifica manualmente la chiave URL nel back-end. Vedi anche la mia risposta.
Alex

0

Liberarsi di .html

  1. Non usare il suffisso .html
  2. Impostato in .htaccess

    ## Redirect all htmls.
    RewriteRule (.+)\.html$ /$1 [L,R=301]
  3. Cancella tutti i .htmlreindirizzamenti:

    DELETE FROM core_url_rewrite WHERE request_path LIKE '%.html'

0

La risposta ufficiale dovrebbe essere quella di installare SUPEE-389. Semplice come quella.

Funziona perfettamente con Magento CE poiché condividono lo stesso codice in questo settore.

Puoi trovare il file patch qui, https://gist.github.com/piotrekkaminski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-sh

Abbiamo riscontrato questo problema e ha generato migliaia di nuove righe dopo ogni reindicizzazione dell'URL del catalogo. Ora il problema è sparito ... tranne per il fatto che dobbiamo pulire il DB.

Lo script fornito qui sembra un buon inizio ma non è una soluzione perfetta,

php shell / rewrites_doctor.php --remove_rewrites 4

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


-2

C'è anche un modulo dedicato https://github.com/vladsmirnov/url-rewrites , quindi non è necessario riapplicare la patch dopo ogni aggiornamento di Magento. Il modulo contiene due parti: il modulo attuale, per impedire la duplicazione da ora in poi e lo script della shell per ripulire il database esistente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.