@DeniSidorenko

Woocommerce одна функция вместо несколько?

Добрый день , сделал добавления товаров через ajax. Дело в том что добавлять продукт и менять количество стало проблемой, когда их много, и решили сделать следующим образом. Просто на js человек будет добавлять , а при клике на кнопку разом все отправится на сервер. Звучит круто, и достаточно быстрее НО!
ajax запрос может отправлять лишь один раз, и второй выполниться когда придется response complete
И за чего ajax функция выглядит следующим образом
var dataActions = [];
    for(var i = 0; i<$allProducts.length; i++){

      var item = $allProducts[i]
      var id = parseFloat($(item).attr('data-id'))
      var quantity = parseFloat($(item).find('.item-quantity').attr('value'))
      var data = {
        action: 'woocommerce_ajax_add_to_cart',
        product_id: id,
        product_sku: '',
        quantity: quantity,
      }
      dataActions.push(data)
    }

    postProducts(dataActions, 0);
    function postProducts(products, index){
      $.ajax({
        type: 'post',
        url: wc_add_to_cart_params.ajax_url,
        data: products[index],
        beforeSend: function (response) {

        },
        complete: function (response) {
          index++;
          if (products.length - 1 >= index) {
            postProducts(products, index);
          }
          else{
            if(window.location.hostname == "site.ru"){
              window.location.href = window.location.href + "?opencheck";
           }
          }
          
        },
      
      });
    }


А этот код на php

add_action('wp_ajax_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
        
function woocommerce_ajax_add_to_cart() {

  $product_id = apply_filters('woocommerce_add_to_cart_product_id', absint($_POST['product_id']));
  $quantity = empty($_POST['quantity']) ? 1 : wc_stock_amount($_POST['quantity']);
  $variation_id = absint($_POST['variation_id']);
  $passed_validation = apply_filters('woocommerce_add_to_cart_validation', true, $product_id, $quantity);
  $product_status = get_post_status($product_id);

  if ($passed_validation && WC()->cart->add_to_cart($product_id, $quantity, $variation_id) && 'publish' === $product_status) {

      do_action('woocommerce_ajax_added_to_cart', $product_id);

      if ('yes' === get_option('woocommerce_cart_redirect_after_add')) {
          wc_add_to_cart_message(array($product_id => $quantity), true);
      }

      WC_AJAX :: get_refreshed_fragments();
  } else {

      $data = array(
          'error' => true,
          'product_url' => apply_filters('woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id));

      echo wp_send_json($data);
  }

  wp_die();
}


И код работает, действительно работает, но проблема в том что это цикличная функция добавления товаров , если их порядка 8 работает по 8-10 секунд. Скажите можно ли сделать что бы товары добавлялись одним запросом, а не по 8( в зависимости от количество товаров )
  • Вопрос задан
  • 235 просмотров
Решения вопроса 1
Все достаточно просто.
Вам надо изменить данные которые отправляете и отправлять все выбранные пользователем позиции и их количество. А на сервере обработать входящие данные и добавить все в корзину.

Пример обработки запроса на множественное добавление в корзину
/**
	 * Множественное добавление в корзину
	 * Вызывается по Ajax
	 *
	 * @hook-handle qop_add_to_cart
	 */
	public function ajax_add_to_cart() {

		$product_items = isset( $_POST['products'] ) && is_array( $_POST['products'] ) ? $_POST['products'] : false;

		$errors               = array();
		$added_products_count = 0;

		foreach ( $product_items as $item ) {
			$product_id   = $item['product_id'];
			$quantity     = $item['quantity'];
			$variation_id = $item['variation_id'];
			$title        = $item['product_title'];
			$sku          = $item['sku']; // для простого товара здесь тоже его sku


			$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );
			$product_status    = get_post_status( $product_id );

			if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity, $variation_id ) && 'publish' === $product_status ) {

				do_action( 'woocommerce_ajax_added_to_cart', $product_id );
				$added_products_count ++;

			} else {
				$notices = WC()->session->get( 'wc_notices', array() );
				if ( isset( $notices['error'] ) ) {
					$error   = array_pop( $notices['error'] );
					$err_msg = preg_replace( '/<a.*?href.*?=(.*)>(.*?)<\/a>/', '', $error );

					$errors[] = array(
						'variationId' => $variation_id,
						'title'       => $title,
						'sku'         => $sku,
						'msg'         => $err_msg,
					);
				}
				wc_clear_notices();
			}
		}

		$response = array(
			'added'  => $added_products_count,
			'errors' => $errors,
			'popup'  => $this->template_errors_formating( $errors ),  // Формирование собственного popup-a для пользователя
			'cart'   => $this->get_refreshed_fragments(),  // необходимо для обновления миникорзины в шапке.
		);

		wp_send_json( $response );
	}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы