First of all, you need CCK module installed to install Content Profile, and after download and place in your modules directory, you need Content Profile and Content Profile User Registration.

By default after install content profile, it auto creates a content type named Profile.

With that, you should create new fields for your profile, as name, address, and others convenient to your application. You can also ignore or delete this, and create a new content type to become your 'profile' type.

After creating your fields, you can now integrate that directly to the user register form, by clicking in the Content profile tab in the correspondent type edit page, but in case this link does not exist,
certify to check the option "Use this content type as a content profile for users".

Now in the Profile page of your content type, you have now a dozen of custom settings, and you may see the group User Registration, and you need to check Use on Registration, and you can also hide fields from your type in the registration form. Remember, if you don`t want the body field, you can delete its
label from the type edit page, and with that, it will become inaccessible.

Your user register page has now the fields from your content type, plus the default register fields like email, username, and password.

This should be enough in most cases, but you may need to place your node type fields before the default register fields, and, trying to clarify the things a bit, the content profile merges the user register form with your node form (custom profile type). So to change the order of them in the user register page, you need to go in your type profile settings, and find the Weight field, and set it to be lighter than the user register form.

Now, going again to the user register page, we have now our node type fields placed before the default register fields.

But, again, this may not be enough, and you may need to custom the order of the fields, by mixing the node type fields with the user register fields, for example, Name, Username, Email, Telephone, Country, and Password. In this case, there is no configuration page and we will have to code a bit.

First, you need a custom module, if you don't know how, check this up (

An important point to highlight, is that this module need to be executed after the module content_profile_registration. If you open your database, and go to the table system, you will see that you module should have the weight = 0, and the module content_profile_registration has its weight = 1, so, just update your module`s weight to 2. Follows the sql query:

update system set weight = 2 where name = 'mymodule';

After that, we need to implement a hook_form_alter, create a #content_profile_weights key in the form array, with a position for each field, and its correspondent weight and applies a content profile pre render to change the fields weights. Follows a small piece of code that does that.

 * Implementation of hook_form_alter().
function mymodule_form_alter(&$form, &$form_state, $form_id) {
//We need to manipulate the user_register form
if ($form_id === 'user_register') {
//Define a very light number
$counter = -10000;
//Create an array that has the exac order of your fields
$order_fields = array(
//Explicit the order of each field from the array
foreach ($order_fields as $field) {
$form['#content_profile_weights'][$field] = $counter++;
$form['#pre_render'] = !$form['#pre_render'] ? array() : $form['#pre_render'];
//Apply a content profile render specifically to change the fields weights
array_unshift($form['#pre_render'], 'content_profile_registration_alter_weights');
//Fix data in form state
array_unshift($form['#submit'], '_content_profile_fix_formstate_values');

 * For some reason, the submitted data is not been sent correctly, and I just get them back in this function
function _content_profile_fix_formstate_values(&$form, &$form_state){
//This function is in submit, so the data has already been validated
$pass = $form['#post']['pass']['pass1'];
$form_state['values'] = $form['#post'];
$form_state['values']['pass'] = $pass;

In the $order_fields array, it has the common machine name fields in the user register, 'name', 'mail' and 'pass'. And the other field names are all from my profile node type and they must be
also the machine names, and you can check this in the Manage fields from your profile content type.

And Voilà! We have now a customized user register form.