Magento core_url_rewrite तालिका अत्यधिक बड़ी


105

मैंने बड़ी मात्रा में रिपोर्ट्स पर गौर किया है कि यह तालिका अपने आप में बेहद अव्यवस्थित हो सकती है, मैं ~ 5000 SKU और ~ 250 श्रेणियों (एकल-स्टोर) और core_url_rewrite600,000 से अधिक लाइनों और 500MB से अधिक परिणाम वाली तालिका के साथ एक साइट चला रहा हूं जो पागल है।

यह साइट के प्रदर्शन को धीमा कर सकता है और परिणाम बहुत भारी डेटाबेस में हो सकता है। मैंने कुछ खुदाई की है और इस बारे में काफी कुछ पोस्ट पाए हैं, विशेष रूप से:

// ये लिंक नए बोर्ड के लागू होने के बाद हटा दिए गए हैं

अब मुझे समझ में आया कि तालिका को छोटा किया जा सकता है और फिर से जोड़ा जा सकता है, लेकिन इससे समस्या का समाधान नहीं होता है, यह समस्या को फिर से होने से रोकता है ।

मैं जो समझता हूं, उस मुद्दे का हिस्सा उत्पाद है जो उत्पाद के नाम के आधार पर एक ही यूआरएल कुंजी है, जिसके परिणामस्वरूप अनुक्रमित लिंक हैं।

एक निश्चित उल्लेख है:

app/code/core/Mage/Catalog/Model/Url.php ऑन लाइन ~ 807:

परिवर्तन:

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

सेवा:

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

लेकिन यह भी इस मुद्दे को पूरी तरह से हल नहीं करता है।

मेरा प्रश्न इस प्रकार है:

यदि आपने इस मुद्दे का अनुभव किया है, तो क्या आप एक प्रभावी, तार्किक और कुशल एल्गोरिथ्म स्थापित करने में कामयाब रहे हैं , जो इस मुद्दे को बार-बार "प्रबंधित" करना शामिल नहीं है, लेकिन वास्तव में एक बार और सभी के लिए मामले को हल करना है?

वास्तव में इस में कुछ अंतर्दृष्टि की सराहना करेंगे ।

BTW: कृपया अपने आप को एक एहसान करें और जांचें कि आपकी तालिका अभी कैसी दिख रही है, आप इस मुद्दे और प्रदर्शन के प्रभाव का अनुभव कर सकते हैं और इसके परिणामस्वरूप यह भी जाने बिना कि - मैं नहीं जानता।

संपादित करें: मैं www.Nexcess.net (एक Magento प्लैटिनम होस्टिंग भागीदार) के संपर्क में रहा हूं और उन्होंने पुष्टि की है कि उनके पास ग्राहकों का अनुरोध है कि उनकी core_url_rewriteतालिका को बहुत भारी होने के परिणामस्वरूप ट्रंकेशन की आवश्यकता है।

मेरी एक बड़ी चिंता एसईओ प्रभाव है कि यह हो सकता है, यही वजह है कि मैं इस मुद्दे को फिर से उभरने से रोकने के लिए एक समाधान के रूप में चाहूंगा।

अपडेट: नेक्सस ने उल्लेख किया कि तालिका के भीतर डुप्लिकेट उत्पादों के साथ यह वास्तव में एसईओ को नुकसान पहुंचा सकता है।


वाह, यह एक बहुत बड़ी मेज है। मैंने अपने स्वयं के (200 उत्पादों) की जाँच की और इसमें केवल ~ 800 पंक्तियाँ हैं, लेकिन हमारे पास उत्पाद नाम / URL को डुप्लिकेट करने में कोई समस्या नहीं है। एक संदर्भ बिंदु के रूप में, हमारे पास दृश्यमान उत्पाद के बारे में 6.6 पंक्तियाँ हैं। मैं इसे एक भयानक यथार्थवादी तुलना नहीं मानता हूँ, लेकिन उस दर पर, 5,000 उत्पादों के साथ हमारे पास केवल ~ 30,000 पंक्तियाँ होंगी। मैं एक समाधान के लिए आपकी आवश्यकता को अच्छी तरह से समझ सकता हूं, और इस सवाल को देखूंगा क्योंकि मैं एक बहुत बड़ी साइट को लागू करने वाला हूं।
Pete855217

@ Pete855217: यह सवाल आपको दिलचस्प लगता है, भले ही आपने इसे उकेरा नहीं था।
मोहम्मद फैसल

1
EE1.12 में एक बग था, जो प्रत्येक बचत पर फिर से लिखे जाने का कारण बनता है। यह संभव है कि आपके 1.7 के संस्करण में यह समान बग हो। जैसा कि मुझे याद है 1.12 के लिए पैच भी 1.7 पर काम करता था
ब्रेंटवेटर्सन

1
बहुत ही उपयोगी लेख! हमारे पास 130,000 सक्रिय उत्पाद हैं, और 25,000 विकलांग उत्पाद हैं, हमारे core_url_rewrite_table में 2744023 रिकॉर्ड हैं ..... इसलिए इस सप्ताह हमें यह याद दिलाने के लिए काम करना है !! यह लेख एक अच्छा प्रारंभिक बिंदु लगता है।
MagentoMac

Magento में अपने कस्टम रीराइट को हटाने के लिए कैसे नहीं शामिल करने के लिए पोस्ट को संपादित किया।
espradley

जवाबों:


76

मैं इस मुद्दे को इस प्रकार स्थिर करने में कामयाब रहा:

चरण 1: कैटलॉग URL मॉडल को फिर से लिखें (अपने स्वयं के मॉड्यूल का उपयोग करके: कैसे करें )

नोट: यदि आप एक पुनर्लेखन का उपयोग किए बिना कोर फ़ाइल को अधिलेखित करते हैं तो यह भविष्य के उन्नयन के लिए अक्षम Magento के आपके उदाहरण को प्रस्तुत करेगा।

जेहनी के समाधान के अनुसार MagentoCommerce बोर्डों(अब नए बोर्ड के साथ सक्रिय नहीं है), app/code/core/Mage/Catalog/Model/Url.php[लगभग लाइन new new० Mage_Catalog_Model_Url::getProductRequestPath()]

से:

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

सेवा:

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

चरण 2: काटें

core_url_rewriteटेबल को काटें

चरण 3: Reindex और Flush Caches

कोर URL रिवाइट्स पर फिर से अनुक्रमण प्रक्रिया शुरू करें। इसके बाद, आप Magento कैश और स्टोरेज कैश फ्लश करना चाहते हैं।

SystemCache ManagementFlush Magento Cache

SystemCache ManagementFlush Cache Storage

वोइला, तुम सब सेट हो। यदि आप अनुक्रमणिका को फिर से चलाते हैं तो आपको पता चलेगा, तालिका को आकार में स्थिर रहना चाहिए (जब तक कि आपने अधिक उत्पाद इनबेटइन नहीं जोड़े हैं या यदि आपके पास डुप्लिकेट श्रेणी के नाम हैं)।


5
महान, मेरी core_url_rewrite तालिका 3.2 GB थी जो अब 36.8 MB है: D by muppet
Fabian Blechschmidt

मुझे एक ऐसी ही समस्या है। Magento URL फिर से लिखना Url में यादृच्छिक संख्या। कृपया Google वेब मास्टर टूल से संलग्न स्क्रीनशॉट देखें। जैसा कि आप उत्पाद देख सकते हैं "बेज कढ़ाई शादी की साड़ी" में नौ अलग-अलग URL हैं, लेकिन यह केवल एक उत्पाद है और केवल एक URL को 878 के साथ समाप्त होने की ओर इशारा करता है। वास्तविक URL कुंजी में अंत में एक यादृच्छिक संख्या नहीं है (स्क्रीनशॉट संलग्न है) )। मेरा स्टोर काफी नया है और core_url_rewrite का आकार उतना बड़ा नहीं है। इसलिए मुझे यकीन नहीं है कि मुझे आगे बढ़ना चाहिए और चरण 1 और 2 या केवल चरण 1 करना चाहिए। यदि मैं चरण 2 करता हूं तो मैं अपने कस्टम राइटर्स खो दूंगा।
जोया

मैं 1.9.1 चला रहा हूँ और यहाँ स्क्रीनशॉट यूआरएल याद कर रहे हैं। monosnap.com/image/duL0f64WWlACtlt9kcn04BWqY3L5Xl monosnap.com/image/osFk8kYNAr00XLdFTGTIOaydaW5yqS
जोया

2
मैं मौजूदा तालिका को पहले निर्यात करूंगा। फिर मैं चरण 1, 2 और 3 के साथ आगे बढ़ूंगा। core_url_rewriteअब तालिका देखें और रिकॉर्ड की संख्या को नोट करें। चरण 3 को फिर से चलाएँ (पुन: अनुक्रमणिका), और core_url_rewriteतालिका पर अपना दृष्टिकोण ताज़ा करें । यदि संख्या समान है, तो आपने सफलतापूर्वक हल कर लिया है। फिर आगे बढ़ें और अपने कस्टम पुनर्लेखन को मैन्युअल रूप से मर्ज करें। शुभकामनाएं।
मूस

2
यह फिक्स केवल उत्पादों के लिए काम करता है, समान URL कुंजियों वाली श्रेणियों के लिए नहीं। बेहतर समाधान (पैच फाइल के साथ) के लिए @Simon का उत्तर देखें
Giel Berkers

45

जबकि मुझे आशा है कि यहाँ कोई व्यक्ति एक उत्तर के साथ आता है, मुझे नहीं पता कि आप एक खोज लेंगे। यह तालिका बहुत सारे अलग-अलग कारणों से भारी हो जाती है। Magento के पहले (और संभवतः वर्तमान) संस्करणों में कीड़े एक हैं। इस तालिका में एक और तर्क है जो URL कुंजी मान में परिवर्तन को ट्रैक करने का प्रयास करता है ताकि 301/302 पुनर्लेखन पुराने उत्पादों के लिए सेटअप हो। इस वजह से, और चीजों को उलझाकर, टेबल को काट-छाँट कर पुनर्जीवित करने से मौजूदा URL रीराइट हो सकते हैं, और इससे आपके खोज इंजन लिस्टिंग पर अज्ञात प्रभाव पड़ेगा (बुरा नहीं होना चाहिए, केवल भविष्यवाणी करना कठिन है)।

जो पूछते हैं उन ग्राहकों को मेरी सामान्य सलाह है

  1. यदि आप अपने यूआरएल / एसईओ स्थिति पर एक अच्छा संभाल नहीं है, तो विशाल बढ़ती तालिका को छोड़ दें

  2. जब तक तालिका का आकार एक समस्या नहीं हो रहा है (उदाहरण के लिए साइट मानचित्र बनाना)। जब ऐसा होता है, तो अपने URL / SEO स्थिति पर एक हैंडल प्राप्त करें।

  3. एक बार जब आप अपने URL / SEO की स्थिति को संभाल लेंगे, तो टेबल का बैकअप ले लें, फिर टेबल को छोटा करें और पुन: बनाएँ। ट्रंकिंग के कारण किसी भी URL / SEO समस्या का समाधान करें।

  4. स्वचालित चरण 3

Magento कोड स्तर पर इसे ठीक करने की कोशिश सराहनीय है, लेकिन आप ऊपर की तरफ तैर रहे होंगे। कभी-कभी यह स्वीकार करना बेहतर होता है कि "यह सिर्फ मैगेंटो रहा है मैगेंटो", और बाहरी प्रक्रिया के साथ समस्या को हल करने के लिए।


सलाह के लिए धन्यवाद, यह स्थिति के बारे में अफ़सोस की बात है, लेकिन मुझे लगता है कि यह एक बाहरी प्रक्रिया द्वारा नियंत्रित किया जाना है जैसा कि आपने उल्लेख किया है, उरग।
मॉस

2
यह विशाल तालिका पहले से ही एसईओ समस्याओं का कारण बन सकती है, क्योंकि किसी दिए गए उत्पाद के लिए विहित लगातार बदल जाएगा। यदि आपके पास मोबाइल और डेस्कटॉप के लिए अलग स्टोरव्यू है, तो यह और भी बुरा है क्योंकि उनके URL अलग-अलग होंगे।
मेल्विन

मेरे लिए थोड़ा निराशाजनक जवाब ...
फ्रा

@ एलन स्टॉर्म, आप इस उत्तर को पोस्ट करने के बाद मूस द्वारा पोस्ट किए गए उत्तर के बारे में कैसा महसूस करते हैं? क्या आप एक ही जोखिम देखते हैं?
हंस

24

मैं इस url rewrite indexer बग के लिए एक फिक्स जोड़ना चाहूंगा, जिसे मार्च 2013 में Bugathon में विकसित किया गया है और जिसे बाद में और बेहतर बनाया गया है। इसे इस मुद्दे को हल करना चाहिए। एक संदर्भ के रूप में, यहाँ लिंक से पैच फ़ाइल है:

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


इसके अतिरिक्त, मैं EE पैच जोड़ना चाहूंगा PATCH_SUPEE-389_EE_1.12.0.2_v2.sh, जो अब 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
             );
         }

यदि आप सीई के साथ इस पैच का उपयोग करना चाहते हैं, तो इसे ठीक से परीक्षण करना सुनिश्चित करें, क्योंकि यह ईई के लिए विकसित किया गया है।


क्या आपने स्वयं सीई पर इस ईई पैच का परीक्षण किया है?
टायलर वी।

@TylerV। नहीं ...
शमौन

3
मैंने EE 1.9.1.1 में इस पैच की कोशिश की है और यह काम कर सकता है। यह समान url कुंजियों के साथ उत्पादों और श्रेणियों के साथ समस्या को ठीक करता है। आशा करते हैं कि वे इसे भविष्य के रिलीज में जल्द ही लागू करेंगे।
गेल बर्कर्स

1
धन्यवाद साइमन, बस एक ग्राहक की वेबसाइट पर 1GB से 3MB तक चला गया ... हर 6 महीने से पहले इसे छोटा करना था, आशा है कि अब यह छोटा रहेगा :)
विल्म विगमैन

1
मैंने सिर्फ अपने 1.9 सीई पर यह कोशिश की है और हालांकि यह उत्पादों के लिए काम करता है - श्रेणियां काफी सही नहीं हैं। अगर मेरे पास 'टेस्ट' नामक एक श्रेणी है, जो url देता है ... / परीक्षण 'और फिर मैं एक और परीक्षण बनाता हूं जिसे' Test 'कहा जाता है, उसे url देना चाहिए ...' / test-2 ' नाम: '... / - 2'
odd_duck

11

साइमन द्वारा पोस्ट किए गए पैच को लागू करने के बाद, आप जंक डेटा को हटाने के लिए निम्नलिखित क्वेरी का उपयोग कर सकते हैं:

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

आशीष हीरा की क्वेरी के विपरीत, यह केवल उन URL को प्रभावित करता है जिनके पास पिछले भाग के रूप में एक पूर्णांक संख्या है - यह मेरे मामले में था - अव्यवस्था का कारण।

यह वैध पुनर्लेखन को नहीं छूने की कोशिश करता है, जो उदाहरण के लिए URL कुंजी को अपडेट करते समय बनाया गया हो सकता है।


6

मैंने सफलता के साथ स्वीकृत उत्तर को लागू किया है। एक अन्य मैगनेटो पर मुझे कुछ कस्टम पुनर्लेखनों को संरक्षित करने की आवश्यकता थी इसलिए मैंने सभी प्रविष्टियों को हटा दिया जो कि समाप्त हो गईं - और फिर 5 अंकों तक की संख्या के साथ:

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

यह ज्यादातर काम करता है लेकिन मुझे अभी भी प्रत्येक री-इंडेक्स पर 2 और पंक्तियाँ मिलती हैं। यकीन नहीं है कि क्यों। मुझे लगा कि मैं इस अनुभव को साझा करूंगा।


1
आपने संभवतः मान्य URL हटा दिए हैं, फिर भी एक संख्या में समाप्त हो रहे हैं। आप उन लोगों के साथ मिलेंगे$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('url_key', array('regexp' => '[0-9]$'));
मेल्विन

5

यदि आपने केवल url_keys के बिना उत्पाद बनाए हैं, तो आपके द्वारा उल्लिखित मुख्य परिवर्तन की आवश्यकता प्रतीत होती है, हालांकि Magento को हमेशा आपके लिए url_keys बनाने चाहिए। यदि आपके पास कुछ आयातक हैं जो url_keys के बिना उत्पाद बना रहे हैं, तो यह समस्या उन उत्पादों के लिए फसल होगी। ऐसे उत्पादों को खोजने के लिए निम्नलिखित क्वेरी चलाने का प्रयास करें:

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

यदि कोई भी उत्पाद उस क्वेरी से लौटता है, तो उसके पास एक url_key नहीं है और एक समस्या होने वाली है।


2
ध्यान रखें कि entity_type_idउत्पादों के लिए डिफ़ॉल्ट 4 है और 10. नहीं
सिमोन

3

मैंने डुप्लिकेट URL पुनर्लेखन को रोकने के लिए अनुमोदित समाधान का पालन किया, फिर core_url_rewriteCSV फ़ाइल के रूप में निर्यात किया गया। इस CSV को खोलने और सभी लेकिन मैन्युअल रूप से बनाए गए URL को फिर से लिखने में सक्षम था।

फिर मैंने core_url_rewriteटेबल को छोटा कर दिया , और अपने सहेजे गए CSV को मैन्युअल रूप से बनाए गए URL रीराइट के साथ आयात किया।

सभी परिवर्तनों के बाद, 940K पंक्तियों से 32K तक चला गया। भारी सुधार।


3

यहाँ फिक्स के लिए Magento के समुदाय के लिए पैच (स्थानीय पुनर्लेखन) है कि https://github.com/biotech/Magento-URL-Rewrite वास्तव में ईई पैच PATCH_SUPEE-389_EE_.12.0.2_v2.sh - हर पुन: लिखने वाले की जाँच करें। डुप्लिकेट रिकॉर्ड के निर्माण से बचें। उत्पादन सीई 1.9, 15k उत्पादों, 4 दुकानों, थोक उत्पाद आयात परिवर्तन के बाद हर रात पूर्ण पुन: अनुक्रमणिका पर पिछले 2 महीनों में अच्छी तरह से काम करता है।


यह कितनी अच्छी तरह से परीक्षण किया गया है? ऐसा लग रहा है कि यह एक घंटे पहले ही पोस्ट किया गया था ....
SR_Magento

क्या यह 1.9.2.x में तय किया गया है, इसलिए हमें टेबल ब्लोट के बारे में चिंता करने की आवश्यकता नहीं है?
फियास्को लैब्स

एकल लिंक उत्तर सबसे अच्छा जवाब नहीं हैं भले ही वे समस्या को हल कर सकते हैं। कृपया थोड़ा स्पष्ट करें कि आपका कोड क्या करता है।
मेरियस

@FiascoLabs हाँ, सभी सीई 1.9.x पर अच्छा काम करता है
फायरबियर

1
@FiascoLabs: 1.9.2.x में अभी भी इस "ब्लोट" को फिर से लिखना है, और इस फिक्स को शामिल नहीं करता है, हालांकि, फायरबियर ने कहा, ईई पैच सीई 1.9.2.x के साथ काम करेगा। (व्यक्तिगत रूप से कोशिश नहीं की है; केवल स्पष्ट करना चाहता था कि 1.9.2.2 निश्चित रूप से अभी भी यह मुद्दा है)
एरिक सस्टैंडैंड

2

चूंकि इस धागे में अभी तक इसका उल्लेख नहीं है, इसलिए मैं शांत समाचार साझा करना चाहता था कि यह मुद्दा मैगेंटो 1.9.3.9 और बाद में तय किया गया है। संबंधित रिलीज़ नोट देखें :

Magento अब core_url_rewrite टेबल पर अनावश्यक लेखन संचालन नहीं करता है।

इस प्रकार इस समस्या के लिए यहां दिए गए सभी सुधार 1.9.3.9 से अधिक या बराबर के Magento के संस्करण का उपयोग करते समय आवश्यक नहीं हैं। मैं अभी भी एलेक्स जवाब में वर्णित पुराने मूल्यों को हटाने का सुझाव देता हूं ।


1

इस क्वेरी को चलाएं

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

यह निश्चित रूप से आपको core_url_sizeजंक डेटा हटाकर तालिका के आकार को कम करने में मदद करेगा ।


क्या आपको यकीन है कि यह जंक डेटा है? मुझे लगता है कि इसे हटा दिया गया है वह भी फिर से लिखता है जो URL कुंजी बदलते समय बनाया गया था!
एलेक्स

Regex की जाँच करें। इसका मतलब यह है कि वैध आईडी नहीं है
आशीष हीरा

लेकिन बैकएंड में URL कुंजी को मैन्युअल रूप से बदलते समय उन आईडी को भी बनाया जाता है। मेरा जवाब भी देखिए।
एलेक्स

0

इससे छुटकारा पाएं .html

  1. प्रत्यय का प्रयोग न करें .html
  2. .Htaccess में सेट करें

    ## Redirect all htmls.
    RewriteRule (.+)\.html$ /$1 [L,R=301]
    
  3. सभी .htmlरीडायरेक्ट्स मिटा दें :

    DELETE FROM core_url_rewrite WHERE request_path LIKE '%.html'

0

SUPEE-389 को स्थापित करने के लिए आधिकारिक उत्तर होना चाहिए। इतना ही आसान।

यह पूरी तरह से Magento CE के साथ काम करता है क्योंकि वे इस क्षेत्र में कोड का एक ही टुकड़ा साझा करते हैं।

आप यहां पैच फ़ाइल पा सकते हैं, https://gist.github.com/piotrekk विटामिनki/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2- sh

हमारे पास यह समस्या थी और इसने प्रत्येक कैटलॉग URL री-इंडेक्स के बाद हजारों नई पंक्तियों को उत्पन्न किया। अब समस्या दूर हो गई है ... इस तथ्य को छोड़कर कि हमें डीबी को साफ करना होगा।

यहाँ प्रदान की गई स्क्रिप्ट एक अच्छी शुरुआत की तरह लगती है लेकिन यह एक सही समाधान नहीं है,

php खोल / rewrites_doctor.php --remove_rewrites 4

Https://www.atwix.com/magento/duplicated-product-url-keys-in-community-nition/ देखें


-2

एक समर्पित मॉड्यूल https://github.com/vladsmirnov/url-rewrites भी है , इसलिए आपको प्रत्येक Magento के अपडेट के बाद पैच को फिर से लागू करने की आवश्यकता नहीं है। मॉड्यूल में दो भाग होते हैं: वास्तविक मॉड्यूल, मौजूदा डेटाबेस को साफ करने के लिए अब से दोहराव और शेल स्क्रिप्ट को रोकने के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.