ম্যাজেন্টো কোর_আর্ল_উরাইট টেবিল অতিরিক্ত পরিমাণে


105

আমি প্রচুর পরিমাণে প্রতিবেদন লক্ষ্য করেছি যে এই টেবিলটি নিজেই অত্যন্ত বিশৃঙ্খল হয়ে উঠতে পারে, আমি site 5000 এসকিউ এবং 250 core_url_rewriteডলার বিভাগের (একক স্টোর) এবং 600,000 এরও বেশি লাইন এবং 500 এমবি এর বেশি আকারের ফলস্বরূপ একটি সাইট চালাচ্ছি which উন্মাদ হয়।

এটি সাইটের কার্য সম্পাদনকে কমিয়ে দিতে পারে এবং ফলস্বরূপ একটি খুব বড় ডেটাবেস তৈরি করতে পারে। আমি কিছু খনন করেছি এবং এ সংক্রান্ত বেশ কয়েকটি পোস্ট পেয়েছি, উল্লেখযোগ্য:

// এই বোর্ডগুলি নতুন বোর্ড কার্যকর করার পর থেকে সরানো হয়েছে

এখন আমি বুঝতে পেরেছি যে টেবিলটি কেটে ফেলা যাবে এবং পুনরায় সংশ্লেষ করা যেতে পারে, তবে এটি সমস্যার সমাধান করে না , এটি কেবল সমস্যাটি আবার ঘটে থেকে দীর্ঘায়িত করে।

আমি যা বুঝি তার থেকে ইস্যুটির একটি অংশ হ'ল এমন পণ্য যা পণ্যের নামের উপর ভিত্তি করে একই url কী থাকে, যার ফলে সূচীযুক্ত লিঙ্ক হয়।

উল্লিখিত একটি ফিক্সটি হ'ল:

app/code/core/Mage/Catalog/Model/Url.php লাইনে 7 807:

পরিবর্তন:

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

প্রতি:

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

তবে এটি পুরোপুরি সমস্যার সমাধান করে না।

আমার প্রশ্নটি নিম্নরূপ:

আপনি যদি এই সমস্যাটি অনুভব করে থাকেন, তবে আপনি কি কোনও কার্যকর, যৌক্তিক এবং দক্ষ অ্যালগরিদম সেট আপ করতে পেরেছেন যা এই সমস্যাটি বারবার "পরিচালনা" জড়িত করে না, তবে আসলে বিষয়টিকে একবার এবং সকলের জন্য সমাধান করে?

সত্যিই এই কিছু অন্তর্দৃষ্টি প্রশংসা করবে ।

বিটিডাব্লু: অনুগ্রহ করে নিজেকে অনুগ্রহ করুন এবং আপনার টেবিলটি এখন কেমন দেখাচ্ছে তা পরীক্ষা করুন, আপনি সম্ভবত এটি না জেনেও এই সমস্যাটি এবং এর ফলাফল হিসাবে পারফরম্যান্সের প্রভাবটি অনুভব করছেন I আমি তা করি নি।

সম্পাদনা করুন: আমি www.Nexcess.net (একজন ম্যাজেন্টো প্ল্যাটিনাম হোস্টিং পার্টনার) এর সাথে যোগাযোগ করেছি এবং তারা নিশ্চিত করেছেন যে তাদের ক্লায়েন্টদের অনুরোধ ছিল যে তাদের core_url_rewriteটেবিলটি খুব বেশি ভারী হওয়ার কারণে তাদের কাটা কাটা প্রয়োজন।

আমার একটি বড় উদ্বেগ হ'ল এটির এসইও প্রভাবগুলি হতে পারে, এ কারণেই আমি আবার উত্থিত হওয়া থেকে সমস্যার সমাধানের বিপরীতে কোনও সমাধান চাই।

আপডেট: নেক্সসেস উল্লেখ করেছে যে টেবিলের মধ্যে সদৃশ পণ্যগুলির সাথে এটি এসইও যেমন হ'ল ব্যথা করছে।


বাহ, এটি একটি বিস্ময়করভাবে বড় টেবিল। আমি আমার নিজস্ব (২০০ টি পণ্য) পরীক্ষা করেছি এবং এটিতে কেবলমাত্র ~ 800 টি সারি রয়েছে, তবে আমাদের পণ্যের নাম / ইউআরএলগুলি নকল করতে কোনও সমস্যা নেই। একটি রেফারেন্স পয়েন্ট হিসাবে, আমাদের কাছে দৃশ্যমান পণ্য প্রতি প্রায় 6.6 সারি রয়েছে। আমি এটিকে ভয়াবহ বাস্তবসম্মত তুলনা হিসাবে স্বীকার করব না, তবে এই হারে, 5,000 টি পণ্যের সাথে আমাদের কেবল 30,000 ডলার বা আরও কিছু থাকবে। সমাধানের জন্য আপনার প্রয়োজনীয়তাটি আমি ভালভাবে বুঝতে পারি এবং আমি আরও বড় একটি সাইট বাস্তবায়নের জন্য এই প্রশ্নটি দেখব।
পিট 855217

@ পিট 5৫৫২২ question: এই প্রশ্নটি আপনাকে আকর্ষণীয় বলে মনে হচ্ছে যদিও আপনি এটিকে উত্সাহিত করেননি।
মোহাম্মদ ফয়সাল

1
EE1.12 এ একটি ত্রুটি ছিল যার ফলে প্রতিটি সংরক্ষণে পুনরায় লেখার কারণ হয়ে থাকে। আপনার 1.7 সংস্করণেও এটি একই বাগ রয়েছে possible আমি 1.12 এর জন্য প্যাচটি স্মরণ করার সাথে সাথে 1.7
ব্রেন্টওপ্টারসন

1
খুব সহায়ক নিবন্ধ! আমাদের ১৩০,০০০ সক্রিয় পণ্য এবং ২৫,০০০ অক্ষম পণ্য রয়েছে, আমাদের কোর_আরল_উরাইট_ টেবিলটির এটিতে 2744023 রেকর্ড রয়েছে ..... তাই এই সপ্তাহে আমরা এটিকে প্রতিকার করার কাজ পাচ্ছি !! এই নিবন্ধটি একটি ভাল সূচনা পয়েন্ট বলে মনে হচ্ছে।
ম্যাজেন্টোম্যাক

মাজেন্টোতে আপনার কাস্টম পুনরায় লেখাগুলি কীভাবে মুছবেন না তা অন্তর্ভুক্ত করার জন্য পোস্টটি সম্পাদনা করেছেন।
এএসপ্রেডলি

উত্তর:


76

আমি সমস্যাটি নীচে নীচে স্থির করতে পেরেছি:

পদক্ষেপ 1: ক্যাটালগ ইউআরএল মডেলটি পুনরায় লিখুন (আপনার নিজস্ব মডিউলটি ব্যবহার করে: কীভাবে )

দ্রষ্টব্য: আপনি যদি পুনর্লিখন না ব্যবহার করে মূল ফাইলটি ওভাররাইট করে থাকেন তবে এটি আপনার ভবিষ্যতের আপগ্রেডগুলিতে অক্ষম হওয়ার ম্যাজেন্টোর উদাহরণটি রেন্ডার করবে।

জাহ্নির সমাধান অনুসারে MagentoCommerce বোর্ড(নতুন বোর্ডের সাথে আর সক্রিয় থাকবে না), app/code/core/Mage/Catalog/Model/Url.php[৮০7 লাইনের আশেপাশে 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: রিইনডেক্স এবং ফ্লাশ ক্যাশে

কোর ইউআরএল পুনর্লিখনগুলিতে পুনরায় সূচীকরণ প্রক্রিয়া শুরু করুন। এরপরে, আপনি ম্যাজেন্টো ক্যাশে এবং সঞ্চয়স্থান ক্যাশে ফ্লাশ করতে চাইবেন।

SystemCache ManagementFlush Magento Cache

SystemCache ManagementFlush Cache Storage

ভয়েলা, তুমি ঠিক আছে। আপনি যদি সূচকটি পুনরায় চালনা করেন তবে খেয়াল করবেন যে টেবিলটি আকারে স্থির থাকতে হবে (যদি না আপনি অভ্যন্তরে আরও পণ্য যুক্ত করেছেন বা যদি আপনার সদৃশ বিভাগের নাম না থাকে)।


5
দুর্দান্ত, আমার কোর_আরল_উরাইট টেবিলটি 3.2 জিবি এখন 36.8 মেগাবাইট: ডি মাপেট দ্বারা
ফ্যাবিয়ান ব্ল্যাচসমিট

আমি একই সমস্যা আছে। ম্যাজেন্টো ইউআরএল পুনর্লিখনের সাথে ইউআরএল এলোমেলো নম্বর। গুগল ওয়েব মাস্টার সরঞ্জামগুলির সাথে সংযুক্ত স্ক্রিনশটটি দেখুন। আপনি দেখতে পাবেন যে "বেইজ এমব্রয়েডারি ওয়েডিং শাড়ি" প্রোডাক্টটিতে নয়টি আলাদা ইউআরএল রয়েছে তবে এটি কেবল একটি পণ্য এবং 868 দিয়ে শেষ হওয়া কেবলমাত্র একটি ইউআরএলকে নির্দেশ করছে। আসল URL কীটির শেষদিকে এলোমেলো সংখ্যা নেই (স্ক্রিনশট সংযুক্ত) )। আমার স্টোরটি মোটামুটি নতুন এবং কোর_আর্ল_উরাইটের আকারটি এত বড় নয়। সুতরাং আমি নিশ্চিত নই যে আমার এগিয়ে যাওয়া উচিত এবং পদক্ষেপ 1 এবং 2 বা একমাত্র পদক্ষেপ 1 করা উচিত আমি যদি দ্বিতীয় ধাপটি সম্পাদন করি তবে আমি আমার কাস্টম পুনরায় লেখা হারাব।
জোয়া

আমি ১.৯.১ চালাচ্ছি এবং এখানে স্ক্রিনশট ইউআরএল মিস করছি। monosnap.com/image/duL0f64WWlACtlt9kcn04BWqY3L5Xl monosnap.com/image/osFk8kYNArrXXLdFTGTIOaydaW5yqS
জোয়া

2
আমি বিদ্যমান টেবিলটি প্রথমে রফতানি করব। তারপরে আমি 1, 2 এবং 3 পদক্ষেপ নিয়ে এগিয়ে যাব core_url_rewriteএখনই টেবিলটি দেখুন এবং রেকর্ডের সংখ্যাটি নোট করুন। আবার পদক্ষেপ 3 আবার চালান (পুনরায় সূচীকরণ), এবং core_url_rewriteটেবিলে আপনার ভিউ রিফ্রেশ করুন । সংখ্যাটি যদি একই হয় তবে আপনি সফলভাবে সমাধান করেছেন। তারপরে এগিয়ে যান এবং ম্যানুয়ালি আপনার কাস্টম পুনরায় লেখাগুলি একত্রিত করুন। শুভকামনা.
আমেরিকার হরিণবিশেষ

2
এই ফিক্সটি কেবলমাত্র পণ্যগুলির জন্য কাজ করে, অভিন্ন URL কী সহ বিভাগগুলির জন্য নয়। আরও ভাল সমাধানের জন্য
@ সিমনের

45

আমি আশা করি যে এখানে কেউ উত্তর নিয়ে এসেছেন, আমি জানি না যে আপনি এটির সন্ধান পাবেন। এই টেবিলটি বিভিন্ন কারণে প্রচুর পরিমাণে পায়। ম্যাজেন্টোর আগের (এবং সম্ভবত বর্তমান) সংস্করণগুলির বাগগুলি একটি। এই টেবিলে আরও একটি যুক্তি রয়েছে যা ইউআরএল মূল মানতে পরিবর্তনগুলি ট্র্যাক করার চেষ্টা করে যাতে 301/302 পুনর্লিখনগুলি পুরানো পণ্যগুলির জন্য সেটআপ হয়। এ কারণে এবং জটিল জিনিসগুলি, টেবিলটি কেটে ফেলা এবং পুনর্জাগরণের ফলে বিদ্যমান ইউআরএল পুনর্লিখনগুলি দূরে সরে যেতে পারে এবং এটি আপনার অনুসন্ধান ইঞ্জিন তালিকার উপর একটি অজানা প্রভাব ফেলবে (প্রয়োজনীয়তা খারাপ নয়, কেবল পূর্বাভাস দেওয়া খুব কঠিন)।

জিজ্ঞাসা করা ক্লায়েন্টদের কাছে আমার সাধারণ পরামর্শ

  1. আপনি যদি আপনার ইউআরএল / এসইও পরিস্থিতিটিতে ভাল হ্যান্ডেল না রাখেন তেমন বিশালাকার টেবিলটি ছেড়ে দিন

  2. টেবিলের আকারটি কোনও সমস্যা হওয়া শুরু না করা পর্যন্ত (উদাহরণস্বরূপ সাইটের মানচিত্র তৈরি করা)। যখন এটি ঘটে তখন আপনার ইউআরএল / এসইও পরিস্থিতিতে একটি হ্যান্ডেল পান।

  3. আপনার ইউআরএল / এসইওর পরিস্থিতি একবারে আপনার হাতল হয়ে গেলে, টেবিলটি ব্যাকআপ করুন, তারপরে টেবিলটি কেটে পুনরায় জেনারেট করুন। কাটা কাটা দ্বারা সৃষ্ট যেকোন URL / SEO সমস্যার সমাধান করুন।

  4. স্বয়ংক্রিয় পদক্ষেপ 3

ম্যাজেন্টো কোড স্তরে এটি ঠিক করার চেষ্টা প্রশংসনীয় তবে আপনি প্রবাহিত হয়ে উঠবেন। কখনও কখনও এটি মেনে নেওয়া ভাল যে "এটি কেবলমাত্র ম্যাজেন্টো হচ্ছেন ম্যাজেন্টো", এবং সমস্যাটি এবং বাহ্যিক প্রক্রিয়াটি সমাধান করার জন্য।


পরামর্শের জন্য ধন্যবাদ, এটি পরিস্থিতি সম্পর্কে দুঃখজনক তবে আমি মনে করি যে এটি বাহ্যিক প্রক্রিয়া দ্বারা পরিচালিত হতে চলেছে যেমনটি আপনি উল্লেখ করেছেন, উর্গ।
আমেরিকার হরিণবিশেষ

2
এই দৈত্য টেবিলটি ইতিমধ্যে এসইও সমস্যা তৈরি করতে পারে, কারণ একটি প্রদত্ত পণ্যের জন্য নিয়মিত ক্রমাগত পরিবর্তন হবে। আপনার যদি মোবাইল এবং ডেস্কটপের জন্য পৃথক স্টোরভিউ থাকে তবে তাদের ইউআরএলগুলি পৃথক হওয়ার কারণে এটি আরও খারাপ।
মেলভিন

আমার কাছে কিছুটা হতাশার উত্তর ...
ফ্রে

@ অ্যালান স্টর্ম, আপনি এই উত্তর পোস্ট করার পরে মোস পোস্ট করেছেন এমন উত্তর সম্পর্কে আপনার কেমন লাগছে? আপনি কি একই ঝুঁকি দেখতে পাচ্ছেন?
গুজ

24

আমি এই ইউআরএল পুনর্লিখন সূচক বাগের জন্য একটি ফিক্স যুক্ত করতে চাই যা মার্চ ২০১৩ সালে বগাথনে তৈরি হয়েছিল এবং এর পরে আরও উন্নত করা হয়েছে। এটি এই সমস্যা সমাধান করা উচিত। রেফারেন্স হিসাবে, এখানে লিঙ্কটি থেকে প্যাচ ফাইলটি রয়েছে:

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


অতিরিক্তভাবে, আমি ইই প্যাচ যোগ করতে চাই PATCH_SUPEE-389_EE_1.12.0.2_v2.sh, যা এখন গিটহাবটিতে উপলব্ধ :

#!/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
             );
         }

আপনি যদি এই প্যাচ সিই সহ ব্যবহার করতে চান তবে এটি সঠিকভাবে পরীক্ষা করে নেওয়ার বিষয়টি নিশ্চিত করুন, কারণ এটি EE এর জন্য তৈরি করা হয়েছে।


আপনি নিজে সিইতে এই ইই প্যাচটি পরীক্ষা করেছেন?
টাইলার ভি।

@TylerV। নাহ ...
সাইমন

3
আমি এই প্যাচটি EE 1.9.1.1 এ চেষ্টা করেছি এবং এটি কার্যকরভাবে কাজ করতে পারে। এটি অভিন্ন url কীগুলির সাহায্যে পণ্য এবং বিভাগগুলির ক্ষেত্রে সমস্যাটি সমাধান করে। আসুন আশা করি শিগগিরই তারা ভবিষ্যতে প্রকাশে এটি বাস্তবায়ন করেছেন।
জিয়েল বার্কার্স

1
ধন্যবাদ সাইমন, এক ক্লায়েন্টের ওয়েবসাইটে কেবল 1 জিবি থেকে 3
এমবিতে গিয়েছিল

1
আমি কেবল আমার ১.৯ সিইতে এটি চেষ্টা করেছি এবং যদিও এটি পণ্যগুলির জন্য কাজ করে - বিভাগগুলি ঠিক তেমন সঠিক নয়। আমার যদি 'টেস্ট' নামে একটি বিভাগ থাকে যা ইউআরএল দেয় ... ... / পরীক্ষা 'এবং তারপরে আমি আরও একটি' টেস্ট 'নামে তৈরি করি এটির ইউআরএল দেওয়া উচিত ... / পরীক্ষা -২' তবে পরিবর্তে কেবল নম্বরটি দেয় না নাম: '... / - 2'
বিজয়_উডাক

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

আশীষ হীরার প্রশ্নের বিপরীতে, এটি কেবলমাত্র ইউআরএলগুলিকেই প্রভাবিত করে যার শেষ অংশ হিসাবে একটি পূর্ণসংখ্যার সংখ্যা রয়েছে - এটি ছিল - আমার ক্ষেত্রে - বিশৃঙ্খলার কারণ।

এটি বৈধ পুনর্লিখনগুলিতে স্পর্শ না করার চেষ্টা করে, যা উদাহরণস্বরূপ কোনও ইউআরএল কী আপডেট করার সময় তৈরি করা হয়েছিল।


6

আমি গ্রহণযোগ্য উত্তর সাফল্যের সাথে বাস্তবায়ন করেছি। অন্য ম্যাজেন্টো ইনস্টল করতে আমার কিছু কাস্টম রাইটারিট সংরক্ষণ করার প্রয়োজন ছিল তাই আমি এ-তে শেষ হওয়া সমস্ত এন্ট্রি মুছলাম - এবং তারপরে এর সাথে 5 সংখ্যার দৈর্ঘ্য সংখ্যা:

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

এটি বেশিরভাগ ক্ষেত্রেই কাজ করে তবে আমি প্রতিটি পুনরায় সূচকে আরও 2 টি সারি পাই। নিশ্চিত কেন। আমি ভেবেছিলাম এই অভিজ্ঞতাটি শেয়ার করব।


1
আপনি সম্ভবত ইউআরএলগুলি মুছলেন যা বৈধ, তবে একটি সংখ্যায় শেষ। আপনি তাদের সাথে খুঁজে পেয়েছেন$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('url_key', array('regexp' => '[0-9]$'));
মেলভিন

5

আপনি যে মূল পরিবর্তনটি উল্লেখ করেছেন কেবলমাত্র এটির জন্য url_keys ছাড়া পণ্য থাকলে মনে হয়, তবে ম্যাগেন্টো সবসময় আপনার জন্য 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

আমি সদৃশ ইউআরএল পুনর্লিখনগুলি রোধ করতে অনুমোদিত সমাধান অনুসরণ করেছি, তারপরে core_url_rewriteCSV ফাইল হিসাবে রফতানি করেছি । এই সিএসভি খুলতে এবং ম্যানুয়ালি তৈরি করা ইউআরএল পুনর্লিখনগুলি সমস্ত মুছতে সক্ষম হয়েছিল।

তারপরে আমি core_url_rewriteটেবিলটি ছাঁটাই করেছি এবং নিজেই তৈরি করা ইউআরএল পুনর্লিখনের সাথে আমার সংরক্ষিত সিএসভি আমদানি করেছি।

সমস্ত পরিবর্তনের পরে, 940K সারি থেকে 32K এ চলে গেছে। বিশাল উন্নতি।


3

এই ঠিক করার জন্য ম্যাজেন্টো সম্প্রদায়ের জন্য প্যাচ (স্থানীয় পুনর্লিখন) এখানে দেওয়া আছে যা https://github.com/biotech/Magento- URL- পুনর্লিখন বাস্তবে EE প্যাচ PATCH_SUPEE-389_EE_1.12.0.2_v2.sh হিসাবে একই - প্রতিটি পুনর্লিখন পরীক্ষা করুন এবং সদৃশ রেকর্ড সৃষ্টি এড়ানো। উত্পাদনে সিই 1.9, 15k পণ্য, 4 টি স্টোর, বাল্ক পণ্য আমদানি পরিবর্তনের পরে প্রতি রাতে সম্পূর্ণ পুনরায় সূচকে গত 2 মাস ভাল কাজ করে।


এটি কতটা ভালভাবে পরীক্ষা করা হয়েছে? দেখে মনে হচ্ছে এটি ঠিক এক ঘন্টা আগে পোস্ট করা হয়েছে ....
এসআর_ম্যাজেন্টো

এটি কি 1.9.2.x এ ঠিক করা হয়েছে তাই আমাদের আর টেবিল ফোটা নিয়ে চিন্তার দরকার নেই?
ফায়াসকো ল্যাবগুলি

সিঙ্গেল লিঙ্কের উত্তরগুলি সমস্যার সমাধান হতে পারে এমনকি সর্বোত্তম উত্তর নয়। আপনার কোড কি করে দয়া করে কিছুটা ব্যাখ্যা করুন।
Marius

@ ফায়াসক্ল্যাবস হ্যাঁ, সমস্ত সিই 1.9.x এ ভাল কাজ করে
ফায়ার বিয়ার

1
@ ফায়াসকোল্যাবস: ১.৯.২.x এর এখনও এই "পুনর্লিখন ফোলা" ইস্যু রয়েছে এবং এই ফিক্সটি অন্তর্ভুক্ত করে না, তবে ফায়ারবার যেমন বলেছে, ইই প্যাচ সিই ১.৯.২.x এর সাথে কাজ করবে। (ব্যক্তিগতভাবে চেষ্টা করেন নি; কেবল স্পষ্ট করে বলতে চেয়েছিলেন যে ১.৯.২.২ এখনও স্পষ্টভাবে এখনও এই সমস্যাটি রয়েছে)
এরিক সিস্ট্র্যান্ড

2

যেহেতু এটি এখনও এই থ্রেডে উল্লেখ করা হয়নি, তাই আমি শীতল সংবাদটি ভাগ করে নিতে চেয়েছিলাম যে এই সমস্যাটি ম্যাজেন্টো ১.৯.৩.৯ এবং তার পরে স্থির হয়েছে। দেখুন এর সাথে সম্পর্কিত রিলিজ নোট :

ম্যাজেন্টো আর কোর_আর_আরউইরাইট টেবিলে অপ্রয়োজনীয় লেখার ক্রিয়া সম্পাদন করে না।

সুতরাং এখানে বর্ণিত এই সমস্যার জন্য সমস্ত ফিক্সগুলি Magento এর সংস্করণ ১.৯.৩.৯ এর চেয়ে বড় বা সমান ব্যবহার করার সময় প্রয়োজনীয় নয়। আমি এখনও অ্যালেক্সের উত্তরে বর্ণিত পুরানো মানগুলি মুছে ফেলার পরামর্শ দিচ্ছি ।


1

এই কোয়েরিটি চালান

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

এটি অবশ্যই আপনাকে core_url_sizeজাঙ্ক ডেটা মোছার মাধ্যমে সারণির আকার হ্রাস করতে সহায়তা করবে ।


আপনি কি নিশ্চিত যে এটি জাঙ্ক ডেটা? আমি মনে করি এটি মুছে ফেলা হয়েছে এমন পুনর্লিখনগুলিও যা 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 ইনস্টল করা উচিত। যে হিসাবে সহজ।

এটি পুরোপুরি ম্যাজেন্টো সিইয়ের সাথে কাজ করে যেহেতু তারা এই অঞ্চলে কোডের খুব একই অংশটি ভাগ করে দেয়।

আপনি প্যাচ ফাইলটি এখানে পেতে পারেন https://gist.github.com/piotrekkineski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-sh

আমাদের এই সমস্যাটি ছিল এবং এটি প্রতিটি ক্যাটালগের ইউআরএল পুনরায় সূচকের পরে হাজার হাজার নতুন সারি তৈরি করে। এখন সমস্যাটি চলে গেছে ... আমাদের ডিবি পরিষ্কার করতে হবে তা বাদে।

এখানে প্রদত্ত স্ক্রিপ্টটি একটি ভাল শুরু বলে মনে হচ্ছে তবে এটি কোনও সঠিক সমাধান নয়,

পিএইচপি শেল / পুনর্লিখন_ডক্টর.পিএফ - রেমোভ_উইউরিটিস 4

Https://www.atwix.com/magento/d નકલ --- উত্পাদ- url- keys- in- commune- edition/ দেখুন


-2

এছাড়াও একটি উত্সর্গীকৃত মডিউল https://github.com/vladsmirnov/url-rewrites রয়েছে , যাতে প্রতিটি ম্যাজেন্টো আপডেটের পরে আপনাকে প্যাচটি পুনরায় প্রয়োগ করতে হবে না। মডিউলটিতে দুটি অংশ রয়েছে: প্রকৃত মডিউল, এখন থেকে অনুলিপি রোধ করতে এবং শেল স্ক্রিপ্টটি বিদ্যমান ডাটাবেস পরিষ্কার করতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.