我已经在woocommerce单一产品页面中创建了一些输入自定义字段,用户可以在其中分别输入高度和宽度值……当产品添加到购物车时,自定义字段值也会显示在购物车和结帐页面中。
示例:如果用户输入height='15'和width='20',则其显示为购物车页面,如height=15 width=20
单一产品页面
购物车页面
现在,我试图实现的是基于“高度”和“宽度”自定义字段值进行自定义价格计算:
总价=(高/3*宽/30 3)*1.48
最终计算的价格应更新购物车项目价格。但我无法实现这一部分,或者我不知道如何实现它。
这是我的代码:
/*
* Display input on single product page
* @return html
*/
function kia_satish_option(){
$value = isset( $_POST['_satish_option'] ) ? sanitize_wp_checkbox( $_POST['_satish_option'] ) : '';
printf( '<label>%s</label><input name="_satish_option" value="%s" type="number"/>', __( 'Height', 'kia-plugin-textdomain' ), esc_attr( $value ) );
}
add_action( 'woocommerce_before_add_to_cart_button', 'kia_satish_option', 9 );
function kia_satisher_option(){
$value = isset( $_POST['_satisher_option'] ) ? sanitize_wp_checkbox( $_POST['_satisher_option'] ) : '';
printf( '<label>%s</label><input name="_satisher_option" value="%s" type="number"/>', __( 'width', 'kia-plugin-textdomain' ), esc_attr( $value ) );
}
add_action( 'woocommerce_before_add_to_cart_button', 'kia_satisher_option', 9 );
function kia_yard_option(){
$value = isset( $_POST['_yard_option'] ) ? sanitize_wp_checkbox( $_POST['_yard_option'] ) : '';
printf( '<label>%s</label><input name="_yard_option" value="%s" type="number"/>', __( 'yard', 'kia-plugin-textdomain' ), esc_attr( $value ) );
}
add_action( 'woocommerce_before_add_to_cart_button', 'kia_yard_option', 9 );
/*
* Add custom data to the cart item
* @param array $cart_item
* @param int $product_id
* @return array
*/
function kia_add_cart_item_data( $cart_item, $product_id ){
if( isset( $_POST['_satish_option'] ) ) {
$cart_item['satish_option'] = sanitize_text_field( $_POST['_satish_option'] );
}
if( isset( $_POST['_satisher_option'] ) ) {
$cart_item['satisher_option'] = sanitize_text_field( $_POST['_satisher_option'] );
}
if( isset( $_POST['_yard_option'] ) ) {
$cart_item['yard_option'] = sanitize_text_field( $_POST['_yard_option'] );
}
return $cart_item;
}
add_filter( 'woocommerce_add_cart_item_data', 'kia_add_cart_item_data', 10, 2 );
/*
* Load cart data from session
* @param array $cart_item
* @param array $other_data
* @return array
*/
function kia_get_cart_item_from_session( $cart_item, $values ) {
if ( isset( $values['satish_option'] ) ){
$cart_item['satish_option'] = $values['satish_option'];
}
if ( isset( $values['satisher_option'] ) ){
$cart_item['satisher_option'] = $values['satisher_option'];
}
if ( isset( $values['yard_option'] ) ){
$cart_item['yard_option'] = $values['yard_option'];
}
return $cart_item;
}
add_filter( 'woocommerce_get_cart_item_from_session', 'kia_get_cart_item_from_session', 20, 2 );
/*
* Add meta to order item
* @param int $item_id
* @param array $values
* @return void
*/
function kia_add_order_item_meta( $item_id, $values ) {
if ( ! empty( $values['satish_option'] ) ) {
woocommerce_add_order_item_meta( $item_id, 'satish_option', $values['satish_option'] );
}
if ( ! empty( $values['satisher_option'] ) ) {
woocommerce_add_order_item_meta( $item_id, 'satisher_option', $values['satisher_option'] );
}
}
add_action( 'woocommerce_add_order_item_meta', 'kia_add_order_item_meta', 10, 2 );
/*
* Get item data to display in cart
* @param array $other_data
* @param array $cart_item
* @return array
*/
function kia_get_item_data( $other_data, $cart_item ) {
if ( isset( $cart_item['satish_option'] ) ){
$other_data[] = array(
'name' => __( 'height', 'kia-plugin-textdomain' ),
'value' => sanitize_text_field( $cart_item['satish_option'] )
);
}
if ( isset( $cart_item['satisher_option'] ) ){
$other_data[] = array(
'name' => __( 'width', 'kia-plugin-textdomain' ),
'value' => sanitize_text_field( $cart_item['satisher_option'] )
);
}
if ( isset( $cart_item['yard_option'] ) ){
$other_data[] = array(
'name' => __( 'Yard', 'kia-plugin-textdomain' ),
'value' => sanitize_text_field( $cart_item['yard_option'] )
);
}
return $other_data;
}
add_filter( 'woocommerce_get_item_data', 'kia_get_item_data', 10, 2 );
我试图通过下面的代码实现公式部分:
function woo_add_custom_general_fields_save($post_id)
{
$woocommerce_product_height = $_POST['_product_height'];
$woocommerce_product_width = $_POST['_product_width'];
$woocommerce_final_price = $_POST['_final_price'];
// calculate and save _product_area_price, _regular_price, price as Height*Width
if (!empty($woocommerce_product_height) && !empty($woocommerce_product_width)))
$woocommerce_final_price = $woocommerce_product_height * $woocommerce_product_width ;
但它不起作用…
如何使用基于自定义购物车数据的自定义计算更改购物车项目价格?
很抱歉再次敲你们的门,但当我添加上面的行时,它是抛出错误的
解析错误:语法错误,意外返回(T_RETURN)
// Display custom input fields in single product page
add_action( 'woocommerce_before_add_to_cart_button', 'add_product_custom_fields', 20 );
function add_product_custom_fields(){
global $product;
if( ! has_term( "fitness", 'product_cat', $product->get_id() ) return;
$domain = 'woocommerce';
$value = isset( $_POST['height_option'] ) ? sanitize_key( $_POST['height_option'] ) : '';
printf( '<label>%s</label><input name="height_option" value="%s" type="number"/><br>', __( 'Height', $domain ), esc_attr( $value ) );
$value = isset( $_POST['width_option'] ) ? sanitize_key( $_POST['width_option'] ) : '';
printf( '<label>%s</label><input name="width_option" value="%s" type="number"/><br>', __( 'Width', $domain ), esc_attr( $value ) );
}
我已经完全重新访问了你的代码,删除了一些小东西,重命名了其他的,并添加了丢失的部分...
你的计算看起来很奇怪:
$total_price = ($height/3 * $width/30 + 3)*1.48;
由于一切正常,如果需要,您将能够轻松更改您的计算…
守则:
// Display custom input fields in single product page
add_action( 'woocommerce_before_add_to_cart_button', 'add_product_custom_fields', 20 );
function add_product_custom_fields(){
$domain = 'woocommerce';
$value = isset( $_POST['height_option'] ) ? sanitize_key( $_POST['height_option'] ) : '';
printf( '<label>%s</label><input name="height_option" value="%s" type="number"/><br>', __( 'Height', $domain ), esc_attr( $value ) );
$value = isset( $_POST['width_option'] ) ? sanitize_key( $_POST['width_option'] ) : '';
printf( '<label>%s</label><input name="width_option" value="%s" type="number"/><br>', __( 'Width', $domain ), esc_attr( $value ) );
}
// Add custom fields data to cart items and make calculation price
add_filter( 'woocommerce_add_cart_item_data', 'custom_add_cart_item_data', 20, 2 );
function custom_add_cart_item_data( $cart_item, $product_id ){
if( isset( $_POST['height_option'] ) )
$cart_item['custom_data']['height'] = sanitize_key( $_POST['height_option'] );
if( isset( $_POST['width_option'] ) )
$cart_item['custom_data']['width'] = sanitize_key( $_POST['width_option'] );
// Make calculation and save calculated price
if( isset( $_POST['height_option'] ) && isset( $_POST['width_option'] ) ){
$height = (int) sanitize_key( $_POST['height_option'] );
$width = (int) sanitize_key( $_POST['width_option'] );
if( $width > 0 && $height > 0 ){
$total_price = ( ( $height / 3 ) * ( $width / 30 ) + 3 ) * 1.48; // <== The calculation
$cart_item['custom_data']['price'] = round($total_price, 2); // Save the price in the custom data
}
}
return $cart_item;
}
// Display custom data in cart and checkout pages
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 10, 2 );
function display_custom_cart_item_data( $cart_data, $cart_item ) {
$domain = 'woocommerce';
if ( isset( $cart_item['custom_data']['height'] ) ){
$cart_data[] = array(
'name' => __( 'Height', $domain ),
'value' => $cart_item['custom_data']['height']
);
}
if ( isset( $cart_item['custom_data']['width'] ) ){
$cart_data[] = array(
'name' => __( 'Width', $domain ),
'value' => $cart_item['custom_data']['width']
);
}
return $cart_data;
}
// Set the new calculated price replacing cart item price
add_action( 'woocommerce_before_calculate_totals', 'set_cart_item_calculated_price', 20, 1 );
function set_cart_item_calculated_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Loop through cart items
foreach ( $cart->get_cart() as $cart_item ){
if( ! isset( $cart_item['custom_data']['price'] ) ){
continue;
}
if( $cart_item['custom_data']['price'] > 0 ){
// Set the calculated item price (if there is one)
$cart_item['data']->set_price( (float) $cart_item['custom_data']['price'] );
}
}
}
// Get cart item custom data and update order item meta and display in orders and emails
add_action( 'woocommerce_checkout_create_order_line_item', 'save_order_item_custom_meta_data', 10, 2 );
function custom_add_order_item_meta( $item_id, $values ) {
$domain = 'woocommerce';
if( isset( $cart_item['custom_data']['height'] ) )
$item->update_meta_data( __( 'Height', $domain ), $values['custom_data']['height'] );
if( isset( $cart_item['custom_data']['width'] ) )
$item->update_meta_data( __( 'Width', $domain ), $values['custom_data']['width'] );
}
代码进入活动子主题(或活动主题)的function.php文件。测试和工作。
我见过很多例子,都是用客户价格将商品添加到WC购物车中,但没有一个是动态添加的。我正在尝试在一个接收POST变量的短代码函数中执行。。。。 这当然会将项目添加到购物车,但价格为零,我意识到我需要以某种方式将此数组保存回WC购物车数据。这种方法是可能的还是只能通过过滤器或操作钩子来完成?如果是这样,我如何保存改变的数组回到购物车的内容,或使其工作添加一个项目与公布的价格?非常感谢任何指导。 感谢do
我已经添加了一个自定义字段,其中有图片帧的额外价格,现在如果图片价格是10$和用户选择一个帧,它将加起来5$让说,总数将是15$。 现在,如果我添加另一个产品,它的选择定制框架价格应该得到添加。e、 g产品1的价格是:10美元,上面选择的框架是:frame1谁的价格是5美元,那么该产品的总价格将是15美元,如果产品2加上价格10美元,选择frame2的价格是6美元,那么该产品的总价格将是16美元,
问题在于当我的客户尝试从购物车中编辑一个产品时。因为所有产品都有相同的ID(我只有一个产品),所以添加到购物车的最后一个产品的元加载到文本字段中。我当前使用产品id检索中的元,但该id与购物车中的所有其他产品相同。有没有其他方法可以在不使用/(如或使用会话)的情况下检索元?
我正在尝试获取WooCommerce产品的自定义字段值,以显示在商店系统的不同页面上。我成功地对单个产品页面执行了此操作,但相同的代码不适用于购物车。 对于单个产品,我在函数中使用了此代码。php,它可以很好地工作: 我为购物车尝试了相同的代码,但这次值没有显示在页面上。我还提到了这个线程(获取自定义属性),将$post更改为$product,但仍然没有输出。。。 有什么建议吗?
我想知道是否有人对以下场景有经验。 我正在使用WooCommerce将我的产品上市,准备出售。一些产品(大约20个)有大量的变化,因此我决定将产品数据放在单独的表中,并通过SKU(获取数据的简单查询)将其加载到woocommerce中。到目前为止,一切都很顺利。这些产品很好用。它们的变体正在显示,用户可以选择它们,将它们添加到购物车中。 问题是,我已经将这20种产品设置为单一产品,并给它们一个$1
在WooCommerce中,我希望有一个复选框,当按下时,它会将一个产品添加到我的购物车中,并且该产品的价格是购物车总价格的3%。 基于“在Woocommerce结帐页面中将产品添加到购物车的复选框字段”回答线程,并进行了一些编辑以满足我的需要,以下是我的代码: 它添加产品精细,一切都好。然而,当我设定价格时,它没有更新。 好的,这是未选中的复选框。 这是选中后的复选框。如您所见,项目的值为46.