Magento - Удаление номеров в ключе url/URL продукта

Как вы знаете, если у вас есть продукты, которые используют ключ url, ключ url будет иметь цифру, добавленную к нему:

то есть

http://www.site.com/main-category/sub-category/product-name- 6260.html

Как найти источник этого 6260 (который является одним из #, прикрепленным к моим URL-адресам)? Я пробовал идентификатор продукта, sku, я не могу найти его источник. Причина, по которой я спрашиваю, состоит в том, что, если я могу ее найти, я могу создать функцию замены строки, чтобы очистить ее от URL-адреса, прежде чем я повторю их на определенных страницах с перечислением продуктов.

Спасибо.

Ответ 1

Прежде чем мы перейдем к месту в коде, где это произойдет, сообщите, что вы входите в мир боли.

  • Нет правила simple относительно того, как генерируются эти числа. Там случаи, когда это идентификатор магазина, есть случаи, когда это простой идентификатор продукта. Там случаи, когда он не

  • Даже если бы это было так, обычно для сайтов Magento, не имеющих царапин, для создания пользовательских функций, которые меняют этот

  • В конечном счете, поскольку URL-адреса, доступные для чтения/SEO-адреса Magento, находятся в таблице core_url_rewrite, для людей можно вставлять произвольный текст

Предупреждения о гибели в стороне, модель, которую вы ищете, Mage::getSingleton('catalog/url'). Это содержит большую часть логики для создания каталога Magento и перезаписывания продукта. Все эти методы заканчиваются передачей пути запроса с помощью метода getUnusedPath.

#File: app/code/core/Mage/Catalog/Model/Url.php
public function getUnusedPath($storeId, $requestPath, $idPath)
{
    //...
}

Этот метод содержит логику для создания уникального номера в конце URL-адреса. Отслеживание этого полностью выходит за рамки статьи "Переполнение стека", но эта строка, в частности, является просветляющей/унылой.

$lastRequestPath = $this->getResource()
    ->getLastUsedRewriteRequestIncrement($match[1], $match[4], $storeId);
if ($lastRequestPath) {
    $match[3] = $lastRequestPath;
}
return $match[1]
    . (isset($match[3]) ? ($match[3]+1) : '1')
    . $match[4];

В частности, эти две строки

$match[3] = $lastRequestPath;
//...
. (isset($match[3]) ? ($match[3]+1) : '1')
//...

Если это не очевидно, бывают случаи, когда Magento автоматически добавляет 1 к URL-адресу, а затем продолжает увеличивать его. Это приводит к тому, что генерация этих URL-адресов зависит от состояния системы при их создании - нет простого правила.

Другие строки, представляющие интерес в этом файле,

if (strpos($idPath, 'product') !== false) {
    $suffix = $this->getProductUrlSuffix($storeId);
} else {
    $suffix = $this->getCategoryUrlSuffix($storeId);
}    

Этот $suffix будет использоваться и в конце URL-адреса, поэтому эти методы заслуживают изучения.

Если все, что вы пытаетесь сделать, это удалить номера из URL-адреса, вам может быть лучше с регулярным выражением или некоторым explode/implode строкой jiggering.

Ответ 2

Мне мало что известно, почему это работает, но это сработало для меня. Скорее всего, это связано с тем, что URL-адреса не уникальны. Magento ver. 1.7.0.2 неожиданно начал добавлять числа в качестве суффиксов к именам моих новых продуктов, даже если их ключи и имена URL отличались от старых продуктов. По подозрению, я пошел в System -> Configuration -> Catalog -> Search Engine Optimizations -> Product URL Suffix и изменил значение по умолчанию .html на -prod.html. Думаю, вы могли бы изменить его на любой суффикс, который вы хотели. Затем я повторно проиндексировал мой сайт, обновил кеш и престо! Все номера были удалены из URL-адресов продукта. Теперь URL-адреса продукта имеют формат custom-product-name-prod.html. Канонический тег также показывает custom-product-name-prod.html, поэтому я счастлив вдвойне.

Не знаю, будет ли это работать для других, но я надеюсь, что так оно и есть. Обратите внимание, что у меня были старые и новые продукты с повторяющимися URL-адресами и что я отключил старые продукты перед выполнением этой процедуры. Поэтому, если у вас есть 2 продукта с одним и тем же ключом url, и оба включены, это может НЕ работать для вас.