Изменить значения свойств подписки на товары корзины перед оформлением заказа - PullRequest
2 голосов
/ 30 апреля 2019

Это может быть нубский вопрос, поэтому заранее извиняюсь.

У меня есть переменные продукты подписки, цена которых зависит от длины подписки. У меня также есть простые подписки, у которых subscription_length = 0. Когда корзина содержит оба типа, подписки Woocommerce создают две подписки.

Я пытаюсь изменить метаданные subscription_length всех товаров в корзине, чтобы они соответствовали самой длинной длине в корзине, чтобы была создана только одна подписка.

Я просто не могу найти правильный способ обновить корзину. Это могут быть просто глупые человеческие трюки с PHP.

Это последний вариант оператора, который сейчас не работает:

$cart[$item_key]['data']->subscription_length = $maxlength;

Я пробовал дюжину или больше вариантов темы, чтобы обновить данные $ cart. некоторые не удалось, а некоторые успешно, но данные в $ cart не изменились.

function csi_align_subscription_length() {
    $maxlength = 0;
    $cart = WC()->cart->get_cart();

    //find the longest length
    foreach ( $cart as $item_key => $item ){
        if ( WC_Subscriptions_Product::is_subscription( $item['data'] ) ) {
            $length = WC_Subscriptions_Product::get_length( $item['data'] );
            $maxlength = ($length > $maxlength) ?  $length : $maxlength ;   //get the longest length
        }
    }   

    //set all subscription lengths to the longest lengths
    foreach ( $cart as $item_key => $item ){
        if ( WC_Subscriptions_Product::is_subscription( $item['data'] ) ) {
            echo '';
            echo "cart-item before: ". var_dump($cart[$item_key]);
            $cart[$item_key]['data']->subscription_length = $maxlength;
            echo "cart-item after:  ".var_dump($cart[$item_key]);
            echo '
'; } } WC () -> cart-> set_cart_contents ($ корзина); } add_filter ('woocommerce_subscription_cart_before_grouping', 'csi_align_subscription_length', 10, 1);

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

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Наконец-то решена проблема. Нет установщика для «subscription_length». Пришлось использовать метод update_meta_data. Метаключ - это _subscription_length. следующий код работает.

function csi_align_subscription_length( $cart ) {
    if ( ( is_admin() && ! defined( 'DOING_AJAX' ) )  )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $maxlength = (float) 0;

    // Find the longest subscription length
    foreach ( $cart->get_cart() as $cart_item ){
        if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' ) ) {
            $length = (float) WC_Subscriptions_Product::get_length( $cart_item['data'] );
            $maxlength = ($length > $maxlength) ?  $length : $maxlength ;   //get the longest length
        }
    } 

    // set the subscription length for everything in the cart
    foreach ( $cart->get_cart() as $item_key => $cart_item ){
        if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' )) {
            $cart_item['data']->update_meta_data( '_subscription_length', $maxlength );
        }
    }
}

add_action( 'woocommerce_before_calculate_totals', 'csi_align_subscription_length', 5, 1 );

1 голос
/ 30 апреля 2019

Обновлено (работа для простых подписок и вариантов подписки (переменной подписки)

Хук woocommerce_before_calculate_totals позволяет изменять свойства товара на товарах корзины.Поскольку woocommerce 3 и CRUD Objects , свойства объекта не могут быть доступны напрямую, и вам придется использовать вместо них доступные методы получения и установки ... Здесь мы:

  1. получаем массивдлина только для всех элементов корзины подписок.
  2. получить значение максимальной длины
  3. установить значение максимальной длины только для всех элементов корзины подписок.

требуемый код:

add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals_action_callback', 10, 1 );
function before_calculate_totals_action_callback( $cart ) {
    if ( ( is_admin() && ! defined( 'DOING_AJAX' ) )  )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $maxlength = []; // Initializing

    // First loop (get)
    foreach ( $cart->get_cart() as $cart_item ){
        if ( in_array( $cart_item['data']->get_type(), array('subscription', 'subscription_variation') ) ) {
            $maxlength[] = (float) $cart_item['data']->get_length();
        }
    }

    // Get the highest value
    $maxlength = max($maxlength);

    // Second loop (set)
    foreach ( $cart->get_cart() as $cart_item ){
        if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' ) ) {
            $cart_item['data']->set_length( $maxlength );
        }
    }
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Протестировано и работает.

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

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