标签归档:批量修改产品URL

Magento API – 批量修改产品URL

System->Configuration->Catalog->Search Engine Optimizations
Magento搜索引擎优化

Product URL Suffix					产品页面URL后缀
Category URL Suffix					目录页面URL后缀
Use Categories Path for Product URLs		是否为URL添加目录路径
Create Permanent Redirect for URLs if URL Key Changed	当URL改变时是否添加旧链接到新链接的永久定位

关于是否重定向到新链接这个开关,当编辑一个产品时:
Magento编辑产品

如果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,这个表将重新构建(根据元数据)。

Magento重写索引刷新

构建的依据就是上面提到的参数。看下这个表结构:

Magento core_rewite表

这里为每个商店都产生了一份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_key生成的。
Magento重写URL内容

所以,我们根本不需要去修改url_path,只需要修改url_key即可(后台刷新索引后修改的url_path就会被url_key纠正)。

下面看看在选择了Create Permanent Redirect for old URL时写入了什么内容:

Magento重写重定向

这些个东西怎么设计的就搞不懂了。

实际上,URL主要有两个元数据,url_key和url_path,这两个数据更随着产品或目录,所以我们要修改数据时,实际只要修改这两个元数据(只要改url_key)。下面通过URL来修改:

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。为何如此耗费资源,首先获取所有产品列表,这个不算耗费资源,接下来是获取产品信息,这个是涉及多个表查询,会耗费大量资源(这个过程循环所有产品数次),然后更新属性值。所以稍微做些调整:

$entity = $client->catalogProductInfo($session,$pid);
改为:
$entity = $client->catalogProductInfo($session,$pid,'0',array('name','sku'));

这样资源的消耗降低得非常明显。检索EAV模型的数据时,一定要指定需要的属性,否则吃不消。

通过以上分析,URL的修改,其实只要修改url_key即可,其它的,在生成索引时会自动完成(纠正)。那么直接操作SQL一样可以。不过看起来和上面的例子也差不多了。

接下来看Catalog->URL Rewrite Management
Magento重写URL管理

这个就是core_url_rewrite的内容,可以编辑修改URL,不过比较悲催的是,当修改了URL之后,如果重新刷新重写索引,被修改的链接被重定向到未修改之前的链接。除非你永不刷新重写索引,否则最好不要使用这个功能。(本质上,这里是希望针对同一个产品对不同商店应用不同链接,在这里修改事实上也可以实现,就是刷新索引后数据丢失,所以比较脑残)

永久链接:http://blog.ifeeline.com/568.html
原创文章,转载务必保留出处。