2015-09-02 5 views
3

Я видел много примеров добавления товара в корзину WC с ценой клиента, но не динамически. Я пытаюсь сделать в функции SHORTCODE, который принимает POST переменные ....Woocommerce добавьте в корзину с пользовательской ценой

if (isset($_POST['wmnf_add_donation'])) { 
    global $woocommerce; 
    $cart_object = $woocommerce->cart; 
    $custom_price = ($_POST['donation_amount'] > 0 ? $_POST['donation_amount'] : 0); 
    $target_product_id = 65986; 
    $cart_object->add_to_cart($target_product_id, "1"); 
    foreach ($cart_object->cart_contents as $key => $value) { 
     if ($value['product_id'] == $target_product_id) { 
      $value['data']->price = $custom_price; 
     } 
    } 
} 

Это добавляет элемент в корзину, конечно, но цена равна нулю, и я понимаю, что мне нужно как-то сохранить этот массив вернуться к данным телеграммы WC. Является ли этот метод даже возможным или может быть выполнен только с помощью фильтра или крюка действия? Если да, как я могу сохранить измененный массив обратно в содержимое корзины или заставить его работать, чтобы добавить один элемент с его опубликованной ценой? Любые рекомендации очень ценятся.


Спасибо за этот ответ doublesharp, я не смог заставить его работать, как описано, потому что форма размещения на странице с моим шорткодом, который имеет свою форму, вместо того, чтобы разместить непосредственно в корзину. $ _POST не видел, и продукт оказался нулевым. Я нашел другой подход, но проблема с использованием wp_redirect. Я изменил выше шорткод к этому:

if (isset($_POST['wmnf_add_donation'])) { 
    global $woocommerce; 
    $custom_price = ($_POST['donation_amount'] > 0 ? $_POST['donation_amount'] : 0); 
    $target_product_id = 65986; 
    $_SESSION['donation_amount'] = $custom_price; 
    $woocommerce->cart->add_to_cart($target_product_id, "1"); 
    wp_redirect(site_url() . '/gifts/swag-bag/'); 
} 

Затем я добавил следующие фильтры functions.php:

add_filter('woocommerce_get_price','donation_price', 10, 2); 
add_filter('woocommerce_get_regular_price','donation_price', 10, 2); 
add_filter('woocommerce_get_sale_price','donation_price', 10, 2); 
function donation_price($price, $productd){ 
    if($productd->id == '65986'){ 
     $price = $_SESSION['donation_amount']; 
    } 
    return $price; 
} 

Это не работает, за исключением, когда wp_redirect закомментирована, следовательно, не перенаправлять. Вышеперечисленное перенаправляется в корзину, но его пустое. Если я прокомментирую строку wp_redirect, а затем вручную перейду в корзину, продукт будет доступен с моей пользовательской ценой. На самом деле, я бы хотел применить специальную цену и перенаправить непосредственно на страницу проверки вместо корзины, если это возможно?

ответ

3

Вы можете использовать крючок действия woocommerce_before_calculate_totals для изменения содержимого тележки, включая цены на продукцию.

add_action('woocommerce_before_calculate_totals', 'before_calculate_totals'); 
function before_calculate_totals($_cart){ 
    // loop through the cart_contents 
    foreach ($_cart->cart_contents as $cart_item_key => &$item) { 
     // you will need to determine the product id you want to modify, only when the "donation_amount" is passed 
     if ($item['id'] == 65986 && isset($_POST['donation_amount'])){ 
      // custom price from POST 
      $custom_price = $_POST['donation_amount'] > 0 ? $_POST['donation_amount'] : 0; 
      // save to the cart data 
      $item['data']->price = $custom_price; 
     } 
    } 
} 
+0

Вы ангел? На самом деле поразите гвоздь на голове этим. Я счастливый человек. –

+0

это не работает, оно устанавливает данные-> цену, но это не меняет то, что показано в корзине. –

+0

@GlenElkins. Возможно, это устарело, но, похоже, работало в январе в комментарии выше, и когда я ответил, я скопировал с рабочего места. – doublesharp

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