0

Magento がカテゴリ パスを含むすべての製品の完全な URL を常に表示するようにするための解決策を見つけようとしています。完全な URL も検索結果に表示されるようにします。このため、すべての製品を 1 つのカテゴリにのみ分類しました。

これは、magento を使用して Url Rewrite カスタムで実行できますか? /product.htmlからcategory/subcategory/product.htmlへの.htaccessを使用した301リダイレクトは良い考えですか?

ありがとうムーディ

4

1 に答える 1

4

商品のURLで完全なカテゴリを取得するために行うことは、カテゴリを含む商品のURLを取得しようとするヘルパーを使用することです。製品メソッドを書き直すこともできますが、別のモジュールが製品のものを書き直すたびにそのような苦痛があります。これが、ヘルパーアプローチを使用する理由です。

これが私たちの方法です:

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を取得しようとし、それが受け入れ可能かどうかを確認します(アクティブ、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);

ナビゲーションに含まれていないカテゴリも考慮されます。

于 2012-06-01T09:01:36.943 に答える