As we discussed in my previous post, clean URL is one of the option to improve SEO. We've module called pathauto to clean URLs in drupal 7. It can allow us to set alias for content types, files, users & taxonomies. But we can set only one URL alias for a content type in drupal 7. You can set URL alias for a content type at admin/config/search/path/patterns. It looks like below image:
Suppose you need two path for a content. For instance, the URL alias for a article need to node title and also article/node-title. Is it possible to set multiple path alias for a content type in drupal 7? Yes it is possible in drupal 7. We can set multiple URL alias for a conten type programmatically using pathauto module in drupal 7. We need to insert our path alias into the "url_alias" table while inserting & updating a node and remove path alias When delete a node.
For instance, I've choosen article content type. We need to insert & update a URL alias into the "url_alias" table using hook_node_insert() & hook_node_update() in drupal 7.
/**
* Implements hook_node_insert()
*/
function phponwebsites_node_insert($node) {
if ($node->type == 'article') {
//save node alias
_phponwebsites_insert_update_alias($node);
}
}
/**
* Implements hook_node_update()
*/
function phponwebsites_node_update($node) {
if ($node->type == 'article') {
//update node alias
_phponwebsites_insert_update_alias($node);
}
}
/**
* Insert and update alias for course
*/
function _phponwebsites_insert_update_alias($node) {
module_load_include('inc', 'pathauto');
$title = pathauto_cleanstring($node->title);
$values['source'] = 'node/' . $node->nid . '/article';
$values['alias'] = 'article/' . $title;
$all_values = array($values);
foreach ($all_values as $all) {
$query = db_merge('url_alias')
->fields(array('source' => $all['source'], 'alias' => $all['alias'], 'language' => LANGUAGE_NONE))
->key(array('source' => $all['source']))
->execute();
}
}
Where,
pathauto_cleanstring is obey the pathatuo module's rules which is mentioned at admin/config/search/path/settings. To know more details of pathauto_cleanstring, please visit http://www.drupalcontrib.org/api/drupal/contributions!pathauto!pathauto.inc/function/pathauto_cleanstring/7
After added the above code into your custome module(clear cache), you will create a article. You just test your url at admin/config/search/path in the pathauto's list. It looks like below image:
Now you could access the article by both node-title as well as article/node-title.
We've inserted 2 URL alias for a node. So we need to delete those from "url_alias" table when delete a node. We can trigger it using hook_node_delete() in drupal 7. Consider the below code:
/**
* Implements hook_node_delete()
*/
function arep_node_delete($node) {
if ($node->type == 'article') {
//delete node alias for ceu and non-ceu course
module_load_include('inc', 'pathauto');
$source[0] = 'node/' . $node->nid . '/article';
foreach ($source as $s) {
$path = path_load(
array('source' => $s)
);
path_delete($path['pid']);
}
}
}
Where,
path_load returns the details of a URL alias like source, alias, path id & language. To know more details of path_load(), please visit https://api.drupal.org/api/drupal/includes!path.inc/function/path_load/7.x.
After added the above code into your customer module(clear cache), you will delete a node and check your URL alias at admin/config/search/path. Now tt should not be displayed here.
Now I've hope you know how to set multiple URL alias for a content type.
Suppose you need two path for a content. For instance, the URL alias for a article need to node title and also article/node-title. Is it possible to set multiple path alias for a content type in drupal 7? Yes it is possible in drupal 7. We can set multiple URL alias for a conten type programmatically using pathauto module in drupal 7. We need to insert our path alias into the "url_alias" table while inserting & updating a node and remove path alias When delete a node.
Add URL alias programmatically when insert and update a node using pathauto module in drupal 7:
For instance, I've choosen article content type. We need to insert & update a URL alias into the "url_alias" table using hook_node_insert() & hook_node_update() in drupal 7.
/**
* Implements hook_node_insert()
*/
function phponwebsites_node_insert($node) {
if ($node->type == 'article') {
//save node alias
_phponwebsites_insert_update_alias($node);
}
}
/**
* Implements hook_node_update()
*/
function phponwebsites_node_update($node) {
if ($node->type == 'article') {
//update node alias
_phponwebsites_insert_update_alias($node);
}
}
/**
* Insert and update alias for course
*/
function _phponwebsites_insert_update_alias($node) {
module_load_include('inc', 'pathauto');
$title = pathauto_cleanstring($node->title);
$values['source'] = 'node/' . $node->nid . '/article';
$values['alias'] = 'article/' . $title;
$all_values = array($values);
foreach ($all_values as $all) {
$query = db_merge('url_alias')
->fields(array('source' => $all['source'], 'alias' => $all['alias'], 'language' => LANGUAGE_NONE))
->key(array('source' => $all['source']))
->execute();
}
}
Where,
pathauto_cleanstring is obey the pathatuo module's rules which is mentioned at admin/config/search/path/settings. To know more details of pathauto_cleanstring, please visit http://www.drupalcontrib.org/api/drupal/contributions!pathauto!pathauto.inc/function/pathauto_cleanstring/7
After added the above code into your custome module(clear cache), you will create a article. You just test your url at admin/config/search/path in the pathauto's list. It looks like below image:
Now you could access the article by both node-title as well as article/node-title.
Delete URL alias programmatically when delete a node using pathauto module in drupal 7:
We've inserted 2 URL alias for a node. So we need to delete those from "url_alias" table when delete a node. We can trigger it using hook_node_delete() in drupal 7. Consider the below code:
/**
* Implements hook_node_delete()
*/
function arep_node_delete($node) {
if ($node->type == 'article') {
//delete node alias for ceu and non-ceu course
module_load_include('inc', 'pathauto');
$source[0] = 'node/' . $node->nid . '/article';
foreach ($source as $s) {
$path = path_load(
array('source' => $s)
);
path_delete($path['pid']);
}
}
}
Where,
path_load returns the details of a URL alias like source, alias, path id & language. To know more details of path_load(), please visit https://api.drupal.org/api/drupal/includes!path.inc/function/path_load/7.x.
After added the above code into your customer module(clear cache), you will delete a node and check your URL alias at admin/config/search/path. Now tt should not be displayed here.
Now I've hope you know how to set multiple URL alias for a content type.
Related articles:
Remove speical characters from URL alias using pathauto module in Drupal 7
Add new menu item into already created menu in Drupal 7
Add class into menu item in Drupal 7
Create menu tab programmatically in Drupal 7
Add custom fields to search api index in Drupal 7
Clear views cache when insert, update and delete a node in Drupal 7
Create a page without header and footer in Drupal 7
Login using both email and username in Drupal 7
Update multiple fields using #ajax in Drupal 7
Remove speical characters from URL alias using pathauto module in Drupal 7
Add new menu item into already created menu in Drupal 7
Add class into menu item in Drupal 7
Create menu tab programmatically in Drupal 7
Add custom fields to search api index in Drupal 7
Clear views cache when insert, update and delete a node in Drupal 7
Create a page without header and footer in Drupal 7
Login using both email and username in Drupal 7
Update multiple fields using #ajax in Drupal 7