2011-01-26 44 views
7

我有一個自定義模塊,實現掛鉤節點,以在節點創建或更新時執行一些代碼。Drupal:如何以編程方式爲已在節點上保存別名的節點創建URL別名?

基本上我想根據自動生成的節點保存或更新別名創建一個別名。

現在我正在使用對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; 
} 

然後,我有這個功能,一個我試圖去挽救我的第二個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>"); 
} 

雖然沒有設置別名,但它只是創建產品原始別名的副本。所以如果我開始使用我的產品是「綠色蕨類植物」。我會保存它,然後在調用我的模塊代碼並使別名爲「alt/products/green-fern」後仍然使用pathauto生成products/green-fern,然後使其返回到「node/nid」路徑。

但是,當我運行此代碼時,會創建數據庫中的副本。所以我一次保存了Green Fern,並且突然間我在數據庫中的url_alias末尾看到了兩個重複的記錄。 「產品/綠色蕨類植物」和「產品/綠色蕨類植物」

我覺得我正以一種非常共同的方式思考這個問題。我的客戶意識到他們在向同一個節點提供多個別名時會得到SEO搜索,他們只是想讓它做到這一點。 HALP!

回答

0

您明確地在代碼中將pid設置爲0。我會想象這個代碼運行的第二個節點會返回一個錯誤。嘗試在您的path_set_alias()調用中將0更改爲NULL。

1

很難說出你想要別名的複雜程度,但pathauto模塊看起來像是解決您的問題的簡單方法。它允許您基於令牌自動生成別名。

作爲獎勵,它很好地與path_redirect模塊配合使用,它將在重複的別名上設置303個重定向(或任何重定向)。這將有助於緩解您的搜索引擎優化問題。

編輯:

你是超級騙子確保您的未編輯的代碼是否正確調用函數? 的path_set_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); 
    } 
    } 

如果你在測試現場工作,你也可以嘗試在node.moduledb_query年代以前丟棄一些dpm()的權利,找出是什麼代碼的部分實際開火,以及他們正在進入哪些數據。

+0

Err,剛纔注意到你已經在使用pathauto了 - 編輯我的響應...... – anschauung 2011-01-28 00:42:59

5

JR,在Drupal7中改進你的代碼,db_querys代價很高。一個更好的辦法可以使用lookup_path Drupal的功能:

$urlAlias = drupal_lookup_path('alias',"node/".$node->nid . '/prices'); 

如果urlAlias沒有價值,再有就是這個URL沒有別名,所以我們可以有把握地創建它:

if(urlAlias == '') 
path_set_alias($default_node_path, $alternate_url, 0, ''); 
+7

順便說一下,在drupal7中我們應該用path_save($ args = array(「source」=> $ non_alias_path,「)來改變path_set_alias。別名「=> $ new_aliased_url);) – 2012-10-16 09:43:24

2

Pathauto是檢測複製節點的別名並用默認的內容類型模式覆蓋自定義的別名。默認情況下,pathauto會在執行更新操作時創建新別名並刪除舊別名。

如果您在管理屏幕/admin/config/search/path/settings上將更新操作選項切換爲「創建新別名。保留現有別名功能」,它將不會覆蓋自定義別名。

相關問題