Drupal:如何以编程方式为节点创建URL别名,该节点在节点保存时已经有别名?
我有一个自定义模块,它实现了hook nodeapi,以便在创建或更新节点时执行一些代码 基本上,我想根据节点保存或更新时自动生成的别名创建一个别名 现在,我正在使用对path_set_alias的调用,我只想对特定类型的内容“product”执行此操作 这是我的点名电话,让我开始Drupal:如何以编程方式为节点创建URL别名,该节点在节点保存时已经有别名?,drupal,Drupal,我有一个自定义模块,它实现了hook nodeapi,以便在创建或更新节点时执行一些代码 基本上,我想根据节点保存或更新时自动生成的别名创建一个别名 现在,我正在使用对path_set_alias的调用,我只想对特定类型的内容“product”执行此操作 这是我的点名电话,让我开始 function product_url_helper_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { if($node->type == 'produ
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;
}
然后我有了这个函数,我正试图获得这个函数来为我保存第二个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>");
}
函数\u创建\u备用\u url($node){
$aliasExists=db_fetch_对象(db_查询(“从{url_alias}中选择count(dst)作为总计,其中dst='alternate/“$node->path.”);
如果($aliasExists->total==0){
$product\U url=$node->path;
$alternate_url=“alt/”$node->path;
$default\u node\u path=“node/”$node->nid;
路径设置别名($default_node_path,$alternate_url,0,”);
drupal_set_消息(“为产品创建了备用路径:“.$node->title。”
路径现在别名为”);
}
但这并没有设置别名,它只是创建了产品原始别名的副本。因此,如果我一开始的产品是“绿色蕨类植物”。我会保存它,它会使用pathauto生成products/Green蕨类植物,然后在调用我的模块代码后,生成别名“alt/products/Green蕨类植物”,并且仍然将其指向“节点/nid”路径
但是,当我运行此代码时,会在数据库中创建一个副本。因此我保存了Green Fern一次,突然在数据库中url_别名的末尾看到两个重复的记录。“products/Green Fern”和“products/Green Fern”
我觉得我是在用一种过于comlpex的方式来思考这个问题。我的客户知道当他们向同一个节点创建多个别名点时,他们会受到SEO的影响,他们只是希望它这样做。暂停!您在代码中显式地将pid设置为0。我可以想象,此代码运行的第二个节点将返回错误。请重试在
path\u set\u alias()
调用中将0设置为NULL。很难判断您希望别名有多复杂,但该模块似乎是解决问题的简单方法。它允许您根据令牌自动生成别名
作为奖励,它与模块配合得很好,模块将在重复别名上设置303个重定向(或任何您想要的重定向)。这将在一定程度上缓解您的SEO担忧
编辑:
您是否确定未经编译的代码正确调用了函数?
path\u set\u alias
的相关部分包括:
if ($pid) {
// An existing alias.
// *** You set pid to 0, so this doesn't fire ***
}
else if ($path && $alias) {
// Check for existing aliases.
if ($alias == drupal_get_path_alias($path, $language)) {
// There is already such an alias, neutral or in this language.
// Update the alias based on alias; setting the language if not yet done.
db_query("UPDATE {url_alias} SET src = '%s', dst = '%s', language = '%s' WHERE dst = '%s'", $path, $alias, $language, $alias);
}
else {
// A new alias. Add it to the database.
// *** If your code is correct, this is the part that should fire. ***
db_query("INSERT INTO {url_alias} (src, dst, language) VALUES ('%s', '%s', '%s')", $path, $alias, $language);
}
}
如果您正在测试站点上工作,还可以尝试删除一些
dpm()
s位于节点.module中的db\u查询之前
s,以找出代码的哪些部分实际触发,以及哪些数据进入其中。JR,改进Drupal7中的代码,db\u查询是昂贵的。更好的方法是使用lookup\u path drupal函数:
$urlAlias = drupal_lookup_path('alias',"node/".$node->nid . '/prices');
如果urlAlias没有值,则此url没有别名,因此我们可以安全地创建它:
if( urlAlias == '' )
path_set_alias($default_node_path, $alternate_url, 0, '');
正在检测节点的重复别名,并使用默认内容类型模式覆盖自定义别名。默认情况下,pathauto将在执行更新操作时创建新别名并删除旧别名
如果您将更新操作选项切换到管理屏幕上的“创建新别名。保持现有别名正常工作”,即/admin/config/search/path/settings
,则不会覆盖自定义别名。顺便说一句,在drupal7中,我们应该使用path\u save($args=array(“source”=>$non\u alias\u path,“alias”)更改path\u alias“=>$new_别名_url);)