One of our client want functionality to change username in edit profile which is easy. We are using pathauto module for pretty URL in Drupal7.
I faced two issues when changing username. which are explained here..

First Issue

We are using username paths (/users/[username]). After changing a username the url alias doesn’t change and the user edit page doesn’t have an option to change it manually.

Second Issue

We are using username before nodes urls. for after changing username Node uel alias does not change automatically.

Solution (for first issue):
For fist issue I used rules modeuls and created following rule:

You can create rule using following export rule.

{ "rules_change_user_url_alias" : {
    "LABEL" : "Change user URL alias",
    "PLUGIN" : "reaction rule",
    "REQUIRES" : [ "rules", "path" ],
    "ON" : [ "user_update" ],
    "IF" : [
      { "NOT data_is" : { "data" : [ "account-unchanged:name" ], "value" : [ "account:name" ] } }
    ],
    "DO" : [
      { "path_alias" : { "source" : "user\/[account:uid]", "alias" : "member\/[account:name]" } }
    ]
  }
}

Solution (for Second issue):
For second issue, I written custom code as follows:
I used user_update hook for solving this issue.
You just need to put following code in your custom module. It will find all nodes of editing user (logged in user) and update url alias.

/*
 * On user update call this method for updating the node url in url_alias
 */
function MYMODULE_user_update(&$edit, $account, $category) {
    //getting all nodes
    $nodes = get_user_node_by_type('custom_node_type',$account->uid);
    //loop for all nodes of logged in User
    if(!empty($nodes)) {
        foreach ($nodes as $key => $node) {
            //load path auto module
            if(module_load_include('inc','pathauto','pathauto') !== FALSE) {
                if (function_exists('pathauto_cleanstring')) {
                //generates clear url title from node title
                $currnt_page_title_alias = pathauto_cleanstring($node->title); // define in pathauto.inc file.
                //generate new url for selected node
                $new_url=$account->name.'/'.$currnt_page_title_alias;
                // echo 'node/'.$node->nid;die;
                $query = db_query("select u.pid from {url_alias} AS u WHERE u.source = 'node/$node->nid'");         
                $result = $query->fetchAll();
                    //If url alias found for node than update the alias
                    if(!empty($result)) {
                        db_query("UPDATE {url_alias} AS u SET u.alias = '$new_url' WHERE u.source = 'node/$node->nid'");
                    }
                }
            }
        }
    }
}

/*
 * Return User nodes based on UID and node type
 */
function get_user_node_by_type($node_type, $uid){
  $nodes = array();
  $nids = db_query('SELECT nid FROM {node} WHERE uid = :uid AND type = :type', array(':uid' => $uid, ':type' => $node_type))->fetchCol();
  if (!empty($nids)) {
    $nodes = node_load_multiple($nids);    
  }
  return $nodes;
}

Above code will solve my problem. When I edit my username, It collects all nodes which are created by that user and update the url_alias of nodes.

Written by Purab

My name is Purab, Here is my Personal Blog: wpapi.com. I contributor of many wordpress plugins and Drupal Modules. I am core developer of Drupal. Connect to on LinkedIn or Follow @purab on Twitter or Follow me on Google+ or Write Mail to purabdk@gmail.com or Chat with me on Skype : purabdk

Leave a Comment

Your email address will not be published. Required fields are marked *