Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Drupal:如何以编程方式为节点创建URL别名,该节点在节点保存时已经有别名?_Drupal - Fatal编程技术网

Drupal:如何以编程方式为节点创建URL别名,该节点在节点保存时已经有别名?

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

我有一个自定义模块,它实现了hook nodeapi,以便在创建或更新节点时执行一些代码

基本上,我想根据节点保存或更新时自动生成的别名创建一个别名

现在,我正在使用对path_set_alias的调用,我只想对特定类型的内容“product”执行此操作

这是我的点名电话,让我开始

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);)