我有一个自定义模块,它实现了hook nodeapi,以便在创建或更新节点时执行某些代码.
基本上我想基于节点保存或更新时自动生成的别名创建别名.
现在我正在使用对path_set_alias的调用,我只想用特定类型的内容"product"来做这件事.
这是我的nodeapi电话,让我开始
function product_url_helper_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if($node->type == 'product'){
switch($op){
case 'insert':
_create_alternate_url($node);
break;
case 'update':
_create_alternate_url($node);
break;
case 'view':
//do nothing
break;
default:
break;
}
}
return;
}
Run Code Online (Sandbox Code Playgroud)
然后我有这个功能,我正试图为我保存我的第二个URL别名.
function _create_alternate_url($node){
$aliasExists = db_fetch_object(db_query("SELECT count(dst) as total FROM {url_alias} WHERE dst = 'alternate/".$node->path."'"));
if($aliasExists->total == 0){
$product_url = $node->path;
$alternate_url = "alt/" . $node->path;
$default_node_path = "node/" . $node->nid;
path_set_alias($default_node_path, $alternate_url, 0, '');
drupal_set_message("Created Alternate path for Product: " . $node->title . " <br/> Path <a href='/" . $default_node_path ."'>" . $default_node_path . "</a> is now aliased by <a href='/" . $alternate_url . "'>". $alternate_url ."</a>");
}
Run Code Online (Sandbox Code Playgroud)
这不会设置别名,它只会创建产品原始别名的副本.所以,如果我开始使用我的产品"绿蕨".我会保存它,它会使用pathauto生成产品/ green-fern然后调用我的模块代码并创建一个别名"alt/products/green-fern"并仍然让它指向"node/nid"路径.
但是,当我运行此代码时,会在数据库中创建副本.所以我保存了Green Fern一次,突然间我在数据库的url_alias末尾看到两个重复的记录."产品/绿色蕨类植物"和"产品/绿色蕨类植物"
我觉得我正以一种过于复杂的方式思考这个问题.我的客户知道他们在为同一节点制作多个别名时获得的搜索引擎优化命中,他们只是希望它能够做到这一点.HALP!
JR,改进你在Drupal7中的代码,db_querys很贵.更好的方法是使用lookup_path drupal函数:
$urlAlias = drupal_lookup_path('alias',"node/".$node->nid . '/prices');
Run Code Online (Sandbox Code Playgroud)
如果urlAlias没有值,那么这个url没有别名,所以我们可以安全地创建它:
if( urlAlias == '' )
path_set_alias($default_node_path, $alternate_url, 0, '');
Run Code Online (Sandbox Code Playgroud)