上記のコードは古いバージョンでは有効ですが、新しい/最新のバージョンでは機能しません。新しいバージョン(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 の場合、深いネスティングは推奨されません。