WooCommerce: Добавить товар в корзину с переопределением цены?
$replace_order = new WC_Cart();
$replace_order->empty_cart( true );
$replace_order->add_to_cart( "256", "1");
Приведенный выше код добавляет товар 256
в корзину 1
вовремя. Но проблема, с которой я сталкиваюсь, заключается в том, что я хочу иметь возможность полностью переопределять цену продукта... насколько я могу судить, единственное, что я могу сделать, это приложить купон к корзине.
Есть ли способ полностью изменить цену на что-то полностью индивидуальное?
9 answers
Вот код для переопределения цены товара в корзине
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
function add_custom_price( $cart_object ) {
$custom_price = 10; // This will be your custome price
foreach ( $cart_object->cart_contents as $key => $value ) {
$value['data']->price = $custom_price;
// for WooCommerce version 3+ use:
// $value['data']->set_price($custom_price);
}
}
Надеюсь, это будет полезно...
Вам необходимо ввести инструкцию if
для проверки идентификатора продукта в приведенном выше коде:
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
function add_custom_price( $cart_object ) {
$custom_price = 10; // This will be your custome price
$target_product_id = 598;
foreach ( $cart_object->cart_contents as $value ) {
if ( $value['product_id'] == $target_product_id ) {
$value['data']->price = $custom_price;
}
/*
// If your target product is a variation
if ( $value['variation_id'] == $target_product_id ) {
$value['data']->price = $custom_price;
}
*/
}
}
Добавьте этот код в любом месте и убедитесь, что этот код всегда является исполняемым.
После добавления этого кода, когда вы позвоните:
global $woocommerce;
$woocommerce->cart->add_to_cart(598);
Только этот товар будет добавлен с переопределенной ценой, другие товары, добавленные в корзину, будут проигнорированы по переопределенным ценам.
Надеюсь, это будет полезно.
Я перепробовал все вышеперечисленные примеры кода, и последняя версия woocommerce 3.0 не поддерживает ни один из приведенных выше примеров. Используйте приведенный ниже код и отлично работающий для меня.
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
function add_custom_price( $cart_object ) {
$custom_price = 10; // This will be your custom price
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$cart_item['data']->set_price($custom_price);
}
}
После выпуска woocommerce версии 3.0.0 цена товара обновляется при добавлении в корзину с помощью функции set_price($price). Пример приведен ниже:
add_action( 'woocommerce_before_calculate_totals', 'mj_custom_price' );
function mj_custom_price( $cart_object ) {
$woo_ver = WC()->version;
$custom_price = 10;
foreach ( $cart_object->cart_contents as $key => $value )
{
if($woo_ver < "3.0.0" && $woo_ver < "2.7.0")
{
$value['data']->price = $custom_price;
}
else
{
$value['data']->set_price($custom_price);
}
}
}
Большое спасибо
Для последней версии Wordpress и Woocommerce, пожалуйста, используйте вот так
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
function add_custom_price( $cart_object ) {
foreach ( $cart_object->cart_contents as $key => $value ) {
$custom_price = 5;
$value['data']->set_price($custom_price);
}
}
С WooCommerce 2.5 я обнаружил, что этот процесс состоит из 2 частей. Первым шагом является изменение отображения цен во время выполнения при добавлении в корзину с помощью фильтра woocommerce_add_cart_item. Вторая часть состоит в том, чтобы установить постоянные данные сеанса, которые считываются во время оформления заказа с помощью фильтра woocommerce_get_cart_item_from_session. Это, по-видимому, быстрее, чем подключение фильтров расчета итогов (таких как woocommerce_before_calculate_totals), поскольку они очень часто запускаются в WooCommerce.
Более подробная информация здесь: woocommerce изменяет цену при добавлении в корзину
Для всех, кто попал сюда из Google. Вышесказанное теперь устарело, как я узнал, обновившись до WooCommerce 3.0.1.
Вместо вышеперечисленного вам теперь нужно использовать set_price
вместо price
Вот пример:
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
function add_custom_price( $cart_object ) {
$custom_price = 10; // This will be your custome price
foreach ( $cart_object->cart_contents as $key => $value ) {
$value['data']->set_price = $custom_price;
}
}
Я надеюсь, что это поможет людям в будущем:)
Чтобы сделать его динамичным (переопределить цену для каждого товара в корзине отдельно), вам необходимо сохранить переопределенную цену товара в сеансе с ключом элемента корзины в качестве ключа сеанса с помощью крючка woocommerce_add_to_cart
.
Используя эти значения сеанса, вы можете правильно рассчитать общую сумму корзины и также указать измененную цену в Позиции заказа
Вот как я это сделал, сначала я добавляю свою пользовательскую цену в cart_item_data, которая может сохранять пользовательские данные в элементы корзины, затем я использую woocommerce_before_calculate_totals, зацикливаю корзину и добавляю ранее добавленную цену.
function add_donation_to_cart() {
$cart_item_data = array('price' => $_REQUEST['donate_amount']);
$woocommerce->cart->add_to_cart( 5395, 1, '', array(), $cart_item_data);
}
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
function add_custom_price( $cart ) {
foreach ( $cart->cart_contents as $key => $value ) {
$value['data']->price = $value['price'];
}
}