Если покупатель никогда не покупал, добавьте товар в корзину - код не работает - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь реализовать функцию, которая будет проверять, покупал ли покупатель ЛЮБОЙ продукт в моем магазине раньше, а если нет - предоставлять ему бесплатный «подарок при регистрации» при первой покупке.

Я могу автоматически добавить продукт в корзину, но проблема возникает после этого - продукт продолжает добавляться в корзину даже после того, как клиент совершил покупку.

Код ниже - не могупонять, в чем проблема.

function has_bought( $user_id = 0 ) {
    global $wpdb;
    $customer_id = $user_id == 0 ? get_current_user_id() : $user_id;
    $paid_order_statuses = array_map( 'esc_sql', wc_get_is_paid_statuses() );

    $results = $wpdb->get_col( "
        SELECT p.ID FROM {$wpdb->prefix}posts AS p
        INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
        WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $paid_order_statuses ) . "' )
        AND p.post_type LIKE 'shop_order'
        AND pm.meta_key = '_customer_user'
        AND pm.meta_value = $customer_id
    " );

    // Count number of orders and return a boolean value depending if higher than 0
    return count( $results ) > 0 ? true : false;
}

function aaptc_add_product_to_cart() {
    if( ! has_bought() && ! is_admin() && is_user_logged_in() ) {
        $product_id = 2449;  // Product Id of the free product which will get added to cart
        $found  = false;
        //check if product already in cart
        if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
            foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
                $_product = $values['data'];
                if ( $_product->get_id() == $product_id )
                    $found = true;
            }
            // if product not found, add it
            if ( ! $found )
                WC()->cart->add_to_cart( $product_id );
        } else {
            // if no products in cart, add it
            WC()->cart->add_to_cart( $product_id );
        }
    }    
}

add_action( 'init', 'aaptc_add_product_to_cart' );

**** РЕДАКТИРОВАТЬ ****

На основании предоставленной поддержки у меня есть новый код, который автоматически добавляет продукт в корзину, проверяет заказы и удаляет продукт, если заказы существуют.

Может ли кто-нибудь подтвердить правильность приведенного ниже кода?

/*
* Automatically add product to cart
*/
function insta_add_product_to_cart() {
    if ( ! is_admin() ) {
        $product_id = 2449;  // Product Id of the free product which will get added to cart
        $found  = false;
        //check if product already in cart
        if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
            foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
                $_product = $values['data'];
                if ( $_product->get_id() == $product_id )
                    $found = true;
            }
            // if product not found, add it
            if ( ! $found )
                WC()->cart->add_to_cart( $product_id );
        } else {
            // if no products in cart, add it
            WC()->cart->add_to_cart( $product_id );
        }
    }    
}
add_action( 'init', 'insta_add_product_to_cart' );

function remove_shirt_returning_customer() {
    $product_id = 2449;  // Product Id of the free product which will get added to cart
    $user_id = get_current_user_id();
    // Get orders by customer.
    $args = array(
        'customer_id' => $user_id,
    );
    $orders = wc_get_orders( $args );

    if ( !empty($orders) ) {
        WC()->cart->remove_cart_item( $product_id );
    }
}
add_action( 'init', 'remove_shirt_returning_customer' );

**** РЕДАКТИРОВАТЬ ***

РЕШЕНИЕ

Так что предыдущий код все же дал мне ошибки. Кажется, что работает эффективно (в моей локальной среде) код ниже.

/*
* Automatically add product to cart
*/
function insta_add_product_to_cart() {
    if ( ! is_admin() ) {
        $product_id = 51;  // Product Id of the free product which will get added to cart
        $found  = false;
        //check if product already in cart
        if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
            foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
                $_product = $values['data'];
                if ( $_product->get_id() == $product_id )
                    $found = true;
            }
            // if product not found, add it
            if ( ! $found )
                WC()->cart->add_to_cart( $product_id );
        } else {
            // if no products in cart, add it
            WC()->cart->add_to_cart( $product_id );
        }
    }    
}
add_action( 'init', 'insta_add_product_to_cart' );

/*
* Remove item from cart if previous order exists
*/
function remove_shirt_returning_customer() {
        if ( ! is_admin() ) {
            $cart_items = WC()->cart->get_cart();
            $product_id = 51;  // Product Id of the free product which will get added to cart
            $user_id = get_current_user_id();
            // Get orders by customer.
            $args = array(
                'customer_id' => $user_id,
            );
            $orders = wc_get_orders( $args );
            foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
                 if ( $cart_item['product_id'] == $product_id && !empty( $orders ) ) {
                      WC()->cart->remove_cart_item( $cart_item_key );
             }
        }
    }
}
add_action( 'init', 'remove_shirt_returning_customer' );

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Вместо использования этого пользовательского запроса, попробуйте использовать функцию wc_get_orders, вы можете получить все заказы от клиента, используя email address или user id

// Get orders by customer with ID 12.
$args = array(
    'customer_id' => 12,
);
$orders = wc_get_orders( $args );

Подробнее о wp_get_orders можно найти здесь

0 голосов
/ 17 октября 2019

Вы сможете узнать, заказывал ли пользователь от вас ранее или нет, если они вошли в учетную запись. Поэтому, если пользователь находится на вашем сайте и вошел в учетную запись, вам необходимо выяснить , какой пользователь , то есть:

$user_id = get_current_user_id();

Оттуда используйте ответ Энрике, чтобы узнать,клиент разместил заказ у вас или нет.

$user_id = get_current_user_id();
$args = array(
    'customer_id' => 12,
);
$orders = wc_get_orders( $args );

Оттуда проверьте, является ли $orders пустым или нет, если он пуст, оставьте товар по умолчанию в корзине, если не удалите его.

Лучше всего было бы просто автоматически поместить товар во все корзины, а затем условно проверить, вошел ли этот пользователь в систему и разместил ли он у вас заказ раньше. Если это так, удалите элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...