如何批量重写PrestaShop商品友好URL(非.htaccess文件)
遇到这种批量URL和商品名称不匹配的情况确实头疼,手动逐个生成效率太低,下面给你几个靠谱的批量解决方法,亲测适配大多数PrestaShop版本(1.6/1.7都适用):
方法一:数据库删除+后台自动生成(最简便)
PrestaShop的友好URL重写规则存在ps_url_rewrite表中(如果你的数据库前缀不是ps_,记得替换成实际前缀,比如presta_url_rewrite),商品对应的记录entity_type字段值为product,id_entity关联商品表ps_product的id_product。
步骤:
先备份数据库! 这是重中之重,避免误操作导致数据丢失:
-- 备份URL重写表(替换前缀为你的实际前缀) CREATE TABLE ps_url_rewrite_backup AS SELECT * FROM ps_url_rewrite;删除所有商品类型的URL重写记录:
DELETE FROM ps_url_rewrite WHERE entity_type = 'product';触发系统自动生成正确URL:
进入PrestaShop后台,根据版本找到对应位置:- 1.7版本:
Shop Parameters > Traffic & SEO > URL rewriting,点击Generate rewrite rules按钮 - 1.6版本:
首选项 > SEO & URL,点击生成重写规则按钮
这个操作会批量重新生成所有商品的友好URL,完全基于商品名称自动生成正确的slug。
- 1.7版本:
注意:如果有部分商品是你手动设置的自定义URL,删除后会被系统覆盖,建议提前备份这些自定义记录:
CREATE TABLE ps_url_rewrite_custom_backup AS SELECT * FROM ps_url_rewrite WHERE entity_type = 'product' AND meta_url NOT LIKE '%-p-%';
方法二:PHP脚本精准更新(适合保留自定义URL的场景)
如果你不想删除所有商品URL,只想批量修正错误的记录,可以写一个简单的PHP脚本,调用PrestaShop内置函数生成正确的slug并更新数据库:
在PrestaShop根目录创建
fix_product_urls.php文件,内容如下:<?php require_once(dirname(__FILE__).'/config/config.inc.php'); require_once(dirname(__FILE__).'/init.php'); // 获取当前后台语言(如果是多语言,可循环遍历所有语言ID) $id_lang = Context::getContext()->language->id; // 获取所有商品 $products = Product::getProducts($id_lang, 0, 0, 'id_product', 'ASC'); foreach ($products as $product) { $product_obj = new Product($product['id_product']); // 用PrestaShop内置函数生成正确的URL slug $slug = Tools::link_rewrite($product_obj->name); // 拼接标准商品URL格式:slug-p-商品ID.html $new_url = $slug . '-p-' . $product['id_product'] . '.html'; // 更新数据库中的URL记录 Db::getInstance()->update( 'url_rewrite', array('meta_url' => $new_url), 'entity_type = "product" AND id_entity = ' . (int)$product['id_product'] . ' AND id_lang = ' . (int)$id_lang ); echo "已修复商品ID {$product['id_product']} 的URL:{$new_url}<br>"; } echo "<br>所有商品URL修复完成!"; ?>通过浏览器访问这个脚本(比如
https://你的店铺域名/fix_product_urls.php),或者用命令行运行:php fix_product_urls.php运行完成后立即删除这个脚本,避免安全风险。
提示:如果你的店铺是多语言版本,需要循环遍历所有语言ID,把
$id_lang换成语言ID数组的循环即可,比如$languages = Language::getLanguages(true); foreach($languages as $lang) { $id_lang = $lang['id_lang']; ... }
注意事项
- 操作前一定要备份数据库,尤其是直接修改数据库的操作
- 如果使用脚本方法,确保你的PHP版本符合PrestaShop的要求,避免函数兼容问题
- 生成新URL后,可以在前台测试几个商品,确认URL和商品名称匹配
内容的提问来源于stack exchange,提问作者Mireck

