Membership protected content page dynamic redirect

I have a login form that appears on the protected content page. Is it possible to have the login form redirect to the page that the member was requesting when the protected content page shows up? I don't see a way to modify the redirect URL dynamically. Please let me know I'm missing something. $_SERVER['HTTP_REFERRER'] is blank as is wp_get_referer() for the login form shortcode I've created. I'd hate to rewrite the function because I don't want it overwritten on an update.

  • Ryan Englin

    Real simple login shortcode -

    function pmn_login_form_shortcode( $atts, $content = null ) {
    
    	extract( shortcode_atts( array(
          'redirect' => ''
          ), $atts ) );
    
    	if (!is_user_logged_in()) {
    		if($redirect) {
    			$redirect_url = $redirect;
    		} else {
    			$redirect_url = get_permalink();
    		}
    		$form = wp_login_form(array('echo' => false, 'redirect' => $redirect_url,'label_log_in' => __( '' ) ));
    	}
    	return '<div id="pmn-login">' . $form . '</div>';
    }
    add_shortcode('loginform', 'pmn_login_form_shortcode');
  • Alexander

    I've looked into this, and I don't think this is possible without modifying the plugin.

    There won't be a referrer because it's not the browser transitioning from one link to another. PHP is forcing a redirect with a location header.

    If you'd like to modify the plugin, the function that needs rewriting is called membership_redirect_to_protected It can be found in functions.php around line 1058

    All that to say, I'll add this as a feature request to Membership. Maybe we could have a login form like this included with the plugin officially, and with support for the referring link. I'll move this to features and feedback as well as touch base with the developer about it.

    Best regards,

  • Eugene Manuilov

    Hi Ryan,

    As fast workaround for your issue, try to add this hook to your plugin/theme:

    add_filter( 'wp_redirect', 'membership_back_redirect_from_protected_page' );
    function membership_back_redirect_from_protected_page( $location ) {
        global $M_options;
    
        $protected_page_url = get_permalink( (int)$M_options['nocontent_page'] );
        if ( $protected_page_url == $location ) {
            // redirecting to protected page, then add backref
            $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
            $location = add_query_arg( 'redirect', urlencode( $current_url ), $location );
        }
    
        return $location;
    }

    And then your shortcode should look like this:

    add_shortcode( 'loginform', 'pmn_login_form_shortcode' );
    function pmn_login_form_shortcode( $atts, $content = null ) {
        extract( shortcode_atts( array( 'redirect' => '' ), $atts ) );
    
        if ( !is_user_logged_in() ) {
            if ( $redirect ) {
                $redirect_url = $redirect;
            } else {
                $redirect_url = isset( $_GET['redirect'] ) ? $_GET['redirect'] : get_permalink();
            }
    
            $form = wp_login_form( array( 'echo' => false, 'redirect' => $redirect_url ) );
        }
    
        return '<div id="pmn-login">' . $form . '</div>';
    }

    To be honest I haven't tested it, but I suppose it should work fine. Let me know if it doesn't work for you.

    Eugene

  • Ollie

    @Eugene Manuilov : thank you I have given you some points as additional thanks :slight_smile:

    @Ryan Englin : Thanks for raising this issue, I have been looking for solutions for about a month now...

    WPMU Staff: Please add this to the core plugin, its so important.. here is the frustration for customers/end users:

    User receives a Q&A or other link via email that's behind protected content. The user clicks the link from the email and gets redirected to protected content page to login, they login and it does the usual process of redirection after login. The user would need to re find the original link they clicked, It's messy out of the box...

    This worked nicely, it's a shame we have to do a custom fix here because this feels like an essential feature of membership that is missing. :slight_smile:

    Thanks
    Billy