我正在尝试找到一种解决方案,以确保 Magento 始终显示每个产品的完整 URL,包括类别路径。我希望完整的网址也出现在搜索结果中。为此,我将每种产品都归为一类。
这可以通过magento通过Url Rewrite custom来完成吗?使用 .htaccess 将 /product.html 重定向到 category/subcategory/product.html 的 301 重定向是个好主意吗?
谢谢穆迪
我正在尝试找到一种解决方案,以确保 Magento 始终显示每个产品的完整 URL,包括类别路径。我希望完整的网址也出现在搜索结果中。为此,我将每种产品都归为一类。
这可以通过magento通过Url Rewrite custom来完成吗?使用 .htaccess 将 /product.html 重定向到 category/subcategory/product.html 的 301 重定向是个好主意吗?
谢谢穆迪
我们在产品 url 中获取完整类别的方法是使用一个帮助程序,它会尝试为您获取包含该类别的产品 URL。你也可以重写 product 方法,但是每当另一个模块重写一些产品的东西时,它会很痛苦,这就是我们使用 helper 方法的原因。
这是我们的方法:
public static function getFullUrl (Mage_Catalog_Model_Product $product ,
Mage_Catalog_Model_Category $category = null ,
$mustBeIncludedInNavigation = true ){
// Try to find url matching provided category
if( $category != null){
// Category is no match then we'll try to find some other category later
if( !in_array($product->getId() , $category->getProductCollection()->getAllIds() )
|| !self::isCategoryAcceptable($category , $mustBeIncludedInNavigation )){
$category = null;
}
}
if ($category == null) {
if( is_null($product->getCategoryIds() )){
return $product->getProductUrl();
}
$catCount = 0;
$productCategories = $product->getCategoryIds();
// Go through all product's categories
while( $catCount < count($productCategories) && $category == null ) {
$tmpCategory = Mage::getModel('catalog/category')->load($productCategories[$catCount]);
// See if category fits (active, url key, included in menu)
if ( !self::isCategoryAcceptable($tmpCategory , $mustBeIncludedInNavigation ) ) {
$catCount++;
}else{
$category = Mage::getModel('catalog/category')->load($productCategories[$catCount]);
}
}
}
$url = (!is_null( $product->getUrlPath($category))) ? Mage::getBaseUrl() . $product->getUrlPath($category) : $product->getProductUrl();
return $url;
}
/**
* Checks if a category matches criteria: active && url_key not null && included in menu if it has to
*/
protected static function isCategoryAcceptable(Mage_Catalog_Model_Category $category = null, $mustBeIncludedInNavigation = true){
if( !$category->getIsActive() || is_null( $category->getUrlKey() )
|| ( $mustBeIncludedInNavigation && !$category->getIncludeInMenu()) ){
return false;
}
return true;
}
如果指定了一个类别,它会尝试获取与该类别相关的 url。
如果未指定类别或找不到提供的 url,则该方法尝试获取与产品附加到的第一个类别相关的产品 URL,并检查它是否可接受(活动,带有 url 键和匹配导航标准)。
最后,如果它回退到原始的$product->getProductUrl()
Magento 方法。
您必须通过以下调用在模板(类别、购物车产品、最近查看的等等)中使用它:
echo $this->helper('yourcompany/yourmodule')::getFullProductUrl($_product);
编辑:
我考虑了 Zachary 的评论,并通过添加一些检查和选项对其进行了一些调整。希望现在很酷。例子 :
echo $this->helper('yourcompany/yourmodule')::getFullProductUrl($_product, $aCategory);
将尝试在 $aCategory 中查找产品 url,然后回退到其他类别 url,最后是产品基础 url
echo $this->helper('yourcompany/yourmodule')::getFullProductUrl($_product, someCategory, false);
还将考虑未包含在导航中的类别。