如何正确创建多个条件以将用户角色重定向到不同的页面

时间:2018-02-11 22:16:02

标签: php wordpress if-statement redirect switch-statement

基本上我有两个用户角色可以访问我的网站,第一个是订阅者,第二个是客户,我希望他们符合某些条件:

  1. 如果没有登录任何一个尝试访问商店页面,他们将被重定向到注册页面
  2. 如果有订阅者或客户登录并且他们试图进入注册页面,他们将被重定向到他们的“我的帐户”页面
  3. 如果有订阅者登录但不是客户并尝试访问商店页面,他将被重定向到ID确认页面(一个页面,其中包含订阅者需要填写和发送的表单,然后之后我们确认他的身份并将其角色转变为客户)
  4. 如果有客户登录,他可以访问商店页面,而不是ID确认页面。
  5. 未登录用户无法访问id确认页面,他们将被重定向到注册页面
  6. 我在下面有这个代码,但它给了我一个问题,不知道为什么在进入商店页面后将我的客户重定向到“我的帐户”页面:

    add_action( 'template_redirect', 'subscribers_redirection' );
    function subscribers_redirection() {
            if ( !is_user_logged_in() && !current_user_can( 'subscriber' ) && !current_user_can( 'customer' ) && ( is_shop() || is_product_category() || is_product_tag() || is_product() ) ) {
            wp_redirect( home_url( '/register' ) );
            } else if ( is_user_logged_in() && current_user_can( 'subscriber' ) && !current_user_can( 'customer' ) && ( is_shop() || is_product_category() || is_product_tag() || is_product() ) ){
            wp_redirect( home_url( '/id-confirmation' ) );
            } else if ( is_user_logged_in() && current_user_can( 'subscriber' ) && current_user_can( 'customer' ) && ( is_shop() || is_product_category() || is_product_tag() || is_product() ) ){
            wp_redirect( home_url( '/shop' ) );
            } else if ( is_user_logged_in() && is_page( 'Register' ) ){
            wp_redirect( home_url( '/my-account' ) );
            } else if ( !current_user_can( 'subscriber' ) && is_page( 'id-confirmation' ) ){
            wp_redirect( home_url( '/register' ) );
            exit(); 
            }
    }
    

    我的假设:

    我认为由于某种原因,我的客户首先被重定向到注册页面,但其中一个条件是,如果您是客户并且在注册页面上,您将被重定向到“我的帐户”页面,这就是为什么他们在去购物后被重定向到首先注册的原因。

    我也用下面的其他代码测试过:

    add_action( 'template_redirect', 'verify_logged_in' );
    function verify_logged_in() {
    
            if ( !is_user_logged_in() ) {
                    if ( is_shop() || is_product_category() || is_product_tag() || is_product() || is_page( 'id-confirmation' ) ) {
                            wp_redirect( home_url( '/register' ) );        
                    } else ( is_user_logged_in() ) {
                            function subscribers_redirection() {
                                    $current_user = wp_get_current_user();
                                    $user_id = $current_user->ID;
                                    $user_info = get_userdata($user_id);
                                    $user_rols = implode(', ', $user_info->roles) . "\n";
                                    switch ($user_rols) {
                                        case "subscriber":
                                            if ( is_shop() || is_product_category() || is_product_tag() || is_product() ) {
                                                    wp_redirect( home_url( '/id-confirmation' ) );        
                                            } else if ( is_page( 'Register' ) ) {
                                                    wp_redirect( home_url( '/my-account' ) );       
                                            } else {
                                                    exit();
                                            }
                                            break;
                                        case "customer":
                                            if ( is_page( 'id-confirmation' ) || is_page( 'Register' )) {
                                                    wp_redirect( home_url( '/my-account' ) );        
                                            } else {
                                                    exit();
                                            }
                                            break;
                                        default:
                                           exit();
                                    }        
                            }
                            add_action( 'template_redirect', 'subscribers_redirection' );
                    }
            }
    }
    

    但是第二个if语句“如果已登录”则无效。与第一个代码不同,我没有假设为什么不能使用第二个代码。

1 个答案:

答案 0 :(得分:0)

您可能需要这种脚本方式吗?至于我,这个算法更难以理解。如果wp_redirect在您的网站上正常工作,那么此过滤器将按预期工作。首先,您检测访问页面,然后检查登录状态。 (true_case) ? something_one : something_twoif (true) { something_one } else { something_two }相同。

if (is_shop() || is_product_category() || 
    is_product_tag() || is_product() || is_page( 'id-confirmation' )) {

    (is_user_logged_in()) ? subscribers_redirection() : wp_redirect(home_url('/register'));
}

此外,您有太多重复的代码。尝试简化它,因为这样的简单任务不需要它的一半。