Woocommerce удалить товар из корзины - PHP - PullRequest
0 голосов
/ 09 мая 2018

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

add_action( 'woocommerce_add_to_cart', 'testtt');

function testtt()
{ 
    $token = $_SESSION['******token'];  
    $dataservice = *******Service::getService('DataService');
    $list = $dataservice->getArticleBlacklist( $token );

foreach( WC()->cart->get_cart() as $cart_item_key => $cart_item ) 
{
    //Get SKU by product_id or if available variation_id
    if( $cart_item['variation_id'] != 0  )
    {
        $prototype = new WC_Product( $cart_item['variation_id'] );      
        $prod_art_id = $prototype->get_sku();   
    }
    else
    {
        $prototype = new WC_Product( $cart_item['product_id'] ) ;       
        $prod_art_id = $prototype->get_sku();   
    }

    //convert SKU from STRING into INTEGER
    $x = intval( $prod_art_id );

    //Remove product
    if( $x == $list->int )
    {       
        WC()->cart->remove_cart_item( $cart_item_key );
    }
    else
    {
        continue;           
    }       
}

Я пробовал разные виды кода например:

//Remove product
if( $x == $list['int'] )
{    

И многое другое ... ничего не работает. Но дело в том, что я знаю, что это работает. Потому что, если я изменю

add_action( 'woocommerce_add_to_cart', 'testtt');

в

add_action( 'parse_reqeust', 'testtt');

код делает то, что должен. Я очень смущен, потому что несколько дней назад я написал код с той же задачей, и он все еще работает (там мне пришлось удалить ВСЕ ДРУГИЕ товары из корзины, если «помеченный» продукт был добавлен в корзину).

Информация: в $ list я получаю артикул артикула из продукта, занесенного в черный список, как

 `object {["int"]=>int(*number*)}` .

Надеюсь, кто-нибудь сможет мне помочь. Спасибо ^^

1 Ответ

0 голосов
/ 10 мая 2018

В вашем коде:

  • Похоже, что в вашем коде, который у вас есть, может быть забыто session_start() или нет?
  • чтобы получить товар из корзины, просто используйте $cart_item['data'] (он также обрабатывает изменение товара) . Для получения товара используйте напрямую $cart_item['data']->get_sku().

Итак, ваш повторный код должен быть:

add_action( 'woocommerce_add_to_cart', 'testtt');
function testtt()
{ 
    session_start(); // <== Missing?

    $token = $_SESSION['******token'];  
    $dataservice = *******Service::getService('DataService');
    $list = $dataservice->getArticleBlacklist( $token );

    foreach( WC()->cart->get_cart() as $cart_item_key => $cart_item ) 
    {
        // Get the product SKU (even for product variations)
        $sku = $cart_item['data']->get_sku(); 

        // Convert SKU from STRING into INTEGER
        $inst_sku = intval( $sku );

        // Remove product
        if( $inst_sku == $list->int )
        {       
            WC()->cart->remove_cart_item( $cart_item_key );
        }
        else
        {
            continue;           
        }       
    }
}

Но почему вместо этого вы не используете woocommerce_add_to_cart_validation крючок вместо того, чтобы убирать продукты из корзины ... Попробуйте это:

add_filter( 'woocommerce_add_to_cart_validation', 'check_add_to_cart', 20, 3 );
function check_add_to_cart ( $passed, $product_id, $quantity ){
    session_start();

    $token = $_SESSION['******token'];  
    $dataservice = *******Service::getService('DataService');
    $list = $dataservice->getArticleBlacklist( $token );

    // Get sku from the product ID
    $sku = get_post_meta( $product_id, '_sku', true )

    // Convert SKU from STRING into INTEGER
    $int_sku = intval( $sku );

    // If the product is black listed
    if( $int_sku == $list->int )
        // Add a custom error notice and avoid add to cart
        wc_add_notice( __('This product has already been bought... Try something else', 'woocommerce' ), 'error' );
        $passed = false;
    }
    return $passed;
}

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

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