$ _product-> getProductUrl () дает URL-путь без URL-ключа

15

Я получаю коллекцию товаров определенной категории на странице нескольких сайтов Magento. Мой код для получения коллекции:

        $category = new Mage_Catalog_Model_Category();
        $category->load($id);
        $collection = $category->getProductCollection();
        $collection->addAttributeToSelect('*');
        $collection->addAttributeToFilter('status', 1);
        $collection->addFieldToFilter(array(array('attribute'=>'visibility', 'neq'=>"1" )));
        $collection->getSelect()->limit(12);

        foreach ($collection as $shopProduct) :

            echo $shopProduct->getProductUrl();

        endforeach;

Моя проблема в том, что на одном из сайтов Magento, на котором мы работаем, получаемый ProductUrl()файл похож на URL, http://www.my site.com/catalog/product/view/id/2309/s/shopcat/category/373/а не на него http://www.site.com/shopcat/product-url-key.html. Но на всех других сайтах он появляется так, как мы хотим.

Кто-нибудь знает, почему это может быть? Благодарность! Я getUrlPath()тоже пытался использовать, но это ничего не возвращало. Я знаю, что могу обойти это, делая что-то вроде, <?php echo $this->getBaseUrl().$shopProduct->getUrlKey().".html"; ?>но этот метод кажется немного неэффективным!

РЕДАКТИРОВАТЬ 21/03/14: У меня все еще есть эта проблема. Я понял, что getProductUrl()получает требуемый URL в некоторых файлах шаблона сайта, но не в других. Например, я загружаю одну коллекцию на домашнюю страницу, и она дает мне нужные мне URL. Но getProductUrl()не дает мне URL-адреса, которые я хочу с тем же кодом в представлении категории.

Сара
источник
Вы пытались переиндексировать «индекс перезаписывает URL»?
Алексей.Сваричевский
да Пожалуйста, переиндексируйте ваши данные и удалите кеш
Кейул Шах
Я пробовал оба. Я переиндексировал в Index Management и очистил кеш, кеш все равно был отключен.
Сара
Введите admin-> catalof-> управление перезаписью URL. Есть ли URL-адреса? Если да, попробуйте отфильтровать сетку: целевой путь -> [category / some_category_id]
mageUz
Очень жаль за задержку с ответом. Для рассматриваемого продукта настроена перезапись URL-адреса, поэтому, если вы перейдете на сайт site.com/shopcat/product-url-key.html или site.com/catalog/product/view/id/2309/s/shopcat/ категория / 373 вы все еще попадаете на ту же страницу продукта, просто цикл foreach по какой-то причине перетаскивает неверный тип URL.
Сара

Ответы:

18

Попробуйте получить коллекцию так:

$collection = $category->getProductCollection();
$collection->addAttributeToSelect('*');
$collection->addAttributeToFilter('status', 1);
$collection->addFieldToFilter(array(array('attribute'=>'visibility', 'neq'=>"1" )));
//Where the magic happens
//this will add the url rewrite.
//addUrlRewrite can also be left without a parameter to generate url without category.
$collection->addUrlRewrite($category->getId()); 
$collection->getSelect()->limit(12);

Другими словами, дайте модели знать, чтобы дать ключ URL вместо длинного уродливого URL с $collection->addUrlRewrite();.

Мариус
источник
вопрос - зачем вам нужна $ category-> getId () в addUrlRewrite? Я вижу, что это работает в любом случае (например, даже без него). Благодарность!
Ронен Несс
2
Здравствуйте, @Ness, это зависит от того, включен ли у вас параметр "Использовать пути к категориям для URL-адресов продуктов" в разделе Система / Конфигурация / Каталог / Каталог / Оптимизация для поисковых систем. Если вы этого не сделаете, вы можете игнорировать это и просто использовать addUrlRewrite (). Если у вас включены пути к категориям, передача идентификатора категории в функцию означает, что отображаемый URL-адрес продукта является URL-адресом продукта с добавлением пути к категории.
Сара
@Marius Да, это работает для меня.
Дхара Бхатти
8

Получение URL-адреса продуктов

Потенциально сбивает с толку из-за 3 методов, которые вы можете использовать, все из которых находятся в Mage_Catalog_Model_Product:

public function getUrlPath($category=null)
public function getUrlInStore($params = array())
public function getProductUrl($useSid = null)

Лучший способ объяснить это просто показать результаты нескольких звонков. Для продукта с URL-ключом mondrian-large-coffee-table-set-multicolour в домене http: //made.local получаются следующие результаты:

$product->getUrlPath();
    'mondrian-large-coffee-table-set-multicolour'

$product->getUrlPath($category);
    'tables/mondrian-large-coffee-table-set-multicolour'

// you cannot stop this method adding ___store to the URL, even by setting _store_to_url to false
$product->getUrlInStore();
    'http://made.local/tables/mondrian-large-coffee-table-set-multicolour?___store=default'

// you cannot stop this method adding ___store to the URL, even by setting _store_to_url to false
// note - see the "using _ignore_category" section below for an arguable bug with using this param
$product->getUrlInStore(array('_ignore_category' => true));
    'http://made.local/mondrian-large-coffee-table-set-multicolour?___store=default'

$product->getProductUrl();
    'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'

$product->getProductUrl(true);
    'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'
Ведущий разработчик
источник