Tabela core_url_rewrite do Magento excessivamente grande

105

Notei uma grande quantidade de relatórios de que essa tabela em si pode ficar extremamente confusa. Estou executando um site com ~ 5000 SKUs e ~ 250 categorias (loja única) e uma core_url_rewritetabela resultante com mais de 600.000 linhas e mais de 500 MB de tamanho, é uma loucura.

Isso pode diminuir o desempenho do site e resultar em um banco de dados muito volumoso. Eu fiz algumas pesquisas e encontrei algumas postagens sobre isso, principalmente:

// Esses links foram removidos desde a implementação dos novos painéis

Agora entendo que a tabela pode ser truncada e reindexada, mas isso não resolve o problema, apenas prolonga o problema.

Pelo que entendi, parte do problema são produtos que possuem a mesma chave de URL com base no nome do produto, resultando em links indexados.

Uma correção mencionada é:

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

Mudança:

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

Para:

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

Mas mesmo isso não resolve completamente o problema.

Minha pergunta é a seguinte:

Se você enfrentou esse problema, conseguiu configurar um algoritmo eficaz, lógico e eficiente que não envolva "gerenciar" o problema repetidamente, mas realmente resolver o problema de uma vez por todas?

Será que realmente aprecio algumas dicas sobre isso.

BTW: Faça um favor a si mesmo e verifique como está a sua mesa agora. Você pode estar enfrentando esse problema e o impacto no desempenho como resultado disso, mesmo sem saber - eu não.

Edit: Eu entrei em contato com www.Nexcess.net (um parceiro de hospedagem de platina Magento) e eles confirmaram que tiveram clientes solicitando que sua core_url_rewritetabela exija truncamento por ser muito volumosa.

Uma grande preocupação minha é o impacto no SEO que isso pode ter, e é por isso que eu gostaria de uma solução em vez de adiar o problema de surgir novamente.

Atualização: a Nexcess mencionou que, com os produtos duplicados na tabela, pode estar prejudicando o SEO.

alce
fonte
Uau, essa é uma mesa incrivelmente grande. Eu verifiquei meus próprios produtos (200 produtos) e ele tem apenas ~ 800 linhas, mas não temos problema ao duplicar o nome / URLs do produto. Como ponto de referência, temos cerca de 6,6 linhas por produto visível. Admito que essa não é uma comparação realista terrível, mas, nesse ritmo, com 5.000 produtos, teríamos apenas ~ 30.000 linhas. Compreendo bem sua necessidade de solução e observarei essa pergunta enquanto estou prestes a implementar um site muito maior.
Pete855217
@ Pete855217: esta pergunta lhe parece interessante, embora você não a tenha votado positivamente.
Mohammad Faisal
1
Houve um erro no EE1.12 que fazia com que as regravações fossem recriadas a cada salvamento. É possível que sua versão do 1.7 tenha esse mesmo bug. Pelo que me lembro o patch para 1,12 também trabalhou em 1.7
brentwpeterson
1
Artigo muito útil! Temos 130.000 produtos ativos e 25.000 produtos desativados, nossa core_url_rewrite_table possui 2744023 registros ..... portanto, nesta semana, estamos trabalhando para corrigir isso !! Este artigo parece ser um bom ponto de partida.
MagentoMac
Editou a postagem para incluir como não excluir suas reescritas personalizadas no Magento.
21915 espradley

Respostas:

76

Consegui estabilizar o problema da seguinte maneira:

Etapa 1: reescreva o modelo de URL do catálogo (usando seu próprio módulo: como fazer )

Nota: Se você sobrescrever o arquivo principal sem usar uma reescrita, isso tornará sua instância do Magento incapaz de futuras atualizações.

Conforme a solução de Jahnni em os painéis MagentoCommerce(não está mais ativo com a nova diretoria), app/code/core/Mage/Catalog/Model/Url.php[em torno da linha 807 Mage_Catalog_Model_Url::getProductRequestPath()]

De:

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

Para:

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

Etapa 2: Truncar

Truncar a core_url_rewritetabela

Etapa 3: reindexar e liberar caches

Inicie o processo de reindexação nas regravações de URL principal. Depois disso, você desejará liberar o cache do Magento e o cache de armazenamento.

SystemCache ManagementFlush Magento Cache

SystemCache ManagementFlush Cache Storage

Voila, você está pronto. Você notará que, se executar novamente o indexador, a tabela deverá permanecer constante em tamanho (a menos que você tenha adicionado mais produtos entre eles ou se você tiver nomes de categorias duplicados).

alce
fonte
5
Grande, minha mesa core_url_rewrite foi de 3,2 GB agora é 36,8 MB: D por muppet
Fabian Blechschmidt
Eu tenho um problema similar. A reescrita de URL do Magento acrescenta um número aleatório no URL. Por favor, olhe a captura de tela anexada das ferramentas do Google Web Master. Como você pode ver, o produto "Saree de casamento bordado bege" possui nove URLs diferentes, mas é apenas um produto e aponta para apenas um URL que termina com 878. A chave do URL real não possui um número aleatório no final (captura de tela anexada ) Minha loja é relativamente nova e o tamanho de core_url_rewrite não é tão grande. Portanto, não tenho certeza se devo seguir em frente e executar as etapas 1 e 2 ou apenas a etapa 1. Se eu executar a etapa 2, perderei minhas reescrições personalizadas.
Zoya 25/05
Estou executando o 1.9.1 e aqui estão os URLs de captura de tela ausentes. monosnap.com/image/duL0f64WWlACtlt9kcn04BWqY3L5Xl monosnap.com/image/osFk8kYNAr00XLdFTGTIOaydaW5yqS
Zoya
2
Eu exportaria a tabela existente primeiro. Depois, procederia com as etapas 1, 2 e 3. Dê uma olhada na core_url_rewritetabela agora e anote o número de registros. Execute a etapa 3 novamente (a reindexação) e atualize sua exibição na core_url_rewritetabela. Se o número for o mesmo, você resolveu com sucesso. Em seguida, vá em frente e mescle manualmente suas regravações personalizadas. Muito bem sucedida.
Moose
2
Essa correção funciona apenas para produtos, não para categorias com chaves de URL idênticas. Ver resposta @Simon s'para uma melhor solução (com o arquivo patch)
Giel Berkers
45

Embora eu espero que alguém aqui tenha uma resposta, não sei se você encontrará uma. Esta tabela fica volumosa por vários motivos diferentes. Os erros nas versões anteriores (e possivelmente atuais) do Magento são um. Outra é a lógica nesta tabela que tenta rastrear alterações no valor da chave da URL para que as reescritas 301/302 sejam configuradas para produtos antigos. Por esse motivo, e para complicar as coisas, truncar a tabela e gerar novamente pode fazer com que as reescrições de URL existentes desapareçam, e isso terá um efeito desconhecido na listagem do seu mecanismo de pesquisa (não é necessariamente ruim, apenas difícil de prever).

Meu conselho geral aos clientes que perguntam é

  1. Deixe a mesa de crescimento gigante como está, se você não souber lidar bem com sua situação de URL / SEO

  2. Até o tamanho da tabela começar a ser um problema (gerar mapas do site, por exemplo). Quando isso acontecer, identifique sua situação de URL / SEO.

  3. Depois de controlar sua situação de URL / SEO, faça backup da tabela, trunque a tabela e gere novamente. Resolva quaisquer problemas de URL / SEO causados ​​pelo truncamento.

  4. Automatize a etapa 3

Tentar consertar isso no nível do código Magento é admirável, mas você estará nadando contra a corrente. Às vezes é melhor aceitar que "Isso é apenas Magento sendo Magento" e resolver o problema com um processo externo.

Alan Storm
fonte
obrigado pelo conselho, é uma pena a situação, mas acho que ela terá que ser tratada por um processo externo, como você mencionou, urgh.
Moose
2
Essa tabela gigante já pode causar problemas de SEO, pois o canônico de um determinado produto muda constantemente. Se você tiver uma visualização separada para dispositivos móveis e computadores, é ainda pior, pois os URLs serão diferentes.
21415 Melvyn
Uma resposta pouco decepcionante para mim ...
Fra
@ Alan Storm, como você se sente sobre a resposta postada por Moose depois de postar esta resposta? Você vê os mesmos riscos?
Ganso
24

Gostaria de adicionar uma correção para esse bug do indexador de reescrita de URL, que foi desenvolvido na bugathon em março de 2013 e que foi melhorado posteriormente. Deve resolver esse problema. Como referência, aqui está o arquivo de correção do 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()


Além disso, gostaria de adicionar o patch EE PATCH_SUPEE-389_EE_1.12.0.2_v2.sh, que agora está disponível no 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 você deseja usar este patch com o CE, teste-o corretamente, pois foi desenvolvido para o EE.

Simon
fonte
Você mesmo já testou esse patch EE no CE?
Tyler V.
@TylerV. Não ...
Simon
3
Eu tentei esse patch no EE 1.9.1.1 e posso conformá-lo. Corrige o problema com produtos e categorias com chaves de URL idênticas. Espero que eles implementem isso em uma versão futura em breve.
Giel Berkers
1
Graças Simon, só fui de 1GB a 3MB em um site clientes ... Tinha que truncar-lo antes a cada 6 meses, espero que permanecem pequenas agora :)
Willem wigman
1
Eu apenas tentei isso no meu 1,9 CE e, embora funcione para produtos - as categorias não são exatamente corretas. Se eu tiver uma categoria chamada 'Teste' que fornece o URL '... / test' e, em seguida, criar outro chamado 'Teste', ele deve fornecer o URL '... / test-2', mas fornece apenas o número não o nome: '... / - 2'
odd_duck 26/08
11

Depois de aplicar o patch postado por Simon, você pode usar a seguinte consulta para remover dados indesejados:

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

Em contraste com a consulta de Ashish Hira, isso afeta apenas URLs que têm um número inteiro quando a última parte - esse foi - no meu caso - o motivo da confusão.

Ele tenta não tocar em reescrições válidas, que por exemplo podem ter sido criadas ao atualizar uma chave de URL.

Alex
fonte
6

Eu implementei a resposta aceita com sucesso. Em outra instalação do Magento, eu precisava preservar algumas reescritas personalizadas, então excluí todas as entradas que terminam em - e, em seguida, um número de até 5 dígitos com:

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

Isso funcionou principalmente, mas ainda tenho mais 2 linhas em cada re-índice. Não sei por que. Eu pensei em compartilhar essa experiência.

Andy Myers
fonte
1
Você provavelmente excluiu URLs válidos, mas termina em um número. Você encontraria aqueles com$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('url_key', array('regexp' => '[0-9]$'));
Melvyn
5

A principal mudança que você mencionou parece ser necessária apenas se você tiver produtos sem url_keys, no entanto, o Magento sempre deve criar url_keys para você. Se você tiver algum importador que esteja criando produtos sem url_keys, esse problema surgirá para esses produtos. Tente executar a seguinte consulta para encontrar esses produtos:

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 algum produto retornar dessa consulta, ele não possui uma url_key e será um problema.

Tyler V.
fonte
2
Lembre-se que o padrão entity_type_idde produtos é de 4 e não 10.
Simon
3

Segui a solução aprovada para impedir a reescrita de URL duplicada e depois exportada core_url_rewritecomo arquivo CSV. Conseguiu abrir este CSV e excluir todas as regravações de URL, exceto as criadas manualmente.

Depois truncei a core_url_rewritetabela e importei meu CSV salvo com reescrições de URL criadas manualmente.

Depois de todas as alterações, passou de 940 mil linhas para 32 mil. Enorme melhoria.

JonW
fonte
3

Aqui está o patch (reescrita local) para a Comunidade Magento, para corrigir que https://github.com/biotech/Magento-URL-Rewrite Na verdade, faz o mesmo que o patch EE PATCH_SUPEE-389_EE_1.12.0.2_v2.sh - verifique todas as reescritas e evite a criação de registros duplicados. Funciona bem nos últimos 2 meses na produção CE 1.9, 15k produtos, 4 lojas, re-indexação completa todas as noites após as alterações na importação de produtos a granel.

FireBear
fonte
Até que ponto isso foi testado? Parece que foi publicado apenas uma hora atrás ....
SR_Magento
Isso foi corrigido no 1.9.2.x para que não precisemos mais se preocupar com o inchaço da mesa?
Fiasco Labs
As respostas de link único não são as melhores, mesmo que possam resolver o problema. Por favor, explique um pouco o que seu código faz.
Marius
@FiascoLabs sim, funciona bem em todos 1.9.x CE
FireBear
1
O @FiascoLabs: 1.9.2.x ainda tem esse problema de "reescrever inchaço" e não inclui essa correção, no entanto, como disse o FireBear, o patch do EE funcionará com o CE 1.9.2.x. (não tentei pessoalmente, só queria esclarecer que 1.9.2.2 definitivamente ainda tem nesta edição)
Eric Seastrand
2

Como isso ainda não foi mencionado neste tópico, eu gostaria de compartilhar as novidades interessantes de que esse problema foi corrigido no Magento 1.9.3.9 e posterior. Veja as notas de versão relacionadas :

O Magento não executa mais operações de gravação desnecessárias na tabela core_url_rewrite.

Portanto, todas as correções para esse problema mencionado aqui não são necessárias ao usar uma versão do Magento maior ou igual a 1.9.3.9. Eu ainda sugiro excluir os valores antigos, conforme descrito na resposta de Alex .

Simon
fonte
1

Execute esta consulta

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

Isso certamente ajudará a reduzir o tamanho da core_url_sizetabela, excluindo dados indesejados.

Asish Hira
fonte
Tem certeza de que se trata de dados indesejados? Eu acho que excluído também reescreve os que foram criados ao alterar uma chave de URL!
Alex
Verifique a regex. este meio que não tem identificação válida
Asish Hira 15/03
Mas esses IDs também são criados ao alterar a chave de URL manualmente no back-end. Veja também minha resposta.
21416 Alex
0

Livrar-se de .html

  1. Não use sufixo .html
  2. Definido em .htaccess

    ## Redirect all htmls.
    RewriteRule (.+)\.html$ /$1 [L,R=301]
  3. Apague todos os .htmlredirecionamentos:

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

A resposta oficial deve ser a instalação do SUPEE-389. Simples assim.

Funciona perfeitamente com o Magento CE, pois eles compartilham o mesmo trecho de código nessa área.

Você pode encontrar o arquivo de correção aqui, https://gist.github.com/piotrekkaminski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-sh

Tivemos esse problema e ele gerou milhares de novas linhas após cada re-indexação do URL do catálogo. Agora o problema se foi ... exceto pelo fato de que precisamos limpar o banco de dados.

O script fornecido aqui parece um bom começo, mas não é uma solução perfeita,

php shell / rewrites_doctor.php --remove_rewrites 4

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

Frédéric Gauthier-Boutin
fonte
-2

Há também um módulo dedicado https://github.com/vladsmirnov/url-rewrites , para que você não precise reaplicar o patch após cada atualização do Magento. O módulo contém duas partes: módulo real, para impedir a duplicação a partir de agora e o script do shell para limpar o banco de dados existente.

Vladyslav Smirnov
fonte