我在网站上制作了一个自定义表单选项来更新价格并通过ajax发送该数据并尝试进入过滤器woocommerce_before_calculate_totals会话。
这是代码
add_action( 'woocommerce_before_calculate_totals', 'calculate_total_price', 99 );
function calculate_total_price( $cart_object )
{
global $woocommerce;
session_start();
$tac_dd_discounted_price = $_SESSION['wdm_user_price_data'];
$target_product_id = $_SESSION['wdm_user_product_id_data'].'<br/>.';
$_SESSION['productlist'][] =
[
'price' => $tac_dd_discounted_price,
'productid' => $target_product_id
];
$arrys = array_merge( $_SESSION[ "productlist" ]);
$_SESSION[ "productlist" ] = array_unique($arrys);
// This unique array created in seesion fro multi product which show correct data.
$price_blank="1";
foreach ( $cart_object->get_cart() as $cart_item ) {
$id= $cart_item['data']->get_id();
//$target_product_id=$arrys['productlist']['productid'];
//$tac_dd_discounted_price=$arrys['productlist']['price'];
if ( $id == $target_product_id ) {
$cart_item['data']->set_price($tac_dd_discounted_price);
}
else
{
$cart_item['data']->set_price($my_price['productlist']['price']);
}
}
}
但问题是购物车价格中的一个产品显示正确但是当试图添加两个产品时,Seession变量在两个产品中都附加相同的值
答案 0 :(得分:1)
首先,您应该更好地使用WooCommerce专用WC_Session
类,而不是使用PHP $_SESSION
:
// Set the data (the value can be also an indexed array)
WC()->session->set( 'custom_key', 'value' );
// Get the data
WC()->session->get( 'custom_key' );
现在,在您的代码函数中,您只需从PHP Session 一个产品和一个价格中获取:
$tac_dd_discounted_price = $_SESSION['wdm_user_price_data'];
$target_product_id = $_SESSION['wdm_user_product_id_data']; // ==> Removed .'<br/>.'
相反,当购物车中有许多产品时,您需要获得一系列产品ID和价格。
另外,您不需要global $woocommerce;
...
由于您没有显示所有其他相关的JS / Ajax / PHP代码,并且由于您的问题不详细,因此无法为您提供更多帮助。
答案 1 :(得分:0)
我做过任何使用自定义会话以获取价格的人都需要更新购物车和结帐页面这对您有很大的帮助。
add_filter( 'woocommerce_add_cart_item' , 'set_woo_prices');
add_filter( 'woocommerce_get_cart_item_from_session', 'set_session_prices', 20 , 3 );
function set_woo_prices( $woo_data ) {
session_start();
$tac_dd_discounted_price = $_SESSION['wdm_user_price_data'];
$target_product_id = $_SESSION['wdm_user_product_id_data'];
if ( ! isset($tac_dd_discounted_price ) || empty ($tac_dd_discounted_price ) ) { return $woo_data; }
$woo_data['data']->set_price( $tac_dd_discounted_price );
$woo_data['my_price'] = $tac_dd_discounted_price;
return $woo_data;
}
function set_session_prices ( $woo_data , $values , $key ) {
if ( ! isset( $woo_data['my_price'] ) || empty ( $woo_data['my_price'] ) ) { return $woo_data; }
$woo_data['data']->set_price( $woo_data['my_price'] );
return $woo_data;
}