点击数:18272015-07-30 10:26:11 来源: 外贸网站建设,深圳外贸网站建设,深圳网站建设,外贸商城网站制作-亿恩科技
System->Configuration->Catalog->Search Engine Optimizations
关于是否重定向到新链接这个开关,当编辑一个产品时:
如果Create Permanent Redirect for URLs if URL Key Changed设置为NO时,这里的这个选择框默认就不会自动选上,当然了,编辑了这个Key之后,还是可以手动勾上的。
这里出现的URL Key,实际上对应产品实体(编辑目录时是目录实体)的url_key属性(字段),它会和Product URL Suffix组合形成一个值保存到url_path属性(字段),以上面的例子为例,nokia-2610-phone保存到url_key中,而 url_path保存的就是nokia-2610-phone.html。
产品或目录的页面重写后的URL实际上最终要写入core_url_rewrite(一张索引表),当后台更新Catalog URL Rewrites,
构建的依据就是上面提到的参数。看下这个表结构:
这里为每个商店都产生了一份URL(有两个形式):
http://learn.magento.com/electronics/cell-phones/nokia-2610-phone.html http://learn.magento.com/nokia-2610-phone.html
这里有一个是添加了目录的URL,一个是没有添加目录前导的URL,两个都可以访问。当设置成不添加目录前导符时,只会有一个。虽然两个都能访问,但是系统实际只会暴露其中一个。
注意:虽然这里生成了很多份URL,看起来是可以为每个商店对同一个商品指定不同的URL,可是事实并非如此,后台提供的URL KEY的作用域是全局的。每次重新生成URL时都是基于url_key作为基准,纠正对应的url_path(可以改,但是会被纠正),然后使用 url_path产生URL。
具体,每个实体,都只有一个url_key,它的对应store_id为0,但是有多个url_path对应不同的store_id(0,1,2,3…),它是
所以,我们根本不需要去修改url_path,只需要修改url_key即可(后台刷新索引后修改的url_path就会被url_key纠正)。
下面看看在选择了Create Permanent Redirect for old URL时写入了什么内容:
这些个东西怎么设计的就搞不懂了。
实际上,URL主要有两个元数据,url_key和url_path,这两个数据更随着产品或目录,所以我们要修改数据时,实际只要修改这两个元数据(只要改url_key)。下面通过URL来修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
try{
$client = new SoapClient('http://magento.vfeelit.com/api/v2_soap/?wsdl');
$session = $client->login('vfeelit', '1234567890');
$allProducts = $client->catalogProductList($session);
foreach($allProducts as $product){
$pid = (int)$product->product_id;
//$pid = 16;
// storeView 作为第三参数,最好指定,否则就是默认商店
$entity = $client->catalogProductInfo($session,$pid);
$pname = $entity->name;
$sku = $entity->sku;
$url_key = strtolower($pname).'-'.strtolower($sku);
$client->catalogProductUpdate($session,$pid,array('url_key'=>$url_key));
}
}catch(SoapFault $e){
echo $e->getMessage();
}catch(Exception $e){
echo $e->getMessage();
}
|
代码不多,但是相当耗费资源,你可以会得到504。为何如此耗费资源,首先获取所有产品列表,这个不算耗费资源,接下来是获取产品信息,这个是涉及多个表查询,会耗费大量资源(这个过程循环所有产品数次),然后更新属性值。所以稍微做些调整:
1
2
3
|
$entity = $client->catalogProductInfo($session,$pid);
改为:
$entity = $client->catalogProductInfo($session,$pid,'0',array('name','sku'));
|
这样资源的消耗降低得非常明显。检索EAV模型的数据时,一定要指定需要的属性,否则吃不消。
通过以上分析,URL的修改,其实只要修改url_key即可,其它的,在生成索引时会自动完成(纠正)。那么直接操作SQL一样可以。不过看起来和上面的例子也差不多了。
接下来看Catalog->URL Rewrite Management这个就是core_url_rewrite的内容,可以编辑修改URL,不过比较悲催的是,当修改了URL之后,如果重新刷新重写索引,被修改的链接被重 定向到未修改之前的链接。除非你永不刷新重写索引,否则最好不要使用这个功能。(本质上,这里是希望针对同一个产品对不同商店应用不同链接,在这里修改事 实上也可以实现,就是刷新索引后数据丢失,所以比较脑残)