#php #wordpress #session #woocommerce
Вопрос:
Я создаю сайт WooCommerce (версия 5.6.0), где пользователи могут покупать пенопластовые изделия, а цены рассчитываются на странице архива. В основном пользователи вводят размеры, и цена рассчитывается по формуле. В настоящее время я борюсь с обновлением цен в корзине, у меня нет предыдущего опыта настройки продуктов и цен на этом уровне, поэтому любая помощь будет очень признательна.. Шаги, которые я сделал до сих пор:
1.Получите (через Ajax) и установите пользовательскую цену продукта в WC_Session
function get_custom_product_price_set_to_session(){
// Check that there is a 'foamPrice' and foamProductI _POST variable
if (isset($_POST['foamProductId']) amp;amp; isset($_POST['foamPrice'])) {
// Enable customer WC_Session (needed on first add to cart)
if (!WC()->session->has_session()) {
WC()->session->set_customer_session_cookie(true);
}
// Set the product_id and the custom price in WC_Session variable
WC()->session->set('foam_price', [
'id' => (int)wc_clean($_POST['foamProductId']),
'price' => (float)wc_clean($_POST['foamPrice']),
]);
}}
add_action('wp_ajax_get_custom_product_price_set_to_session', 'get_custom_product_price_set_to_session');
add_action('wp_ajax_nopriv_get_custom_product_price_set_to_session', 'get_custom_product_price_set_to_session');
2.Измените цену товара в корзине на основе данных WC_Session:
add_action('woocommerce_before_calculate_totals', 'custom_cart_item_price', 20, 1);
function custom_cart_item_price($cart){
if (is_admin() amp;amp; !defined('DOING_AJAX'))
return;
// Must be required since Woocommerce version 3.2 for cart items properties changes
if (did_action('woocommerce_before_calculate_totals') >= 2)
return;
// Loop through our specific cart item keys
foreach ($cart->get_cart() as $cart_item) {
// Get custom product price for the current item
if (($data = WC()->session->get('foam_price')) amp;amp; $cart_item['data']->get_id() == $data['id']) {
// Set the new product price
$cart_item['data']->set_price($data['price']);
}
}}
Проблема, с которой я сталкиваюсь, заключается в том, что она работает только для последнего продукта, добавленного в корзину, предыдущие продукты, добавленные в корзину, повторно устанавливают цену 0 каждый раз, когда я добавляю новый продукт в корзину. Если кто-нибудь сможет дать какие-то рекомендации, я буду вам очень признателен. Спасибо тебе огромное!
Комментарии:
1. woocommerce_before_calculate_totals работает на странице корзины, поэтому используйте woocommerce_add_to_cart
Ответ №1:
С
WC()->session->set('foam_price', [
'id' => (int)wc_clean($_POST['foamProductId']),
'price' => (float)wc_clean($_POST['foamPrice']),
]);
вы в основном переопределяете предыдущую «foam_price» с последней добавленной в корзину.
На мой взгляд, вам нужно хранить разные значения для разных идентификаторов продуктов.
Попробуйте с (непроверенным):
function get_custom_product_price_set_to_session(){
// Check that there is a 'foamPrice' and foamProductI _POST variable
if (isset($_POST['foamProductId']) amp;amp; isset($_POST['foamPrice'])) {
// Enable customer WC_Session (needed on first add to cart)
if (!WC()->session->has_session()) {
WC()->session->set_customer_session_cookie(true);
}
// Set the product_id and the custom price in WC_Session variable
WC()->session->set('foam_price' . wc_clean($_POST['foamProductId']), [
'id' => (int)wc_clean($_POST['foamProductId']),
'price' => (float)wc_clean($_POST['foamPrice']),
]);
}}
add_action('wp_ajax_get_custom_product_price_set_to_session', 'get_custom_product_price_set_to_session');
add_action('wp_ajax_nopriv_get_custom_product_price_set_to_session', 'get_custom_product_price_set_to_session');
…а потом:
add_action('woocommerce_before_calculate_totals', 'custom_cart_item_price', 20, 1);
function custom_cart_item_price($cart){
if (is_admin() amp;amp; !defined('DOING_AJAX'))
return;
// Must be required since Woocommerce version 3.2 for cart items properties changes
if (did_action('woocommerce_before_calculate_totals') >= 2)
return;
// Loop through our specific cart item keys
foreach ($cart->get_cart() as $cart_item) {
// Get custom product price for the current item
if (($data = WC()->session->get('foam_price' . $cart_item['data']->get_id())) amp;amp; $cart_item['data']->get_id() == $data['id']) {
// Set the new product price
$cart_item['data']->set_price($data['price']);
}
}}
Комментарии:
1. Большое спасибо!! Это сработало! Поскольку у меня нет большого опыта, есть ли какие-либо другие вещи, которые я должен учитывать при настройке цен на корзину? Любой совет будет высоко оценен.. Я просто пытаюсь предотвратить любые проблемы, о которых я, возможно, не знаю..