$ _product-> getProductUrl () dando ruta de url sin clave URL

15

Estoy obteniendo una colección de productos de una determinada categoría en una página en algunos sitios diferentes de Magento. Mi código para obtener la colección es:

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

Mi problema es que en uno de los sitios de Magento que estamos ejecutando ProductUrl()se busca una URL como http://www.my site.com/catalog/product/view/id/2309/s/shopcat/category/373/y no más http://www.site.com/shopcat/product-url-key.html. Pero en todos los otros sitios aparece como lo queremos.

¿Alguien sabe por qué podría ser esto? ¡Gracias! Intenté usarlo getUrlPath()también, pero esto no devolvió nada. Sé que puedo solucionar esto haciendo algo como <?php echo $this->getBaseUrl().$shopProduct->getUrlKey().".html"; ?>eso, ¡pero ese método parece un poco ineficiente!

EDITAR 21/03/14: sigo teniendo este problema. Me di cuenta de que getProductUrl()recupera la URL deseada en algunos archivos de plantilla del sitio, pero no en otros. Por ejemplo, estoy cargando una colección en la página de inicio y me da las URL que quiero. Pero getProductUrl()no me está dando las URL que quiero con el mismo código en una vista de categoría.

Sarah
fuente
¿Intentó reindexar las "reescrituras de URL de índice"?
oleksii.svarychevskyi
Si por favor a indexar sus datos y eliminar el cache
Keyul Shah
He intentado ambos. He reindexado en Index Management y he vaciado el caché, el caché fue deshabilitado de todos modos.
Sarah
Ingrese admin-> catalof-> url rewrite management. ¿Hay rerites de URL? En caso afirmativo, intente filtrar la cuadrícula: Ruta de destino -> [category / some_category_id]
mageUz
Perdón por el retraso en la respuesta. Hay una reescritura de URL configurada para el producto en cuestión, así que si va a site.com/shopcat/product-url-key.html o site.com/catalog/product/view/id/2309/s/shopcat/ categoría / 373 todavía llega a la misma página de producto, es solo que el bucle foreach está atravesando el tipo de URL incorrecto por alguna razón.
Sarah

Respuestas:

18

Intenta obtener la colección así:

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

En otras palabras, deje que el modelo sepa dar la clave de url en lugar de la url larga y fea con $collection->addUrlRewrite();.

Marius
fuente
pregunta: ¿por qué necesita $ category-> getId () en addUrlRewrite? Veo que funciona de cualquier manera (por ejemplo, incluso sin él). ¡Gracias!
Ronen Ness
2
Hola @Ness, depende si tienes "Usar rutas de categoría para URL de producto activadas" en Sistema / Configuración / Catálogo / Catálogo / Optimizaciones de motores de búsqueda. Si no lo hace, puede ignorar esto y simplemente usar addUrlRewrite (). Si tiene activadas las rutas de categoría, pasar el ID de categoría a la función significa que la URL del producto que se representa es la URL del producto precedida por la ruta de la categoría.
Sarah
@ Mario Sí, funciona para mí.
Dhara Bhatti
8

Obtener una URL de productos

Potencialmente confuso debido a los 3 métodos que podría utilizar, todos los cuales están en Mage_Catalog_Model_Product:

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

La mejor manera de explicar es simplemente mostrar los resultados de varias llamadas. Dado un producto cuya clave URL es mondrian-large-coffee-table-set-multicolour en el dominio de http: //made.local, los resultados son:

$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'
Desarrollador principal
fuente