2016-12-14 3 views
2

У меня есть собственный код на моем сайте WooCommerce, который добавляет продукт в корзину пользователей. Я уже проверил содержимое корзины, чтобы убедиться, что в корзине есть еще один продукт, но я также хочу, чтобы он проверял, что добавленный продукт находится в запасе ...WooCommerce Проверьте наличие идентификатора товара перед добавлением

Я не могу работать лучший способ сделать это. Был бы очень признателен, если вы можете, дайте мне знать, что добавить к функции, чтобы сделать его проверить запас «product_id» и если запас> 0. Вот мой код:

add_action('template_redirect', 'add_product_to_cart'); 
function add_product_to_cart() { 
    if (! is_admin()) { 
     $product_id = 21576; 
     $found = false; 
     global $woocommerce; 

     //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->id == $product_id) 
       $found = true; 
     } 
     // if product not found, add it 
     if (! $found) 
      WC()->cart->add_to_cart($product_id); 

     if (sizeof(WC()->cart->get_cart()) == 1 && $found == true) { 
      $woocommerce->cart->empty_cart(); 
     } 
    } 
} 

}

ответ

3

You can use the WC_Product conditional methodis_in_stock() directly in your if statement.

As $product is already a product object, we don't need anything else to make it work with WC_product methods .

Кроме того, вместо того, чтобы использовать sizeof(WC()->cart->get_cart()) > 0 можно заменить методом WC_cart is_empty() этот путь ! WC()->cart->is_empty().

Тогда вы можете также заменить sizeof(WC()->cart->get_cart()) == 1 использованием WC_cart get_cart_contents_count() Этот метод, как WC()->cart->get_cart_contents_count() == 1.

Вам не нужно больше в global woocommerce; декларацию, если вы используете WC()->cart вместо $woocommerce->cart с all WC_Cart methods

Last thing:
May be is better to remove the concerned cart item, instead emptying the cart. So we will use remove_cart_item() method instead.
If is not convenient you can use empty_cart() method as in your original code…

Так что ваш код будет:

add_action('template_redirect', 'add_product_to_cart'); 
function add_product_to_cart() { 
    if (! is_admin()) { 
     $targeted_product_id = 21576; 
     $found = false; 

     //check if product already in cart 

     if (! WC()->cart->is_empty()) { 
      foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) { 
       $product = $cart_item['data']; 
       if ($product->id == $targeted_product_id) { 
        $found = true; 
        break; // We can break the loop 
       } 
      } 
      // Update HERE (we generate a new product object $_product) 
      $_product = wc_get_product($targeted_product_id); 
      // If product is not in the cart items AND IS IN STOCK <=== <=== @@@@@@@ 
      if (!$found && $_product->is_in_stock()) { 
       WC()->cart->add_to_cart($targeted_product_id); 
      } elseif ($found && WC()->cart->get_cart_contents_count() == 1) { 
       // Removing only this cart item 
       WC()->cart->remove_cart_item($cart_item_key); 
       // WC()->cart->empty_cart(); 
      } 
     } 
    } 
} 

Этот код проверен и работает.

Код находится в файле functions.php вашей активной дочерней темы (или темы). Или также в любых плагинах php-файлов.

+0

Это все еще вызывает ошибку ... Неустранимая ошибка: вызов функции-члена is_in_stock() на не-объекте в /nas/content/staging/tulaforlife/wp-content/plugins/tula/index.php on line 135 – user2115227

+0

Спасибо за сохранение этого. Я заметил, что переменная неверна в WC() -> cart-> add_to_cart ($ product_id); (должно быть $ target_product_id).Если я изменил это, с вашим новым кодом, теперь он работает, однако он все равно пытается добавить продукт, даже если уровень запасов равен 0, и показывает сообщение в корзине, в котором говорится, что он не может добавить продукт, потому что его нет в наличии :( – user2115227

+0

Спасибо :) Это все еще не работает. Он добавляет продукт, если он на складе, если его нет на складе, он все еще пытается добавить продукт, а затем показывает сообщение о том, что продукт отсутствует на складе, поэтому его нельзя добавить. Это то, чего я пытаюсь избежать - так что, если он отсутствует на складе, он просто не пытается его добавить. :/ – user2115227

1

Это утверждение возвращает истину, если запас количество продукта больше 0.

if($product->get_stock_quantity() > 0) { 
    WC()->cart->add_to_cart($product->id); 
} 

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

$product = wc_get_product($product_id); 
+0

Спасибо за комментарий. Я пробовал приведенный выше код, но получаю следующую ошибку: Неустранимая ошибка: вызов неопределенного метода WP_Post :: get_stock_quantity() – user2115227

+0

'get_stock_quantity()' фактически определен в классе WC_Product. Я отредактировал свой ответ, посмотрю последнюю строку, и если это, возможно, будет работать для вас. –

+0

Это остановило ошибку в отображении, но теперь она не добавляет продукт вообще. :( – user2115227

Смежные вопросы