Let’s follow the white rabbit.
http://core.trac.wordpress.org/browser/tags/3.3.1/wp-login.php#L414
…can’t be changed, it’s hardcoded. However it leads to here when clicked:
http://core.trac.wordpress.org/browser/tags/3.3.1/wp-login.php#L481
…which has a wp_signup_location filter for multisite, which in case your site !is_multisite() will never fire off. If you’re multisite – stop here.
add_filter( 'wp_signup_location', 'wpse_46848_hijack_the_back' );
function wpse_46848_hijack_the_back( $location ) {
return 'my-registration-page-is-better.php';
}
Not multisite, eh?
registration_redirect is what happens AFTER registration, yet it’s called before displaying the registration page. We can play dirty and hook into it and diverge into a wp_redirect with an exit() before displaying anything from the original page.
add_action( 'registration_redirect', 'wpse_46848_hijack_the_back' );
function wpse_46848_hijack_the_back( $redirect_to ) {
wp_redirect( 'my-registration-page-is-better.php' );
exit();
}
Note, that both add_action and add_filter work in the same way (add_action calls add_filter), and although it’s generally not advisable to mix them as things will get confusing, semantically you’re hijacking with the filter with an action, not a filter (since you’re not returning anything). If you prefer to stick to strict “a filter is a filter, an action is an action” rules do this:
add_filter( 'registration_redirect', 'wpse_46848_hijack_the_back' );
function wpse_46848_hijack_the_back( $redirect_to ) {
wp_redirect( 'my-registration-page-is-better.php' );
return exit();
}