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

私の問題は、私たちが実行してProductUrl()いるMagentoサイトの1つで、取得されるURLがのような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ではありません。たとえば、ホームページにコレクションを1つ読み込んでいると、必要なURLが提供されます。しかしgetProductUrl()、カテゴリビューで同じコードを使用して必要なURLを提供していません。


「インデックスURLの書き換え」のインデックスを再作成しようとしましたか?
oleksii.svarychevskyi 14

はいデータのインデックスを再作成してキャッシュを削除してください
Keyul Shah 14

両方試してみました。インデックス管理でインデックスを再作成し、キャッシュをフラッシュしましたが、キャッシュはとにかく無効にされました。
サラ14

admin-> catalof-> url rewrite managementと入力します。url reritesはありますか?はい、グリッドをフィルタリングしようとした場合:ターゲットパス- > [カテゴリ/ some_category_id]
mageUz

返信が遅れてすみません。問題の製品に対してURL書き換えが設定されているため、site.com / shopcat / product-url- key.htmlまたはsite.com/catalog/product/view/id/2309/s/shopcat/にアクセスするとcategory / 373でも同じ製品ページが表示されますが、foreachループが何らかの理由で間違ったタイプのURLを通過しているだけです。
サラ14

回答:


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

言い換えると、長いtheいURLの代わりにURLキーを与えることをモデルに知らせ$collection->addUrlRewrite();ます。


質問-addUrlRewriteで$ category-> getId()が必要なのはなぜですか?どちらの方法でも機能することがわかります(例:なしでも)。ありがとう!
ローネンネス

2
@Ness様、システム/構成/カタログ/カタログ/検索エンジン最適化で「製品URLのカテゴリパスを有効にする」を使用しているかどうかによって異なります。そうでない場合は、これを無視して、addUrlRewrite()を使用できます。カテゴリパスをオンにしている場合、関数にカテゴリIDを渡すことは、レンダリングされる製品URLがカテゴリパスの前に追加される製品URLであることを意味します。
サラ

@マリウスうんそれは私のために動作します。
ダラBhattiさん

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'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.