如何在PrestaShop中创建类别/子类别友好URL?
我有一个关于设置类别和子类别的友好URL格式以及获取匹配产品的问题。我正在使用PrestaShop 1.5.2.0 假设我们有这样一个结构: 类别1如何在PrestaShop中创建类别/子类别友好URL?,prestashop,Prestashop,我有一个关于设置类别和子类别的友好URL格式以及获取匹配产品的问题。我正在使用PrestaShop 1.5.2.0 假设我们有这样一个结构: 类别1 备件 配件 第2类 筹码 配件 我想显示如下链接:/category-1/附件,并显示category-1->附件中的产品。我怎样才能做到这一点 当前的行为是当我单击附件时,在类别1中,链接是/associates,显示的产品同时属于/category-1/附件和/category-2/附件 谢谢 这个问题在PrestaShop论坛上得到了
- 备件
- 配件
- 筹码
- 配件
谢谢 这个问题在PrestaShop论坛上得到了回答。 你可以在这里找到它 解决方案-将此更改添加到fallowing类 CLASSES/Dispatcher.php
'rule' => '{categories:/}{id}-{rewrite}/',
'categories' => array('regexp' => '[/_a-zA-Z0-9-\pL]*'),
$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));
CLASSES/Link.php
'rule' => '{categories:/}{id}-{rewrite}/',
'categories' => array('regexp' => '[/_a-zA-Z0-9-\pL]*'),
$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));
上述代码对旧版本有效,但对新/最新版本无效。我为新版本(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中,在代码的第218行更新if条件(函数getProductLink)
我碰巧使用的是prestashop版本1.7.7.4。你可以在我的网站上看到这个解决方案
同样,在代码文件中进行上述更改后,不要忘记更新shopparameters-->SEO&URL
设置,按如下方式更改类别和产品路线(如果它们不是这样的话)
“类别路由”={category://}{id}-{rewrite}
“产品路线”={categories://}{id}{-:id\u产品\属性}-{rewrite}{-:ean13}.html
只是一个SEO建议:您不需要从URL中删除类别ID和产品ID。它们对搜索引擎优化的影响很小或没有影响
此外,about解决方案也适用于2级嵌套,例如
yourdomain.com/category-1/category-2/1-product.html
不要在目录中创建更多类别嵌套。如果您计划创建更深入的嵌套站点,则需要更新此解决方案。但是,对于SEO,不建议使用深层嵌套