วีโอไอพี core_url_rewrite ตารางใหญ่เกินไป


105

ฉันสังเกตเห็นรายงานจำนวนมากว่าตารางนี้สามารถกลายเป็นความยุ่งเหยิงอย่างมากฉันใช้งานไซต์ที่มี 5000 SKUs และ ~ 250 หมวดหมู่ (ร้านค้าเดียว) และcore_url_rewriteตารางผลลัพธ์มากกว่า 600,000 บรรทัดและมากกว่า 500MB ซึ่ง เป็นบ้า

สิ่งนี้จะทำให้ประสิทธิภาพของไซต์ช้าลงและทำให้ฐานข้อมูลมีขนาดใหญ่มาก ฉันขุดและพบโพสต์ค่อนข้างน้อยเกี่ยวกับเรื่องนี้ที่สะดุดตาที่สุด:

// ลิงก์เหล่านี้ถูกลบตั้งแต่การติดตั้งบอร์ดใหม่

ตอนนี้ฉันเข้าใจแล้วว่าตารางสามารถถูกตัดทอนและทำดัชนีใหม่ได้ แต่วิธีนี้ไม่สามารถแก้ปัญหาได้

จากสิ่งที่ฉันเข้าใจส่วนหนึ่งของปัญหาคือผลิตภัณฑ์ที่มี url key เดียวกันตามชื่อของผลิตภัณฑ์จึงทำให้มีการทำดัชนีลิงก์

การแก้ไขที่กล่าวถึงคือ:

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ตารางของพวกเขาต้องการการตัดเนื่องจากขนาดใหญ่เกินไป

ความกังวลใหญ่ของฉันคือผลกระทบ SEO ที่อาจเกิดขึ้นซึ่งเป็นสาเหตุที่ฉันต้องการทางออกเมื่อเทียบกับการผัดวันประกันพรุ่งปัญหาที่เกิดขึ้นอีกครั้ง

อัปเดต: ไม่จำเป็นกล่าวถึงว่าด้วยผลิตภัณฑ์ซ้ำภายในตารางอาจทำให้ SEO เสียหายได้


ว้าวนั่นเป็นตารางที่ใหญ่มาก ฉันตรวจสอบของตัวเอง (200 ผลิตภัณฑ์) และมันมีเพียง ~ 800 แถว แต่เราไม่มีปัญหาในการคัดลอกชื่อผลิตภัณฑ์ / URL ในฐานะที่เป็นจุดอ้างอิงเรามีประมาณ 6.6 แถวต่อผลิตภัณฑ์ที่มองเห็นได้ ฉันจะยอมรับว่านี่ไม่ใช่การเปรียบเทียบที่สมจริงมาก แต่ในอัตรานั้นด้วยผลิตภัณฑ์ 5,000 รายการเรามีเพียงประมาณ 30,000 แถวหรือมากกว่านั้น ฉันเข้าใจความต้องการโซลูชันของคุณได้ดีและจะคอยดูคำถามนี้เมื่อฉันกำลังใช้ไซต์ที่ใหญ่กว่ามาก
Pete855217

@ Pete855217: คำถามนี้ฟังดูน่าสนใจแม้ว่าคุณจะไม่ได้ลงคะแนน
Mohammad Faisal

1
มีข้อบกพร่องใน EE1.12 ซึ่งทำให้การเขียนซ้ำถูกสร้างขึ้นใหม่ในการบันทึกแต่ละครั้ง เป็นไปได้ว่าเวอร์ชั่น 1.7 ของคุณมีบั๊กเหมือนกัน ในขณะที่ฉันจำได้ว่าแพทช์สำหรับ 1.12 ยังทำงานกับ 1.7
brentwpeterson

1
บทความที่มีประโยชน์มาก! เรามีผลิตภัณฑ์ที่ใช้งานอยู่ 130,000 รายการและผลิตภัณฑ์ที่ปิดใช้งานแล้ว 25,000 รายการ core_url_rewrite_table ของเรามีระเบียน 2744023 รายการในนั้น ..... ดังนั้นสัปดาห์นี้เราจะได้ทำการแก้ไขปัญหานี้ !! บทความนี้ดูเหมือนจะเป็นจุดเริ่มต้นที่ดี
MagentoMac

แก้ไขโพสต์เพื่อรวมถึงวิธีที่จะไม่ลบการเขียนที่กำหนดเองของคุณใน Magento
espradley

คำตอบ:


76

ฉันพยายามที่จะทำให้เกิดปัญหาดังต่อไปนี้:

ขั้นตอนที่ 1:เขียนโมเดลแคตตาล็อก URL ใหม่ (ใช้โมดูลของคุณเอง: วิธีการ )

หมายเหตุ: หากคุณเขียนทับไฟล์คอร์โดยไม่ต้องเขียนใหม่สิ่งนี้จะทำให้ Magento ของคุณไม่สามารถอัพเกรดได้ในอนาคต

ตามวิธีของ Jahnni กระดาน MagentoCommerce(ไม่ได้ใช้งานกับบอร์ดใหม่อีกต่อไป, app/code/core/Mage/Catalog/Model/Url.php[ประมาณ 807 บรรทัด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:สร้างดัชนีใหม่และล้างแคช

เริ่มกระบวนการจัดทำดัชนีใหม่บน Core URL Rewrites หลังจากนั้นคุณจะต้องล้างแคช Magento และที่เก็บข้อมูล

System→การCache Management→การFlush Magento Cache

System→การCache Management→การFlush Cache Storage

Voila คุณพร้อมแล้ว คุณจะสังเกตเห็นว่าคุณเรียกใช้ตัวสร้างดัชนีอีกครั้งตารางควรมีขนาดคงที่ (เว้นแต่คุณเพิ่มผลิตภัณฑ์เพิ่มเติมในระหว่างหรือถ้าคุณมีชื่อหมวดหมู่ที่ซ้ำกัน)


5
เยี่ยมมากตาราง core_url_rewrite ของฉันคือ 3.2 GB ตอนนี้คือ 36.8 MB: D โดย
muppet

ฉันมีปัญหาที่คล้ายกัน Magento URL เขียนซ้ำผนวกหมายเลขสุ่มใน Url โปรดดูภาพหน้าจอที่แนบมาจากเครื่องมือเว็บมาสเตอร์ของ Google ในขณะที่คุณสามารถดูผลิตภัณฑ์ "Beige Embroidered Wedding Saree" มี URL ที่แตกต่างกันเก้ารายการ แต่มันเป็นเพียงผลิตภัณฑ์เดียวและชี้ไปที่ URL เดียวที่ลงท้ายด้วย 878 คีย์ URL ที่แท้จริงไม่ได้มีหมายเลขสุ่มในตอนท้าย (แนบภาพหน้าจอ ) ร้านค้าของฉันค่อนข้างใหม่และขนาดของ core_url_rewrite นั้นไม่ใหญ่มาก ดังนั้นฉันไม่แน่ใจว่าฉันควรไปข้างหน้าและทำตามขั้นตอนที่ 1 & 2 หรือเฉพาะขั้นตอนที่ 1 ถ้าฉันทำขั้นตอนที่ 2 ฉันจะสูญเสียการเขียนที่กำหนดเองของฉัน
Zoya

ฉันใช้ 1.9.1 และนี่คือ URL หน้าจอที่ไม่ได้รับ monosnap.com/image/duL0f64WWlACtlt9kcn04BWqY3L5Xl monosnap.com/image/osFk8kYNAr00XLdFTGTIOaydaW5yqS
Zoya

2
ฉันจะส่งออกตารางที่มีอยู่ก่อน จากนั้นฉันจะดำเนินการตามขั้นตอนที่ 1, 2 และ 3 ดูที่core_url_rewriteตารางตอนนี้และจดบันทึกจำนวน เรียกใช้ขั้นตอนที่ 3 อีกครั้ง (การจัดทำดัชนีใหม่) และรีเฟรชมุมมองของคุณบนcore_url_rewriteตาราง หากหมายเลขเดียวกันแสดงว่าคุณได้แก้ไขเรียบร้อยแล้ว จากนั้นดำเนินการต่อและรวมการเขียนที่กำหนดเองของคุณเอง ทั้งหมดที่ดีที่สุด
Moose

2
การแก้ไขนี้ใช้ได้กับผลิตภัณฑ์เท่านั้นไม่ใช่สำหรับหมวดหมู่ที่มีคีย์ URL ที่เหมือนกัน ดูคำตอบของ @Simon เพื่อหาทางออกที่ดีกว่า (พร้อมไฟล์แพทช์)
Giel Berkers

45

ในขณะที่ฉันหวังว่าจะมีบางคนมาที่นี่พร้อมคำตอบ แต่ฉันไม่รู้ว่าคุณจะเจอใคร ตารางนี้มีขนาดใหญ่ด้วยเหตุผลที่แตกต่างกันมาก ข้อบกพร่องใน Magento รุ่นก่อนหน้า (และอาจเป็นปัจจุบัน) เป็นหนึ่ง อีกประการหนึ่งคือมีตรรกะในตารางนี้ที่พยายามติดตามการเปลี่ยนแปลงค่าของคีย์ URL เพื่อให้การเขียนซ้ำ 301/302 ถูกตั้งค่าสำหรับผลิตภัณฑ์เก่า ด้วยเหตุนี้และสิ่งที่ซับซ้อนการตัดทอนตารางและการสร้างใหม่อาจทำให้การเขียน URL ซ้ำหายไปและสิ่งนี้จะมีผลกระทบที่ไม่รู้จักในรายชื่อเครื่องมือค้นหาของคุณ

คำแนะนำทั่วไปของฉันให้กับลูกค้าที่ถามคือ

  1. ออกจากตารางการเติบโตที่ยิ่งใหญ่เช่นเดียวกับถ้าคุณไม่มีความเข้าใจที่ดีเกี่ยวกับสถานการณ์ URL / SEO ของคุณ

  2. จนกระทั่งขนาดของตารางเริ่มเป็นปัญหา (การสร้างแผนที่เว็บไซต์เป็นต้น) เมื่อสิ่งนั้นเกิดขึ้นให้จัดการกับสถานการณ์ URL / SEO ของคุณ

  3. เมื่อคุณมีจัดการกับสถานการณ์ URL / SEO ของคุณให้สำรองข้อมูลตารางจากนั้นตัดทอนตารางและสร้างใหม่ แก้ไขปัญหา URL / SEO ใด ๆ ที่เกิดจากการตัดทอน

  4. อัตโนมัติขั้นตอนที่ 3

การพยายามแก้ไขปัญหานี้ในระดับรหัสวีโอไอพีนั้นเป็นสิ่งที่น่าชื่นชม แต่คุณจะว่ายทวนน้ำ บางครั้งจะดีกว่าที่จะยอมรับว่า "นั่นเป็นเพียงวีโอไอพีที่เป็นวีโอไอพี" และเพื่อแก้ปัญหาด้วยและกระบวนการภายนอก


ขอบคุณสำหรับคำแนะนำมันน่าเสียดายที่สถานการณ์ แต่ฉันคิดว่ามันจะต้องได้รับการจัดการโดยกระบวนการภายนอกตามที่คุณพูดถึง
Moose

2
ตารางยักษ์นี้อาจทำให้เกิดปัญหา SEO เนื่องจากมาตรฐานของผลิตภัณฑ์จะเปลี่ยนไปอย่างต่อเนื่อง หากคุณมีมุมมองหน้าร้านแยกต่างหากสำหรับอุปกรณ์พกพาและเดสก์ท็อปมันยิ่งแย่ลงไปกว่านั้นเนื่องจาก URL จะแตกต่างกัน
Melvyn

บิตคำตอบที่น่าผิดหวังกับผม ...
Fra

@Alan Storm คุณรู้สึกอย่างไรกับคำตอบที่โพสต์โดย Moose หลังจากที่คุณโพสต์คำตอบนี้? คุณเห็นความเสี่ยงแบบเดียวกันหรือไม่?
Goose

24

ฉันต้องการเพิ่มการแก้ไขข้อผิดพลาดของตัวเขียนดัชนี urlซึ่งได้รับการพัฒนาที่ bugathon ในเดือนมีนาคม 2013 และที่ได้รับการปรับปรุงเพิ่มเติมในภายหลัง ควรแก้ไขปัญหานี้ เป็นการอ้างอิงนี่คือไฟล์แพทช์จากลิงค์:

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

หากคุณต้องการใช้โปรแกรมปรับปรุงนี้กับ CE ตรวจสอบให้แน่ใจว่าได้ทดสอบอย่างถูกต้องเพราะได้รับการพัฒนาสำหรับ EE


คุณได้ทำการทดสอบโปรแกรมแก้ไข EE ตัวนี้ใน CE หรือไม่?
Tyler V.

@TylerV ไม่ ...
Simon

3
ฉันได้ลองใช้ตัวแก้ไขนี้ใน EE 1.9.1.1 แล้วและสามารถใช้งานได้ จะแก้ไขปัญหาเกี่ยวกับผลิตภัณฑ์และหมวดหมู่ด้วยปุ่ม URL ที่เหมือนกัน หวังว่าพวกเขาจะใช้สิ่งนี้ในอนาคตอันใกล้
Giel Berkers

1
ขอบคุณ Simon เพิ่งไปจาก 1GB เป็น 3MB ในเว็บไซต์ของลูกค้าหนึ่งคน ... ต้องตัดทอนทุก ๆ 6 เดือนหวังว่ามันจะยังเล็กอยู่ในตอนนี้ :)
วิลเล็มวิกแมน

1
ฉันเพิ่งลองทำสิ่งนี้กับ 1.9 CE ของฉันและถึงแม้ว่ามันจะใช้ได้กับผลิตภัณฑ์ - หมวดหมู่ไม่ถูกต้องนัก หากฉันมีหมวดหมู่ที่เรียกว่า 'ทดสอบ' ซึ่งให้ URL '... / ทดสอบ' และจากนั้นฉันสร้างอีกประเภทหนึ่งที่เรียกว่า 'ทดสอบ' มันควรให้ URL '... / test-2' แต่ให้ตัวเลขแทนเท่านั้น ชื่อ: '... / - 2'
odd_duck

11

หลังจากคุณใช้โปรแกรมแก้ไขที่โพสต์โดย Simon คุณสามารถใช้แบบสอบถามต่อไปนี้เพื่อลบข้อมูลขยะ:

DELETE FROM core_url_rewrite
WHERE is_system <> 1 AND id_path REGEXP "^[0-9]+_[0-9]+$" AND
      (request_path REGEXP ".*-[0-9]*\.html" 
          OR target_path = request_path);

ตรงกันข้ามกับข้อความค้นหาของ Ashish Hira สิ่งนี้มีผลเฉพาะกับ 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]$'));
Melvyn

5

การเปลี่ยนแปลงหลักที่คุณกล่าวถึงดูเหมือนจะจำเป็นเท่านั้นหากคุณมีผลิตภัณฑ์ที่ไม่มี url_keys แต่ Magento ควรสร้าง url_key ให้คุณเสมอ หากคุณมีผู้นำเข้าซึ่งกำลังสร้างผลิตภัณฑ์โดยไม่มี 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
Simon

3

ฉันติดตามโซลูชันที่ได้รับการอนุมัติเพื่อป้องกันการเขียน URL ซ้ำแล้วส่งออกcore_url_rewriteเป็นไฟล์ CSV สามารถเปิด CSV นี้และลบทั้งหมดยกเว้น URL ที่สร้างขึ้นใหม่ด้วยตนเอง

จากนั้นฉันตัดทอนcore_url_rewriteตารางและนำเข้า CSV ที่บันทึกไว้ของฉันด้วยการเขียน URL ที่สร้างขึ้นใหม่ด้วยตนเอง

หลังจากการเปลี่ยนแปลงทั้งหมดเปลี่ยนจากแถว 940K เป็น 32K การปรับปรุงอย่างมาก


3

นี่คือ patch (local rewrite) สำหรับ Magento Community สำหรับการแก้ไขที่https://github.com/biotech/Magento-URL-Rewriteในความเป็นจริงแล้วเหมือนกับ EE patch PATCH_SUPEE-389_EE_1.12.0.2_v2.sh - ตรวจสอบทุก ๆ การเขียนและ หลีกเลี่ยงการสร้างระเบียนที่ซ้ำกัน ใช้งานได้ดีในช่วง 2 เดือนที่ผ่านมาในการผลิต CE 1.9, ผลิตภัณฑ์ 15k, 4 ร้านค้า, ดัชนีเต็มรูปแบบใหม่ทุกคืนหลังจากการเปลี่ยนแปลงการนำเข้าผลิตภัณฑ์จำนวนมาก


สิ่งนี้ได้รับการทดสอบอย่างทั่วถึงหรือไม่ ดูเหมือนว่าจะโพสต์เมื่อชั่วโมงที่แล้ว ....
SR_Magento

สิ่งนี้ได้รับการแก้ไขแล้วใน 1.9.2.x ดังนั้นเราจึงไม่ต้องกังวลเกี่ยวกับการขยายตัวของตารางอีกต่อไป?
Fiasco Labs

คำตอบลิงก์เดียวไม่ใช่คำตอบที่ดีที่สุดแม้ว่าพวกเขาอาจแก้ปัญหาได้ โปรดอธิบายสิ่งที่รหัสของคุณทำ
Marius

@FiascoLabs ใช่ใช้งานได้ดีกับ CE
1.9.x

1
@FiascoLabs: 1.9.2.x ยังคงมีปัญหา "เขียนซ้ำ bloat" นี้และไม่รวมการแก้ไขนี้อย่างไรก็ตามอย่าง FireBear กล่าวว่า EE patch จะทำงานร่วมกับ CE 1.9.2.x (ยังไม่ได้ลองเป็นการส่วนตัวเพียงต้องการชี้แจงว่า 1.9.2.2 ยังมีปัญหานี้อยู่อย่างแน่นอน)
Eric Seastrand

2

ตั้งแต่นี้ยังไม่ได้กล่าวถึงในหัวข้อนี้ฉันต้องการแบ่งปันข่าวเด็ดว่าปัญหานี้ได้รับการแก้ไขใน Magento 1.9.3.9 และใหม่กว่า ดูบันทึกประจำรุ่นที่เกี่ยวข้อง :

วีโอไอพีไม่ทำการเขียนที่ไม่จำเป็นในตาราง core_url_rewrite อีกต่อไป

ดังนั้นการแก้ไขทั้งหมดสำหรับปัญหานี้ที่กล่าวถึงที่นี่จึงไม่จำเป็นเมื่อใช้ Magento รุ่นที่สูงกว่าหรือเท่ากับ 1.9.3.9 ฉันยังคงแนะนำให้ลบค่าเก่าที่อธิบายไว้ในอเล็กซ์คำตอบ


1

เรียกใช้แบบสอบถามนี้

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

สิ่งนี้จะช่วยคุณลดขนาดของcore_url_sizeตารางโดยการลบข้อมูลขยะ


คุณแน่ใจหรือว่านี่เป็นข้อมูลขยะ ฉันคิดว่ามันถูกลบนอกจากนี้ยังเขียนใหม่ซึ่งถูกสร้างขึ้นเมื่อเปลี่ยนคีย์ URL!
Alex

ตรวจสอบ regex ค่าเฉลี่ยนี้ซึ่งไม่มีรหัสที่ถูกต้อง
Asish Hira

แต่ ID เหล่านั้นจะถูกสร้างขึ้นเช่นกันเมื่อเปลี่ยนคีย์ URL ด้วยตนเองในส่วนแบ็คเอนด์ ดูคำตอบของฉันด้วย
Alex

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/piotrekkaminski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-sh

เรามีปัญหานี้และสร้างแถวใหม่หลายพันแถวหลังจากสร้างดัชนี URL ของแคตาล็อกใหม่ ตอนนี้ปัญหาได้หายไป ... ยกเว้นความจริงที่ว่าเราต้องทำความสะอาดฐานข้อมูล

สคริปต์ที่ให้ไว้ที่นี่ดูเหมือนเป็นการเริ่มต้นที่ดี แต่ไม่ใช่วิธีที่สมบูรณ์แบบ

php เชลล์ / rewrites_doctor.php - ลบ _rewrites 4

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


-2

นอกจากนี้ยังมีโมดูลเฉพาะhttps://github.com/vladsmirnov/url-rewritesดังนั้นคุณจึงไม่จำเป็นต้องใช้แพทช์ใหม่หลังจากอัพเดต Magento แต่ละครั้ง โมดูลประกอบด้วยสองส่วน: โมดูลจริงเพื่อป้องกันการทำซ้ำตั้งแต่นี้ไปและเชลล์สคริปต์เพื่อล้างฐานข้อมูลที่มีอยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.