Change 'Back To Website' link in wp-login.php

The login form on the page wp-login.php has a link at the bottom that says “Back to website-name
This link always redirects to the home page I would like it to redirect to the page the user has come from.

I imagine this requires a hook added to functions.php but I’m not sure how and could not find anything while searching.

Any ideas?

Solutions Collecting From Web of "Change 'Back To Website' link in wp-login.php"

You can achieve that using Javascript and login_footer action hook to change the href attribute of the Back to link:

<?php

add_action('login_footer', 'ad_login_footer');

function ad_login_footer() {
    $ref = wp_get_referer();
    if ($ref) :
?>
<script type="text/javascript">
    jQuery(document).ready(function($){
        $("p#backtoblog a").attr("href", '<?php echo esc_js($ref); ?>');
    });
</script>
<?php
    endif;
}

?>

Edit:

Thanks to @brasofilo answer, you might need to load jQuery in wp-login.php. It might be loaded already by your theme or another plugin, so you have to check. To load jQuery in order to use the above code:

add_action('login_head', 'jquery_for_wp_login');

function jquery_for_wp_login() {
    wp_print_scripts(array('jquery'));
}

That link don’t have any hook that allows modifying it directly.

It has to be done with Javascript, and, as the login page doesn’t load jQuery by default (at least, that’s what’s happening in my test environment), I’ve searched for a pure JS solution.

So, this code hooks into login_footer action and prints a JS script that will change the link to history.go(-1);.

add_action( 'login_footer', 'change_back_to_blog_wpse_82152' );

function change_back_to_blog_wpse_82152()
{
    ?>
    <script type="text/javascript">
        function init() {
          // quit if this function has already been called
          if (arguments.callee.done) return;

          // flag this function so we don't do the same thing twice
          arguments.callee.done = true;

          // kill the timer
          if (_timer) clearInterval(_timer);

          // CHANGE THE LINK
          document.
              getElementById('backtoblog').
              getElementsByTagName('a')[0].
              href = 'javascript:history.go(-1);';
        };

        /* for Mozilla/Opera9 */
        if (document.addEventListener) {
          document.addEventListener("DOMContentLoaded", init, false);
        }

        /* for Internet Explorer */
        /*@cc_on @*/
        /*@if (@_win32)
          document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
          var script = document.getElementById("__ie_onload");
          script.onreadystatechange = function() {
            if (this.readyState == "complete") {
              init(); // call the onload handler
            }
          };
        /*@end @*/

        /* for Safari */
        if (/WebKit/i.test(navigator.userAgent)) { // sniff
          var _timer = setInterval(function() {
            if (/loaded|complete/.test(document.readyState)) {
              init(); // call the onload handler
            }
          }, 10);
        }

        /* for other browsers */
        window.onload = init;
    </script>
    <?php
}

If you’re looking for a PHP solution, I’d go for this:

  • There is no specific hook/action/filter you can make use of for that link.
  • However, there is the general home_url filter in action on that login page.

What you can do is to take a fingerprint of hook functions that are called on that page, check the requested page and create a conditional filtering that is filtering the home_url value only in this specific scenario.

Wrap it up nicely in a plugin of it’s own and keep it in the must-use plugin folder for example. Prevents you from hacking core (e.g. if you’re not using any version control).

Otherwise if you’re under git, just branch out, add a filter your own for that link, introduce the plugin and keep current when you need to (less hassles).