Я видел много примеров добавления товара в корзину 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, а затем вручную перейду в корзину, продукт будет доступен с моей пользовательской ценой. На самом деле, я бы хотел применить специальную цену и перенаправить непосредственно на страницу проверки вместо корзины, если это возможно?
Вы ангел? На самом деле поразите гвоздь на голове этим. Я счастливый человек. –
это не работает, оно устанавливает данные-> цену, но это не меняет то, что показано в корзине. –
@GlenElkins. Возможно, это устарело, но, похоже, работало в январе в комментарии выше, и когда я ответил, я скопировал с рабочего места. – doublesharp