모든 URL 다시 쓰기 지우기-엔터프라이즈 (1.13)


27

여러 번 엉망으로 가져온 가져 오기 후에 제거해야 할 URL 다시 쓰기가 많이 남았습니다.

Enterprise 1.13을 실행 중입니다.

커뮤니티 에서이 문제가 발생했을 때 간단히 잘라서 core_url_rewrite다시 색인을 생성했습니다.

그러나 Enterprise에는 제어가 다시 쓰는 여러 가지 테이블이 있습니다.

  • enterprise_url_rewrite
  • enterprise_url_rewrite_category_cl
  • enterprise_url_rewrite_product_cl
  • enterprise_url_rewrite_redirect
  • enterprise_url_rewrite_redirect_cl
  • enterprise_url_rewrite_redirect_rewrite

나는 그들 모두를 자르는 것이 안전합니까?

나는 누군가 가이 테이블을 잘라서는 안된다고 말할 것을 완전히 기대하므로 순진함에 대해 사과드립니다.


'다시 쓰기를 제어하는 ​​여러 가지 테이블'이 무슨 뜻입니까? EE에서 나는 보통 CE와 같은 일을했습니다. 자르고 core_url_rewrite작동했습니다.
Marius

마리우스 재 작성을 제어하는 ​​테이블입니다. core_url_rewrites가 잘 렸지만 admin에 나열된 항목에는 영향을 미치지 않았습니다. enterprise_url_rewrite enterprise_url_rewrite_category_cl enterprise_url_rewrite_product_cl enterprise_url_rewrite_redirect enterprise_url_rewrite_redirect_cl enterprise_url_rewrite_redirect_rewrite 감사
JamesAllwood

아 ... 죄송합니다. 내 잘못이야. 이 줄은 "Enterprise 1.13을 실행하고 있습니다." EE 1.13에 대한 경험이 없습니다 (아직). 지금은 무시하십시오.
Marius

1
고려해야 할 사항 : gist.github.com/Vinai/5451584
B00MER

1
최근 상점 중 하나에 대해 Magento EE 1.12를 EE 1.13으로 업데이트했으며 웹 사이트에서 발생할 수있는 변경 및 문제에 대한 게시물을 작성했습니다. code4business.de/update-magento-enterprise-edition-1-13-0-2 /… 게시물이 페이지 하단에 영어로 번역되어 있습니다.
user2830524

답변:


30

우리는 당신이 제임스와 비슷한 상황에 처해 있습니다. 많은 파기를 한 후에 이것은 내가 생각해 낸 것입니다.

이제 core_url_rewrite테이블이 더 이상 사용되지 않으며, 대신 Magento EE 1.13은 다시 쓰기를에 저장합니다 enterprise_url_rewrite.

테이블 : 실행할 때 테이블을 enterprise_*_category_rewrite사용 catalog_*_entity_url_key하여 두 개의 다시 쓰기 테이블을 다시 작성하십시오.php indexer.php --reindex catalog_url_*

사용자 정의 URL에 대한 관리자 카탈로그-> URL 리디렉션에서 'URL 리디렉션'을 추가하면 해당 URL이 enterprise_url_rewrite_redirect테이블에 추가되고 인덱스가 오래되었다는 마 젠토 플래그 enterprise_url_rewrite_redirect_cl가 실행되면 테이블을 php indexer.php --reindex url_redirect다시 작성 enterprise_url_rewrite_redirect_rewrite합니다.

빠른 참고로, _cl로 끝나는 모든 테이블은 잘리는 것이 안전하고 'CL'은 변경 로그를 나타내며 Magento에서 재 인덱싱이 필요한지 확인하는 데 사용됩니다.

URL 키 테이블에 관한 한, 나는 두 개의 URL 키 항목이 왜 하나에 catalog_*_entity_url_key하나씩 catalog_*_entity_varchar(속성 id 90) 있는지에 대해 약간의 단서가 없지만, 이것이 일어난다 고 가정합니다.

새 제품을 만들 때 / 카테고리 젠토는에 배치 된 url_key 생성하는 이름을 사용 catalog_*_entity_url_key하고의를 catalog_*_entity_varchar하지만, 마 젠토 사용하는 기본 테이블은이다 catalog_*_entity_url_key당신이 그것을 절단하고 실행하는 경우 때문에 php indexer.php --reindex catalog_url_*당신의 enterprise_*_category_rewrite테이블이 비어 및 제품 / 카테고리에있는 것 프론트 엔드 즉 추한 URL을 표시합니다 http://example.com/catalog/product/view/id/123/etc/etc(SOE 친화적하지 않음) 나는 두 개의 테이블이 관련하고 빌드하는 데 사용됩니다 생각 enterprise_url_rewrite테이블을 때문에이 테이블에 저장합니다 'request_path'가능성이 가장 높은 내부 url_key catalog_*_entity_varchar테이블과 '식별자'기본이다 catalog_*_entity_url_key표의 URL 키 url_key 및 varchar 테이블에 대해 완전히 틀릴 수 있으므로 크게 생각하고 있습니다.

어쨌든 실행할 수있는 모든 다시 쓰기 테이블을 성공적으로 자르고 다시 작성하려면 다음을 수행하십시오.

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE `core_url_rewrite`;
TRUNCATE TABLE `enterprise_catalog_category_rewrite`;
TRUNCATE TABLE `enterprise_catalog_product_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite_category_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_product_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_rewrite`;
SET FOREIGN_KEY_CHECKS = 1;

그런 다음 다음을 실행하십시오.

sudo php indexer.php --reindex catalog_url_product
sudo php indexer.php --reindex catalog_url_category
sudo php indexer.php --reindex url_redirect

또한 자르면 enterprise_url_rewrite_redirect관리자 패널에 표시되는 모든 사용자 정의 리디렉션을 잃어 버릴 것입니다. 아마도 쓸모없는 URL이 많이 남아 있기 때문에 이것이 목표 일 것입니다. '* _entity_url_key'테이블을 자르지 않는 한 괜찮습니다.

우리가 중복 URL 키와 1.11에서 1.13로 업그레이드 한 후 엑셀 수입에서 제품 이름을 가진 큰 문제가 있었기 때문에 나는 다시이 빠른 스크립트 작성, 그래서 우리의 이야기는 조금 달랐다 catalog_product_entity_url_key에 테이블과 URL 키와 URL 경로 catalog_product_entity_varchar테이블을 사용하여 제품을 이름. 아래 코드를 첨부했지만 사용하는 경우 자신의 책임하에 사용해야합니다.

<?php
include_once('app/Mage.php');
Mage::app();

$dbHandle          = Mage::getSingleton('core/resource')->getConnection('core_write');
$productCounter    = 0;
$nameFixCounter    = 0;
$vUrlKeyFixCounter = 0;
$urlPathCounter    = 0;
$urlKeyCounter     = 0;
$productCollection = $dbHandle->query("SELECT entity_id, sku FROM catalog_product_entity");

while($product = $productCollection->fetch()) {    
  $dataString       = null;

  $oldProductName   = $dbHandle->query("SELECT value FROM catalog_product_entity_varchar WHERE entity_id = '".$product['entity_id']."' AND attribute_id = 65")->fetch();
  $oldVarcharUrlKey = $dbHandle->query("SELECT value FROM catalog_product_entity_varchar WHERE entity_id = '".$product['entity_id']."' AND attribute_id = 90")->fetch();
  $oldUrlPath       = $dbHandle->query("SELECT value FROM catalog_product_entity_varchar WHERE entity_id = '".$product['entity_id']."' AND store_id = 0 AND attribute_id = 91")->fetch();
  $oldUrlKey        = $dbHandle->query("SELECT value FROM catalog_product_entity_url_key WHERE entity_id = '".$product['entity_id']."'")->fetch();

  $newProductName   = preg_replace('/\s+/', ' ', trim(preg_replace('/[^\x20-\x21\x23-\x2B\x2D-\xE7]/', ' ', $oldProductName['value'])));
  $newUrlKey        = preg_replace('/\s+/', '-', trim(preg_replace('/[^\x30-\x39\x61-\x7A]/', ' ', strtolower($newProductName))));

  if (strcmp($oldProductName['value'], $newProductName)) {
    echo "-[".$oldProductName['value']."]\n";
    echo "+[".$newProductName."]\n";
    $dbHandle->query('UPDATE catalog_product_entity_varchar SET value = "'.$newProductName.'" WHERE entity_id = "'.$product['entity_id'].'" AND attribute_id = 65');
    ++$nameFixCounter;
  }

  if (strcmp($oldVarcharUrlKey['value'], $newUrlKey)) {
    echo "-[".$oldVarcharUrlKey['value']."]\n";
    echo "+[".$newUrlKey."]\n";
    if ($oldVarcharUrlKey['value'] === null) {
      $dbHandle->query("INSERT INTO catalog_product_entity_varchar (entity_type_id, attribute_id, store_id, entity_id, value) VALUES ('4', '90', '0', '".$product['entity_id']."', '".$newUrlKey."')");
    } else {
      $dbHandle->query("UPDATE catalog_product_entity_varchar SET value = '".$newUrlKey."' WHERE entity_id = '".$product['entity_id']."' AND attribute_id = 90");
    }
    ++$vUrlKeyFixCounter;
  }

  if (strcmp($oldUrlPath['value'], $newUrlKey.'.html')) {
    echo "-[".$oldUrlPath['value']."]\n";
    echo "+[".$newUrlKey.".html]\n";
    if ($oldUrlPath['value'] === null) {
      $dbHandle->query("INSERT INTO catalog_product_entity_varchar (entity_type_id, attribute_id, store_id, entity_id, value) VALUES ('4', '91', '0', '".$product['entity_id']."', '".$newUrlKey.".html')");
    } else {
      $dbHandle->query("UPDATE catalog_product_entity_varchar SET value = '".$newUrlKey.".html' WHERE entity_id = '".$product['entity_id']."' AND store_id = 0 AND attribute_id = 91");
    }
    ++$urlPathCounter;
  }

  if (strcmp($oldUrlKey['value'], $newUrlKey)) {
    echo "-[".$oldUrlKey['value']."]\n";
    echo "+[".$newUrlKey."]\n";
    if ($oldUrlKey['value'] === null) {
      $dbHandle->query("INSERT INTO catalog_product_entity_url_key (entity_type_id, attribute_id, store_id, entity_id, value) VALUES ('4', '90', '0', '".$product['entity_id']."', '".$newUrlKey."')");
    } else {
      $dbHandle->query("UPDATE catalog_product_entity_url_key SET value = '".$newUrlKey."' WHERE entity_id = '".$product['entity_id']."'");
    }
    ++$urlKeyCounter;
  }

  $report  = "[".++$productCounter."] ";
  $report .= "NAME: [".(strcmp($oldProductName['value'], $newProductName)?'!=':'==')."] ";
  $report .= "V_KEY: [".(strcmp($oldVarcharUrlKey['value'], $newUrlKey)?'!=':'==')."] ";
  $report .= "PATH: [".(strcmp($oldUrlPath['value'], $newUrlKey.'.html')?'!=':'==')."] ";
  $report .= "KEY: [".(strcmp($oldUrlKey['value'], $newUrlKey)?'!=':'==')."]\n";
  echo $report;

}
echo 'Total Products: ['.$productCounter.'] Names: ['.$nameFixCounter.'] V_Keys: ['.$vUrlKeyFixCounter.'] Paths: ['.$urlPathCounter.'] Keys: ['.$urlKeyCounter.']';

코드가 여기 Magentos formatKey 방법을 사용 불통 될 수 http://www.magentocommerce.com/wiki/3_-_store_setup_and_management/seo/url_key_characters_conversion은 내가 reupdating 귀찮게하지 않았다, 그래서 나는 모든 키를 업데이트 한 후 불행하게도 나는 위키를 건너 왔어요 다시 모든.

희망이 있습니다 :)!


sudo php indexer.php --reindex catalog_url_catalog이어야합니다 sudo php indexer.php --reindex catalog_url_category.
Matthias Zeis 8

지금 똑같이하려고합니다. 그러나 모든 테이블을 자른 후에는 직접 카테고리 및 제품 URL 만 다시 색인화됩니다. 와 같은 카테고리의 제품에 대한 항목을 찾을 수 없습니다 catalog/product/view/id/XXX/category/YYY. 이것이 당신에게 동일하다는 것을 확인할 수 있습니까? 나는 이것에 대해 실마리가 없다 ... 버그입니까, 아니면 뭔가 잘못하고 있습니까? 1.13.0.2의 새로운 설치에서 동일한 작업을 시도했지만 동일한 일이 발생했습니다. 다시 쓰기는 프런트 엔드에서 제대로 작동하지만 범주가 설정되지 않았습니다.
fmrng

9

테스트 환경에서 EE 1.13으로 엉망인 것을 보았고 방금 수행 한 빠른 테스트를 바탕으로 해당 테이블을 간단하게 자른 다음 CLI에서 모든 URL 인덱스를 수동으로 다시 작성할 수 있습니다.

* _cl 테이블은 테이블에서 찾은 TRIGGERS에서 사용됩니다 catalog_product_entity_url_key. 이 * _cl 테이블에 삽입 한 레코드는 저장 후 다시 색인화해야 할 항목을 나타내는 데 사용됩니다.

여기 내가 한 일이 있습니다. CLI 도구를 사용하여 인덱스를 다시 빌드하면 모든 것이 잘되는 것처럼 보입니다. MySql 잘림…

TRUNCATE TABLE `enterprise_url_rewrite_redirect_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect`;
TRUNCATE TABLE `enterprise_url_rewrite_product_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_category_cl`;
TRUNCATE TABLE `enterprise_url_rewrite`;
TRUNCATE TABLE `enterprise_catalog_product_rewrite`;
TRUNCATE TABLE `enterprise_catalog_category_rewrite`;
TRUNCATE TABLE `core_url_rewrite`;

그런 다음 CLI에서…

php shell/indexer.php --reindex catalog_url_product
php shell/indexer.php --reindex catalog_url_category
php shell/indexer.php --reindex url_redirect

Marius와 같이 귀하의 결과를 알려주십시오. 아직 EE 1.13 사이트를 구축하지 않았으며 Imagine 이후 엉망인 경험이 있습니다. :)


1
안녕 David, 자세한 답변 감사합니다. 나는 당신의 지시를 시도했지만 불행히도 운이 없습니다. 모든 다시 쓰기가 지워졌지만 indexer.php를 실행해도 다시 생성되지 않았습니다. 하룻밤 사이에 Magento의 지원이 실제로 나에게 돌아 왔고, 그들의 조언은 URL 재 작성이 이제 다음에 저장되었다는 것이 었습니다.-제품의 catalog_product_entity_url_key-제품의 경우 catalog_category_entity_url_key 다시 운이 좋다. 추가 설명을 요청 했으므로 다시 연락하면 알려 드리겠습니다.
JamesAllwood

내가 이것을 볼 때 주목 한 것은 URL 다시 쓰기 가 이전 enterprise_url_rewrite과 비교 core_url_rewrite하여 저장된다는 것 입니다. catalog_*_entity_url_key테이블은 인덱서에서 사용하기 위해 url 키가있는 복제 된 테이블 인 것 같으며 URL 다시 쓰기와 관련된 트리거가있는 테이블이기도합니다.
davidalger

@Francesco, 1.12에서 업그레이드 한 후 이전에 해당 스크립트를 실행 했습니까? 그렇지 않은 경우 실행해야 할 것으로 예상되며 문서화 된 업그레이드 프로세스의 일부이므로 1.12에서 1.13으로 버그를 부르지 않습니다.
davidalger

@ davidalger : 스크립트가 거의 제대로 작동하는 것이 맞습니다 (이상한 Urls를 만들지 만 몇 개만 만듭니다).이 EE 릴리스에서는 URL 다시 쓰기 기능이 매우 약합니다 (예 : 제품의 URL 키를 변경하고 저장하는 경우) t 예상대로 작동)
Fra

이 답변을 수락해야합니다. EE 1.13에서 작동하는지 확인할 수 있습니다.
musicliftsme

4

TRUNCATE 사용에 관한 참고 사항 :

TRUNCATE TABLE `enterprise_url_rewrite`;

외래 키 참조로 인해 오류가 발생합니다.

ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`customerx_dev`.`enterprise_catalog_category_rewrite`, CONSTRAINT `FK_415B32DA3DF924D5C803CF24EB3AC1D9` FOREIGN KEY (`url_rewrite_id`) REFERENCES `customerx_dev`.`enterprise_url_rewrite` (`url_rewrite_i)

다음과 같이 자르기 / 삭제 명령을 실행하면 작동합니다.

TRUNCATE TABLE `enterprise_url_rewrite_redirect_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect`;
TRUNCATE TABLE `enterprise_url_rewrite_product_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_category_cl`;
TRUNCATE TABLE `enterprise_catalog_product_rewrite`;
TRUNCATE TABLE `enterprise_catalog_category_rewrite`;
TRUNCATE TABLE `core_url_rewrite`;
DELETE FROM `enterprise_url_rewrite`;

사용 SET FOREIGN_KEY_CHECKS = 0;하여 이전 TRUNCATE ...SET FOREIGN_KEY_CHECKS = 1;이후, 맨 아래에DELETE FROM ...
올렉

4

간단한 대답은 아니오입니다 . 최소한 결과를 모르는 경우 이러한 테이블을 자르는 것이 안전하지 않습니다.

  • 모든 다시 쓰기 테이블을 자르고 다시 색인을 생성하면 작업 사이트로 연결됩니다.

하나:

  • 모든 사용자 지정 다시 쓰기를 풉니 다 (정상적인 경우).
  • Catalog -> Url Redirect비어 있음 (EE 1.13.1에서) ( Magento에 따른 버그처럼 보입니다. 이것은 1.13.1에서 예상되는 동작입니다) (아래 주석 참조)

2
Catalog -> Url Redirect비 시스템 재 작성 만 표시 하는 것을 추가하고 싶습니다 . 따라서 사용자 지정 다시 쓰기 만 여기에 표시됩니다. 즉 enterprise_url_rewrite.system = 0.
musicliftsme 2013

네, 맞습니다. Magento Support Team에서 얻은 마지막 정보로 답변을 개선했습니다. 원한다면 제 답변을 자유롭게 향상 시키십시오
Fra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.