Пользователь перенаправляет после входа в систему, в зависимости от его роли в WooCommerce - PullRequest
0 голосов
/ 03 сентября 2018

В Woocommerce у меня есть код, который меняет роль, если пользователь покупает определенный товар.

add_action( 'woocommerce_order_status_processing', 'change_role_on_purchase' );
function change_role_on_purchase( $order_id ) {

$order = new WC_Order( $order_id );
$items = $order->get_items();

foreach ( $items as $item ) {
    $product_name = $item['name'];
    $product_id = $item['product_id'];
    $product_variation_id = $item['variation_id'];

    if ( $order->user_id > 0 && $product_id == '3422, 3423, 3424' ) {
        update_user_meta( $order->user_id, 'paying_customer', 1 );
        $user = new WP_User( $order->user_id );

        // Remove role
        $user->remove_role( 'customer' ); 

        // Add role
        $user->add_role( 'subscriber' );
    }
}
}

Мне нужно, после входа на сайт, если пользователь «Подписчик» и у него есть определенный продукт «Подписка» в корзине, то система перенаправляет его на страницу оформления заказа.

Буду очень рад вашей помощи!


Обновление: Я сохраню этот вариант. Это может помочь другим пользователям.

add_filter('login_redirect', 'my_login_redirect', 10, 3);
function my_login_redirect($redirect_to, $request, $user)
{

global $woocommerce;
$items = $woocommerce->cart->get_cart();
$ids_to_check = array(3422, 3423, 3424);

foreach ($items as $item => $values) {
$product_id = wc_get_product($values['data']->get_id());

if (in_array($product_id, $id_to_check)) {
    //is there a user to check?
    if (isset($user->roles) && is_array($user->roles)) {
        //check for subscribers
        if (in_array('subscriber', $user->roles)) {
            // redirect them to another URL, in this case, the homepage
            $url = get_permalink(get_option('woocommerce_checkout_page_id'));

            $redirect_to = $url;
        } 
    }

}

}

return $redirect_to;
}

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Помните, что woocommerce_order_status_processing НЕ гарантирует, что заказ был оплачен. Это просто означает, что это говорит. Если вы изменяете роль пользователя на основе открытого заказа, вы рискуете, что клиенты, чьи платежи не были произведены, имеют доступ к тому, что вы предлагаете, путем изменения роли пользователя.

0 голосов
/ 03 сентября 2018

Ваш if statement никогда не вернет true, потому что вы проверяете идентификатор продукта, если они равны '3422, 3423, 3424', который ваш продукт никогда не будет равен этому, что вам нужно сделать, это сохранить эти идентификаторы в массиве и проверить, если идентификатор продукта в массиве и, если да, выполнить свой код.

попробуйте следующее:

add_action('woocommerce_order_status_processing', 'change_role_on_purchase');
function change_role_on_purchase($order_id)
{

    $order = new WC_Order($order_id);
    $items = $order->get_items();
    $ids_to_check = array(3422, 3423, 3424, 15);
    foreach ($items as $item) {
        $product_name = $item['name'];
        $product_id = $item['product_id'];
        $product_variation_id = $item['variation_id'];


        if (in_array($product_id, $id_to_check) && $order->user_id > 0) {
            update_user_meta($order->user_id, 'paying_customer', 1);
            $user = new WP_User($order->user_id);

            // Remove role
            $user->remove_role('customer');

            // Add role
            $user->add_role('subscriber');

        }

    }

}

Чтобы перенаправить пользователя, если у него есть определенная роль, вы можете использовать следующее, если вы используете страницу входа в Woocommerce:

add_filter('woocommerce_login_redirect', 'my_login_redirect', 20, 2);


function my_login_redirect($redirect, $user)
{

    if (in_array('subscriber', $user->roles)) {
        // redirect them to another URL, in this case, the homepage

        $url = get_permalink(get_option('woocommerce_checkout_page_id'));

        $redirect = $url;

    }

    return $redirect;

}

если вы используете WordPress Форма входа по умолчанию, вы можете использовать следующую функцию:

add_filter('login_redirect', 'my_login_redirect', 20, 3);


function my_login_redirect($redirect_to, $request, $user)
{
    //is there a user to check?
    if (isset($user->roles) && is_array($user->roles)) {
        //check for subscribers
        if (in_array('subscriber', $user->roles)) {
            // redirect them to another URL, in this case, the homepage
            $url = get_permalink(get_option('woocommerce_checkout_page_id'));

            $redirect_to = $url;
        }
    }

    return $redirect_to;
}
...