0

カテゴリとサブカテゴリのわかりやすい URL のフォーマットと、一致する製品の取得について質問があります。PrestaShop 1.5.2.0 を使用しています

次のような構造があるとします。

カテゴリー1

  • スペアパーツ
  • 付属品

カテゴリー2

  • チップス
  • 付属品

/category-1/accessories のようなリンクを表示し、カテゴリ 1->accessories の製品を表示したいと考えています。どうすればこれを達成できますか?

現在の動作は、アクセサリをクリックしたときで、カテゴリ 1 にあり、リンクは/accessoriesであり、表示される製品は /category-1/accessories と /category-2/accessories の両方に属します。

ありがとう!

4

2 に答える 2

2

この質問は、PrestaShop フォーラムで回答されました。ここで見つけることができますhttp://www.prestashop.com/forums/topic/220017-category-subcategory-url/

解決策 - この変更を以下のクラスに追加します

クラス/Dispatcher.php

'rule' => '{categories:/}{id}-{rewrite}/',
'categories' => array('regexp' => '[/_a-zA-Z0-9-\pL]*'),

クラス/Link.php

$cats = array();    
foreach ($category->getParentsCategories() as $cat)    
if (!in_array($cat['id_category'], array(1, 2, $category->id)))//remove root, home and current category from the URL    
$cats[] = $cat['link_rewrite'];    
$params['categories'] = implode('/', array_reverse($cats));
于 2013-02-10T18:33:38.523 に答える
1

上記のコードは古いバージョンでは有効ですが、新しい/最新のバージョンでは機能しません。新しいバージョン(1.7.7.4)用に同じソリューションを更新しました。他のバージョンにも使用される可能性があります。

クラスチェンジ/Dispatcher.php

上記ファイルの55行目くらいにコピペ

public $default_routes = [
        'category_rule' => [
            'controller' => 'category',
             **/**  added 1 line below*/
            'rule' => '{category:/}{id}-{rewrite}/',
             /** commented   1line below*/
            /**'rule' => '{id}-{rewrite}',*/
            'keywords' => [
                'id' => ['regexp' => '[0-9]+', 'param' => 'id_category'],
                /*** added  1 line below*/
                'category' => ['regexp' => '[_a-zA-Z0-9-\pL]*'],
                'rewrite' => ['regexp' => self::REWRITE_PATTERN],
                'meta_keywords' => ['regexp' => '[_a-zA-Z0-9-\pL]*'],
                'meta_title' => ['regexp' => '[_a-zA-Z0-9-\pL]*'],**
            ],
        ],

ファイル classes/で関数をlink.php見つけ、getCategoryLinkそれを以下の関数コードに置き換えます

 /**
     * Create a link to a category.
     *
     * @param mixed $category Category object (can be an ID category, but deprecated)
     * @param string $alias
     * @param int $idLang
     * @param string $selectedFilters Url parameter to autocheck filters of the module blocklayered
     *
     * @return string
     */
    public function getCategoryLink(
        $category,
        $alias = null,
        $idLang = null,
        $selectedFilters = null,
        $idShop = null,
        $relativeProtocol = false
    ) {
        $dispatcher = Dispatcher::getInstance();

        if (!$idLang) {
            $idLang = Context::getContext()->language->id;
        }

        $url = $this->getBaseLink($idShop, null, $relativeProtocol) . $this->getLangLink($idLang, null, $idShop);

        // Set available keywords
        $params = [];

        if (!is_object($category)) {
            $params['id'] = $category;
        } else {
            $params['id'] = $category->id;
        }

        // Selected filters is used by the module ps_facetedsearch
        $selectedFilters = null === $selectedFilters ? '' : $selectedFilters;

        if (empty($selectedFilters)) {
            $rule = 'category_rule';
        } else {
            $rule = 'layered_rule';
            $params['selected_filters'] = $selectedFilters;
        }

        if (!$alias) {
            $category = $this->getCategoryObject($category, $idLang);
        }
        $params['rewrite'] = (!$alias) ? $category->link_rewrite : $alias;
        if ($dispatcher->hasKeyword($rule, $idLang, 'meta_keywords', $idShop)) {
            $category = $this->getCategoryObject($category, $idLang);
            $params['meta_keywords'] = Tools::str2url($category->getFieldByLang('meta_keywords'));
        }
        if ($dispatcher->hasKeyword($rule, $idLang, 'meta_title', $idShop)) {
            $category = $this->getCategoryObject($category, $idLang);
            $params['meta_title'] = Tools::str2url($category->getFieldByLang('meta_title'));
        }
        
        if ($category !='var'){
        $category = $this->getCategoryObject($category, $idLang);
        $pcategory= new Category($category->id_parent, $idLang);
        if($category->id_parent!=1 && $category->id_parent!=2){
            $params['category'] = $pcategory->link_rewrite;
            //append the categoryID with its name
            $params['category'] = $category->id_parent . '-'. $params['category'];
        }
    }
        
        return $url . Dispatcher::getInstance()->createUrl($rule, $idLang, $params, $this->allow, '', $idShop);
    }

同じファイルの classes/link.php update if condition は、(関数 getProductLink) のコードの 218 行目で次のようになります。

if ($dispatcher->hasKeyword('product_rule', $idLang, 'categories', $idShop)) {
            $product = $this->getProductObject($product, $idLang, $idShop);
            $params['category'] = (!$category) ? $product->category : $category;
            $cats = [];
            
            foreach ($product->getParentCategories($idLang) as $cat) {
                
                if (!in_array($cat['id_category'], Link::$category_disable_rewrite)) {
                    //remove root and home category from the URL
                    //commented the line below 
                    //$cats[] = $cat['link_rewrite'];
                    //replaced the above line with the line below to append the category ID in the products link


                    $cats[] = $cat['id_category'].'-'.$cat['link_rewrite'];
                }
            }
            $params['categories'] = implode('/', $cats);
        }

たまたま prestashop バージョン 1.7.7.4 を使用していました。このソリューションが私のサイトhttps://jinbaba.pkで動作しているのを見ることができます

また、コード ファイルで上記の変更を行った後、忘れずにshopparameters-->SEO&URL設定を更新し、次のようにカテゴリと製品ルートを変更します (まだこのようになっていない場合)。

"Route to category" = {category:/}{id}-{rewrite}

"Route to product" = {categories:/}{id}{-:id_product_attribute}-{rewrite}{-:ean13}.html

SEO のための単なる提案 : URL からカテゴリ ID と製品 ID を削除する必要はありません。SEO への影響は最小限か、まったくありません。

また、aboutソリューションは2レベルのネスティングでも機能します。

yourdomain.com/category-1/category-2/1-product.html

カタログにカテゴリのネストをこれ以上作成しないでください。サイトをより深くネストする予定がある場合は、このソリューションを更新する必要があります。ただし、SEO の場合、深いネスティングは推奨されません。

于 2021-05-22T19:43:50.847 に答える