Home > Software engineering >  Non logged in user when try to see a product page will get Login page and after login will be redire
Non logged in user when try to see a product page will get Login page and after login will be redire

Time:10-22

I want to give access Woo product single page only for Logged in users.

I have a product listing on the Homepage and Shop page, What I want is: when a logged out user click on a Product, the user will get a Login form and after Logged in user will be redirected to the Product page that he wanted to View.

So the flow will be something like: Home/Shop-> click to Product X -> Login page -> Redirect to Product X single page Currently, I am using the regular Woo Login form created by this function woocommerce_login_form()

I am trying bellow code snippets:

    add_filter('login_redirect', 'my_login_redirect', 10, 3);
    function my_login_redirect() {
        $location = $_SERVER['HTTP_REFERER'];
        var_dump($location);
        wp_safe_redirect($location);
        exit();
    }
}

add_action('init','my_login_redirect');
function my_login_redirect() {
        $location = $_SERVER['HTTP_REFERER'];
        var_dump($location);
        //wp_safe_redirect($location);
    }
-----------------------
AND ALSO THIS ONE
-----------------------
function redirect_after_login(){
  global $wp;
  $protocol='http';
  if (isset($_SERVER['HTTPS']))
    if (strtoupper($_SERVER['HTTPS'])=='ON')
      $protocol='https';
  if (!is_user_logged_in() && is_product() ){
    $redirect = site_url() . "/my-account.php?redirect_to= $protocol://" . 
$_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'redirect_after_login', 3 );


In both of cases, the problem is, it always find the Login page as HTTP_REFERER / REQUEST_URI

Because currently, I am using below code to redirect Non-logged-in user who is trying to see the product page to the Login page:

add_action('template_redirect', 'ethis_redirect_for_loggedin_users');
function ethis_redirect_for_loggedin_users() {
if ( !is_user_logged_in() && is_product() ) {
wp_redirect(site_url().'/default-login');
exit;
}
}

CodePudding user response:

You can use the template_redirect filter hook to prevent guest users to access a single product page.

add_action( 'template_redirect', 'wc_redirect_non_logged_to_login_access');
function wc_redirect_non_logged_to_login_access() {
    if ( !is_user_logged_in() && is_singular( 'product' ) ) {
        global $post;
        wp_redirect( get_permalink( get_option('woocommerce_myaccount_page_id')).'?redirect='.get_the_permalink( $post->ID ) );
        exit();
    }
}

Then after you have to use the woocommerce_login_redirect filter hook for login redirect.

add_filter( 'woocommerce_login_redirect', 'my_login_redirect', 10, 2 );
function my_login_redirect( $redirect, $user ) {
    if( isset( $_GET['redirect'] ) && $_GET['redirect'] != '' ){
        return $_GET['redirect'];
    }
    return $redirect;
}

Code will go in your active theme functions.php Tested and Works.

  • Related