$ _product-> getProductUrl () fornece o caminho da URL sem a chave URL

15

Estou recebendo uma coleção de produtos de uma determinada categoria em uma página em alguns sites diferentes do Magento. Meu código para obter a coleção é:

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

Meu problema é que, em um dos sites Magento em que estamos ProductUrl()sendo executados, o URL buscado é um URL semelhante http://www.my site.com/catalog/product/view/id/2309/s/shopcat/category/373/e não mais semelhante http://www.site.com/shopcat/product-url-key.html. Mas em todos os outros sites, ele aparece como queremos.

Alguém sabe por que isso pode ser? Obrigado! Eu tentei usar getUrlPath()também, mas isso não retornou nada. Eu sei que posso contornar isso fazendo algo como, <?php echo $this->getBaseUrl().$shopProduct->getUrlKey().".html"; ?>mas esse método parece um pouco ineficiente!

EDIT 21/03/14: Ainda estou tendo esse problema. Percebi que getProductUrl()recupera o URL desejado em alguns arquivos de modelo do site, mas não em outros. Por exemplo, estou carregando uma coleção na página inicial e ela me fornece os URLs que desejo. Mas getProductUrl()não está me dando os URLs que eu quero com o mesmo código em uma exibição de categoria.

Sarah
fonte
Você tentou reindexar "Index URL reescreve"?
oleksii.svarychevskyi
Por favor, re-indexe seus dados e remova o cache
Keyul Shah
Eu tentei ambos. Reindexei no Gerenciamento de Índice e limpei o cache. O cache foi desativado de qualquer maneira.
Sarah
Digite admin-> catalof-> url reescrever gerenciamento. Existem rerites de URL? Em caso afirmativo, tente filtrar a grade: Caminho de destino -> [category / some_category_id]
mageUz 5/14
Sinto muito pelo atraso na resposta. Há uma reescrita de URL configurada para o produto em questão. Portanto, se você acessar site.com/shopcat/product-url-key.html ou site.com/catalog/product/view/id/2309/s/shopcat/ categoria / 373 você ainda acessa a mesma página do produto, é apenas por algum motivo que o loop foreach está acessando o tipo errado de URL.
Sarah

Respostas:

18

Tente obter a coleção assim:

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

Em outras palavras, informe o modelo para fornecer a chave da URL em vez da URL longa e feia $collection->addUrlRewrite();.

Marius
fonte
pergunta - por que você precisa de $ category-> getId () em addUrlRewrite? Vejo que funciona de qualquer maneira (por exemplo, mesmo sem ela). obrigado!
Ronen Ness
2
Olá @Ness, depende se você tiver "Usar caminhos de categoria para URLs de produtos ativados" em Sistema / Configuração / Catálogo / Catálogo / Otimizações de mecanismos de pesquisa. Caso contrário, você pode ignorar isso e usar addUrlRewrite (). Se você tiver os caminhos da categoria ativados, passar o ID da categoria para a função significa que o URL do produto que é renderizado é o URL do produto precedido pelo caminho da categoria.
314 Sarah
@ Marius Sim, funciona para mim.
Dhara Bhatti
8

Obtendo um URL de produtos

Potencialmente confuso devido aos 3 métodos que você poderia usar, todos os quais estão no Mage_Catalog_Model_Product:

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

A melhor maneira de explicar é simplesmente mostrar os resultados de várias chamadas. Dado um produto cuja chave de URL é mondrian-large-table-table-set-multicolour no domínio http: //made.local, os resultados são:

$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'
Desenvolvedor-chefe
fonte