Woocommerce 中基于自定义字段的动态价格计算
Dynamic price calculation based on custom field in Woocommerce
在 Woocommerce 中,每个产品页面上都有一个文本框,允许用户输入自己的自定义文本。然后将此文本应用于产品,并按字母向客户收费。
除了数学逻辑之外,我已经设法使一切正常。当访问者输入 x 个字母时,当前的数学逻辑会正确计算产品价格 + 自定义字母的成本,并将此总和输出到购物篮小部件。
我 运行 遇到问题的地方是,当访问者进入购物篮页面时,自定义字体的成本翻了一番。
我只是想不通这是为什么。
在产品仪表板中创建文本字段:
<?php
/*Create Text Field in Product Dashboard*/
function add_text_field_product_dashboard(){
global $post;
$input_checkbox = get_post_meta( $post->ID, '_custom_text_option', true );
if( empty( $input_checkbox ) || $input_checkbox == 'no' ) $input_checkbox = '';
echo '<div class="product_custom_field">';
/*Product Checkbox Field*/
woocommerce_wp_checkbox(
array(
'id' => '_custom_text_option',
'desc' => __('set custom custom text field', 'woocommerce'),
'label' => __('Display custom custom text field', 'woocommerce'),
'desc_tip' => 'true',
'value' => $input_checkbox
)
);
/*Minimum Letter Text Box*/
woocommerce_wp_text_input(
array(
'id' => '_minimum_custom_text_option',
'name' => '_minimum_custom_text_option',
'desc' => __('set custom minimum Lettering text field', 'woocommerce'),
'label' => __('Minimum Letters', 'woocommerce'),
'desc_tip' => 'true'
)
);
/*Maximum Letter Text Box*/
woocommerce_wp_text_input(
array(
'id' => '_maximum_custom_text_option',
'desc' => __('set custom maximum Lettering text field', 'woocommerce'),
'label' => __('Maximum Letters', 'woocommerce'),
'desc_tip' => 'true'
)
);
/*Cost Per Letter Pricing*/
woocommerce_wp_text_input(
array(
'id' => '_pricing_custom_text_option',
'desc' => __('set custom pricing Lettering text field', 'woocommerce'),
'label' => __('Cost Per Letter', 'woocommerce'),
'desc_tip' => 'true'
)
);
echo '</div>';
}
add_action('woocommerce_product_options_advanced', 'add_text_field_product_dashboard');
?>
保存文本字段条目:
<?php
/*Save Inputted Entries, in the Product Dashboard Text Fields.*/
/*Checkbox Field*/
function woocommerce_product_custom_fields_save($post_id){
$_custom_text_option = isset( $_POST['_custom_text_option'] ) ? 'yes' : '';
update_post_meta( $post_id, '_custom_text_option', $_custom_text_option );
}
add_action('woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save');
/*Save Minimum Letters*/
function woocommerce_product_custom_fields_save1($post_id){
if ( isset( $_POST['_minimum_custom_text_option'] ) )
update_post_meta($post_id, '_minimum_custom_text_option', esc_attr( $_POST['_minimum_custom_text_option'] ));
}
add_action( 'woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save1' );
/*Save Maximum Letters*/
function woocommerce_product_custom_fields_save2($post_id){
if ( isset( $_POST['_maximum_custom_text_option'] ) )
update_post_meta($post_id, '_maximum_custom_text_option', esc_attr( $_POST['_maximum_custom_text_option'] ));
}
add_action( 'woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save2' );
/*Save Cost Per Letter*/
function woocommerce_product_custom_fields_save3($post_id){
if ( isset( $_POST['_pricing_custom_text_option'] ) )
update_post_meta($post_id, '_pricing_custom_text_option', esc_attr( $_POST['_pricing_custom_text_option'] ));
}
add_action( 'woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save3' );
?>
将自定义文本输出到产品页面:
<?php
/*Output Custom Text Field to Product Page*/
function add_custom_text_field() {
global $post;
// Get the checkbox value
$custom_option = get_post_meta( $post->ID, '_custom_text_option', true );
// If is single product page and have the "custom text option" enabled we display the field
if ( is_product() && ! empty($custom_option) ) {
?>
<div>
<label class="product-custom-text-label" for="custom_text"><?php _e( 'Custom Letters:', 'woocommerce'); ?><br>
<input style="min-width:220px" type="text" class="product-counter" name="custom_text" placeholder="<?php _e( 'Enter Your Custom Letters ...', 'woocommerce'); ?>" minlength="<?php global $post; echo get_post_meta($post->ID,'_minimum_custom_text_option',true);?>" maxlength="<?php global $post; echo get_post_meta($post->ID,'_maximum_custom_text_option',true);?>" />
</label>
</div><br>
<?php
}
}
add_action( 'woocommerce_before_add_to_cart_button', 'add_custom_text_field', 0 );
?>
?>
加入购物车:
<?php
/*Append to Cart once Shoper adds to Cart*/
function save_custom_text( $cart_item_data, $product_id ) {
if( isset( $_POST['custom_text'] ) && !empty( $_POST['custom_text'] ) ) {
$cart_item_data[ "custom_text" ] = esc_attr( $_POST['custom_text'] );
}
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'save_custom_text', 99, 2 );
?>
产品总和加上输入的每个字母的成本:
<?php
/*Sum of Product Price plus Custom Text*/
function calculate_custom_text_fee( $cart_object ) {
foreach ( $cart_object->get_cart() as $cart_item ) {
// Checking that we got the custom text in cart object
if( ! empty( $cart_item["custom_text"] ) ) {
// Quantity of characters entered into Custom Text Field:
$lenght = strlen( $cart_item["custom_text"] );
// get the custom pricing for this product
$pricing_custom = get_post_meta( $cart_item['product_id'], '_pricing_custom_text_option', true );
// Characters Entered Multiplied by Cost of Each Letter:
$custom_text_fee = $lenght * $pricing_custom;
// get product price
$price = floatval( $cart_item['data']->get_price() );
// set new price
$cart_item['data']->set_price( $price + $custom_text_fee );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_custom_text_fee', 99, 1 );
?>
输出到购物车说明:
<?php
/*Output to Cart Description*/
function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
$meta_items = array();
if( !empty( $cart_data ) ) {
$meta_items = $cart_data;
}
if( isset( $cart_item["custom_text"] ) ) {
$meta_items[] = array( "name" => "Your Custom Text", "value" => $cart_item["custom_text"] );
}
return $meta_items;
}
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 99, 2 );
?>
确保产品在电子邮件中:
<?php
/*Ensure Product is in Email Notifications*/
function custom_text_order_meta_handler( $item_id, $values, $cart_item_key ) {
if( isset( $values["custom_text"] ) ) {
wc_add_order_item_meta( $item_id, "Custom Text", $values["custom_text"] );
}
}
add_action( 'woocommerce_add_order_item_meta', 'custom_text_order_meta_handler', 99, 3 );
?>
有谁能看出我可能哪里出错了,这导致我的数学在“购物篮”页面中使成本翻倍?
需要说明的是,产品价格被称为罚款。那不是加倍。只是自定义文本的成本。我觉得 $price
可能有问题,但我不太确定。
任何关于此事的指点,将不胜感激。
通过id获取商品价格:
$_product = wc_get_product( $product_id );
$_product->get_regular_price();
$_product->get_sale_price();
$_product->get_price();
或者,
获取正常价格:
$price = get_post_meta( get_the_ID(), '_regular_price', true);
// $price 将 return 正常价格
获取促销价:
$sale = get_post_meta( get_the_ID(), '_sale_price', true);
// $sale 将 return 销售价格
更新
为了避免这个问题,我在计算新价格之前使用 woocommerce_add_cart_item_data
挂钩 (用于将自定义文本保存在购物车对象中的相同挂钩)[将其保存在购物车对象中]。
注意:对于你的文本,我正在使用 trim()
php 函数从长度字母计数中删除空格......如果你不需要它,你可以删除它。
我重新访问了您的代码并做了一些更改:
// Add custom fields in "product data" settings metabox ("Advanced" tab)
add_action('woocommerce_product_options_advanced', 'add_text_field_product_dashboard');
function add_text_field_product_dashboard(){
global $post;
echo '<div class="product_custom_field">';
// Checkbox Field
woocommerce_wp_checkbox( array(
'id' => '_custom_text_option',
'description' => __('set custom custom text field', 'woocommerce'),
'label' => __('Display custom custom text field', 'woocommerce'),
'desc_tip' => 'true',
) );
// Minimum Letter Text Box
woocommerce_wp_text_input( array(
'id' => '_minimum_custom_text_option',
'label' => __('Minimum Letters', 'woocommerce'),
'description' => __('set custom minimum Lettering text field', 'woocommerce'),
'desc_tip' => 'true',
) );
// Maximum Letter Text Box
woocommerce_wp_text_input( array(
'id' => '_maximum_custom_text_option',
'label' => __('Maximum Letters', 'woocommerce'),
'description' => __('set custom maximum Lettering text field', 'woocommerce'),
'desc_tip' => 'true'
) );
// Cost Per Letter Pricing
woocommerce_wp_text_input( array(
'id' => '_pricing_custom_text_option',
'label' => __('Cost Per Letter', 'woocommerce'),
'description' => __('set custom pricing Lettering text field', 'woocommerce'),
'desc_tip' => 'true'
) );
echo '</div>';
}
// Save Inputted Entries, in the Product Dashboard Text Fields.
add_action('woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save');
function woocommerce_product_custom_fields_save($post_id){
// Checkbox Field
$checkbox = isset( $_POST['_custom_text_option'] ) ? 'yes' : 'no';
update_post_meta( $post_id, '_custom_text_option', $checkbox );
// Save Minimum Letters
if ( isset( $_POST['_minimum_custom_text_option'] ) )
update_post_meta($post_id, '_minimum_custom_text_option', sanitize_text_field( $_POST['_minimum_custom_text_option'] ) );
// Save Maximum Letters
if ( isset( $_POST['_maximum_custom_text_option'] ) )
update_post_meta($post_id, '_maximum_custom_text_option', sanitize_text_field( $_POST['_maximum_custom_text_option'] ) );
// Save Cost Per Letter
if ( isset( $_POST['_pricing_custom_text_option'] ) )
update_post_meta($post_id, '_pricing_custom_text_option', sanitize_text_field( $_POST['_pricing_custom_text_option'] ) );
}
// Output Custom Text Field to Product Page
add_action( 'woocommerce_before_add_to_cart_button', 'add_custom_text_field', 0 );
function add_custom_text_field() {
global $post;
// Get the checkbox value
$custom_option = get_post_meta( $post->ID, '_custom_text_option', true );
// If is single product page and have the "custom text option" enabled we display the field
if ( is_product() && ! empty($custom_option) ) {
?>
<div>
<label class="product-custom-text-label" for="custom_text"><?php _e( 'Custom Letters:', 'woocommerce'); ?><br>
<input style="min-width:220px" type="text" class="product-counter" name="custom_text" placeholder="<?php _e( 'Enter Your Custom Letters ...', 'woocommerce'); ?>" minlength="<?php global $post; echo get_post_meta($post->ID,'_minimum_custom_text_option',true);?>" maxlength="<?php global $post; echo get_post_meta($post->ID,'_maximum_custom_text_option',true);?>" />
</label>
</div><br>
<?php
}
}
// Set custom text and calculated price as custom cart data in the cart item
add_filter( 'woocommerce_add_cart_item_data', 'save_custom_data_in_cart_object', 30, 3 );
function save_custom_data_in_cart_object( $cart_item_data, $product_id, $variation_id ) {
if( ! isset( $_POST['custom_text'] ) || empty( $_POST['custom_text'] ) )
return $cart_item_data;
// Get the custom text cost by letter
$pricing_custom = (float) get_post_meta( $product_id, '_pricing_custom_text_option', true );
// Get an instance of the WC_Product object
$product = $variation_id > 0 ? wc_get_product($variation_id) : wc_get_product($product_id);
$product_price = (float) $product->get_price(); // Get the product price
// Get the text
$custom_text = sanitize_text_field ( $_POST['custom_text'] );
// Get lenght (trimming white spaces)
$lenght = (float) strlen ( trim( $custom_text ) );
// Set the text and the calculated price as custom cart data in the cart item
$cart_item_data['custom_data']['price'] = $product_price + ( $lenght * $pricing_custom );
$cart_item_data['custom_data']['text'] = $custom_text;
return $cart_item_data;
}
// Display Custom text in cart and checkout pages
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 99, 2 );
function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
if( isset( $cart_item['custom_data']['text'] ) )
$cart_data[] = array( "name" => "Your Custom Text", "value" => $cart_item["custom_data"]["text"] );
return $cart_data;
}
// Set the new calculated price of the cart item
add_action( 'woocommerce_before_calculate_totals', 'calculate_custom_text_fee', 99, 1 );
function calculate_custom_text_fee( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
foreach ( $cart->get_cart() as $cart_item ) {
if( isset( $cart_item['custom_data']['price'] ) ) {
// Get the new calculated price
$new_price = (float) $cart_item['custom_data']['price'];
// Set the new calculated price
$cart_item['data']->set_price( $new_price );
}
}
}
// Save the custom text as order item data (displaying it in order and notifications)
add_action( 'woocommerce_add_order_item_meta', 'custom_text_order_meta_handler', 99, 3 );
function custom_text_order_meta_handler( $item_id, $values, $cart_item_key ) {
if( isset( $values['custom_data']['text'] ) )
wc_add_order_item_meta( $item_id, "Custom Text", $values["custom_data"]["text"] );
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。
已测试并有效
在 Woocommerce 中,每个产品页面上都有一个文本框,允许用户输入自己的自定义文本。然后将此文本应用于产品,并按字母向客户收费。
除了数学逻辑之外,我已经设法使一切正常。当访问者输入 x 个字母时,当前的数学逻辑会正确计算产品价格 + 自定义字母的成本,并将此总和输出到购物篮小部件。
我 运行 遇到问题的地方是,当访问者进入购物篮页面时,自定义字体的成本翻了一番。
我只是想不通这是为什么。
在产品仪表板中创建文本字段:
<?php
/*Create Text Field in Product Dashboard*/
function add_text_field_product_dashboard(){
global $post;
$input_checkbox = get_post_meta( $post->ID, '_custom_text_option', true );
if( empty( $input_checkbox ) || $input_checkbox == 'no' ) $input_checkbox = '';
echo '<div class="product_custom_field">';
/*Product Checkbox Field*/
woocommerce_wp_checkbox(
array(
'id' => '_custom_text_option',
'desc' => __('set custom custom text field', 'woocommerce'),
'label' => __('Display custom custom text field', 'woocommerce'),
'desc_tip' => 'true',
'value' => $input_checkbox
)
);
/*Minimum Letter Text Box*/
woocommerce_wp_text_input(
array(
'id' => '_minimum_custom_text_option',
'name' => '_minimum_custom_text_option',
'desc' => __('set custom minimum Lettering text field', 'woocommerce'),
'label' => __('Minimum Letters', 'woocommerce'),
'desc_tip' => 'true'
)
);
/*Maximum Letter Text Box*/
woocommerce_wp_text_input(
array(
'id' => '_maximum_custom_text_option',
'desc' => __('set custom maximum Lettering text field', 'woocommerce'),
'label' => __('Maximum Letters', 'woocommerce'),
'desc_tip' => 'true'
)
);
/*Cost Per Letter Pricing*/
woocommerce_wp_text_input(
array(
'id' => '_pricing_custom_text_option',
'desc' => __('set custom pricing Lettering text field', 'woocommerce'),
'label' => __('Cost Per Letter', 'woocommerce'),
'desc_tip' => 'true'
)
);
echo '</div>';
}
add_action('woocommerce_product_options_advanced', 'add_text_field_product_dashboard');
?>
保存文本字段条目:
<?php
/*Save Inputted Entries, in the Product Dashboard Text Fields.*/
/*Checkbox Field*/
function woocommerce_product_custom_fields_save($post_id){
$_custom_text_option = isset( $_POST['_custom_text_option'] ) ? 'yes' : '';
update_post_meta( $post_id, '_custom_text_option', $_custom_text_option );
}
add_action('woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save');
/*Save Minimum Letters*/
function woocommerce_product_custom_fields_save1($post_id){
if ( isset( $_POST['_minimum_custom_text_option'] ) )
update_post_meta($post_id, '_minimum_custom_text_option', esc_attr( $_POST['_minimum_custom_text_option'] ));
}
add_action( 'woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save1' );
/*Save Maximum Letters*/
function woocommerce_product_custom_fields_save2($post_id){
if ( isset( $_POST['_maximum_custom_text_option'] ) )
update_post_meta($post_id, '_maximum_custom_text_option', esc_attr( $_POST['_maximum_custom_text_option'] ));
}
add_action( 'woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save2' );
/*Save Cost Per Letter*/
function woocommerce_product_custom_fields_save3($post_id){
if ( isset( $_POST['_pricing_custom_text_option'] ) )
update_post_meta($post_id, '_pricing_custom_text_option', esc_attr( $_POST['_pricing_custom_text_option'] ));
}
add_action( 'woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save3' );
?>
将自定义文本输出到产品页面:
<?php
/*Output Custom Text Field to Product Page*/
function add_custom_text_field() {
global $post;
// Get the checkbox value
$custom_option = get_post_meta( $post->ID, '_custom_text_option', true );
// If is single product page and have the "custom text option" enabled we display the field
if ( is_product() && ! empty($custom_option) ) {
?>
<div>
<label class="product-custom-text-label" for="custom_text"><?php _e( 'Custom Letters:', 'woocommerce'); ?><br>
<input style="min-width:220px" type="text" class="product-counter" name="custom_text" placeholder="<?php _e( 'Enter Your Custom Letters ...', 'woocommerce'); ?>" minlength="<?php global $post; echo get_post_meta($post->ID,'_minimum_custom_text_option',true);?>" maxlength="<?php global $post; echo get_post_meta($post->ID,'_maximum_custom_text_option',true);?>" />
</label>
</div><br>
<?php
}
}
add_action( 'woocommerce_before_add_to_cart_button', 'add_custom_text_field', 0 );
?>
?>
加入购物车:
<?php
/*Append to Cart once Shoper adds to Cart*/
function save_custom_text( $cart_item_data, $product_id ) {
if( isset( $_POST['custom_text'] ) && !empty( $_POST['custom_text'] ) ) {
$cart_item_data[ "custom_text" ] = esc_attr( $_POST['custom_text'] );
}
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'save_custom_text', 99, 2 );
?>
产品总和加上输入的每个字母的成本:
<?php
/*Sum of Product Price plus Custom Text*/
function calculate_custom_text_fee( $cart_object ) {
foreach ( $cart_object->get_cart() as $cart_item ) {
// Checking that we got the custom text in cart object
if( ! empty( $cart_item["custom_text"] ) ) {
// Quantity of characters entered into Custom Text Field:
$lenght = strlen( $cart_item["custom_text"] );
// get the custom pricing for this product
$pricing_custom = get_post_meta( $cart_item['product_id'], '_pricing_custom_text_option', true );
// Characters Entered Multiplied by Cost of Each Letter:
$custom_text_fee = $lenght * $pricing_custom;
// get product price
$price = floatval( $cart_item['data']->get_price() );
// set new price
$cart_item['data']->set_price( $price + $custom_text_fee );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_custom_text_fee', 99, 1 );
?>
输出到购物车说明:
<?php
/*Output to Cart Description*/
function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
$meta_items = array();
if( !empty( $cart_data ) ) {
$meta_items = $cart_data;
}
if( isset( $cart_item["custom_text"] ) ) {
$meta_items[] = array( "name" => "Your Custom Text", "value" => $cart_item["custom_text"] );
}
return $meta_items;
}
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 99, 2 );
?>
确保产品在电子邮件中:
<?php
/*Ensure Product is in Email Notifications*/
function custom_text_order_meta_handler( $item_id, $values, $cart_item_key ) {
if( isset( $values["custom_text"] ) ) {
wc_add_order_item_meta( $item_id, "Custom Text", $values["custom_text"] );
}
}
add_action( 'woocommerce_add_order_item_meta', 'custom_text_order_meta_handler', 99, 3 );
?>
有谁能看出我可能哪里出错了,这导致我的数学在“购物篮”页面中使成本翻倍?
需要说明的是,产品价格被称为罚款。那不是加倍。只是自定义文本的成本。我觉得 $price
可能有问题,但我不太确定。
任何关于此事的指点,将不胜感激。
通过id获取商品价格:
$_product = wc_get_product( $product_id );
$_product->get_regular_price();
$_product->get_sale_price();
$_product->get_price();
或者, 获取正常价格:
$price = get_post_meta( get_the_ID(), '_regular_price', true); // $price 将 return 正常价格
获取促销价:
$sale = get_post_meta( get_the_ID(), '_sale_price', true); // $sale 将 return 销售价格
更新
为了避免这个问题,我在计算新价格之前使用 woocommerce_add_cart_item_data
挂钩 (用于将自定义文本保存在购物车对象中的相同挂钩)[将其保存在购物车对象中]。
注意:对于你的文本,我正在使用 trim()
php 函数从长度字母计数中删除空格......如果你不需要它,你可以删除它。
我重新访问了您的代码并做了一些更改:
// Add custom fields in "product data" settings metabox ("Advanced" tab)
add_action('woocommerce_product_options_advanced', 'add_text_field_product_dashboard');
function add_text_field_product_dashboard(){
global $post;
echo '<div class="product_custom_field">';
// Checkbox Field
woocommerce_wp_checkbox( array(
'id' => '_custom_text_option',
'description' => __('set custom custom text field', 'woocommerce'),
'label' => __('Display custom custom text field', 'woocommerce'),
'desc_tip' => 'true',
) );
// Minimum Letter Text Box
woocommerce_wp_text_input( array(
'id' => '_minimum_custom_text_option',
'label' => __('Minimum Letters', 'woocommerce'),
'description' => __('set custom minimum Lettering text field', 'woocommerce'),
'desc_tip' => 'true',
) );
// Maximum Letter Text Box
woocommerce_wp_text_input( array(
'id' => '_maximum_custom_text_option',
'label' => __('Maximum Letters', 'woocommerce'),
'description' => __('set custom maximum Lettering text field', 'woocommerce'),
'desc_tip' => 'true'
) );
// Cost Per Letter Pricing
woocommerce_wp_text_input( array(
'id' => '_pricing_custom_text_option',
'label' => __('Cost Per Letter', 'woocommerce'),
'description' => __('set custom pricing Lettering text field', 'woocommerce'),
'desc_tip' => 'true'
) );
echo '</div>';
}
// Save Inputted Entries, in the Product Dashboard Text Fields.
add_action('woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save');
function woocommerce_product_custom_fields_save($post_id){
// Checkbox Field
$checkbox = isset( $_POST['_custom_text_option'] ) ? 'yes' : 'no';
update_post_meta( $post_id, '_custom_text_option', $checkbox );
// Save Minimum Letters
if ( isset( $_POST['_minimum_custom_text_option'] ) )
update_post_meta($post_id, '_minimum_custom_text_option', sanitize_text_field( $_POST['_minimum_custom_text_option'] ) );
// Save Maximum Letters
if ( isset( $_POST['_maximum_custom_text_option'] ) )
update_post_meta($post_id, '_maximum_custom_text_option', sanitize_text_field( $_POST['_maximum_custom_text_option'] ) );
// Save Cost Per Letter
if ( isset( $_POST['_pricing_custom_text_option'] ) )
update_post_meta($post_id, '_pricing_custom_text_option', sanitize_text_field( $_POST['_pricing_custom_text_option'] ) );
}
// Output Custom Text Field to Product Page
add_action( 'woocommerce_before_add_to_cart_button', 'add_custom_text_field', 0 );
function add_custom_text_field() {
global $post;
// Get the checkbox value
$custom_option = get_post_meta( $post->ID, '_custom_text_option', true );
// If is single product page and have the "custom text option" enabled we display the field
if ( is_product() && ! empty($custom_option) ) {
?>
<div>
<label class="product-custom-text-label" for="custom_text"><?php _e( 'Custom Letters:', 'woocommerce'); ?><br>
<input style="min-width:220px" type="text" class="product-counter" name="custom_text" placeholder="<?php _e( 'Enter Your Custom Letters ...', 'woocommerce'); ?>" minlength="<?php global $post; echo get_post_meta($post->ID,'_minimum_custom_text_option',true);?>" maxlength="<?php global $post; echo get_post_meta($post->ID,'_maximum_custom_text_option',true);?>" />
</label>
</div><br>
<?php
}
}
// Set custom text and calculated price as custom cart data in the cart item
add_filter( 'woocommerce_add_cart_item_data', 'save_custom_data_in_cart_object', 30, 3 );
function save_custom_data_in_cart_object( $cart_item_data, $product_id, $variation_id ) {
if( ! isset( $_POST['custom_text'] ) || empty( $_POST['custom_text'] ) )
return $cart_item_data;
// Get the custom text cost by letter
$pricing_custom = (float) get_post_meta( $product_id, '_pricing_custom_text_option', true );
// Get an instance of the WC_Product object
$product = $variation_id > 0 ? wc_get_product($variation_id) : wc_get_product($product_id);
$product_price = (float) $product->get_price(); // Get the product price
// Get the text
$custom_text = sanitize_text_field ( $_POST['custom_text'] );
// Get lenght (trimming white spaces)
$lenght = (float) strlen ( trim( $custom_text ) );
// Set the text and the calculated price as custom cart data in the cart item
$cart_item_data['custom_data']['price'] = $product_price + ( $lenght * $pricing_custom );
$cart_item_data['custom_data']['text'] = $custom_text;
return $cart_item_data;
}
// Display Custom text in cart and checkout pages
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 99, 2 );
function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
if( isset( $cart_item['custom_data']['text'] ) )
$cart_data[] = array( "name" => "Your Custom Text", "value" => $cart_item["custom_data"]["text"] );
return $cart_data;
}
// Set the new calculated price of the cart item
add_action( 'woocommerce_before_calculate_totals', 'calculate_custom_text_fee', 99, 1 );
function calculate_custom_text_fee( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
foreach ( $cart->get_cart() as $cart_item ) {
if( isset( $cart_item['custom_data']['price'] ) ) {
// Get the new calculated price
$new_price = (float) $cart_item['custom_data']['price'];
// Set the new calculated price
$cart_item['data']->set_price( $new_price );
}
}
}
// Save the custom text as order item data (displaying it in order and notifications)
add_action( 'woocommerce_add_order_item_meta', 'custom_text_order_meta_handler', 99, 3 );
function custom_text_order_meta_handler( $item_id, $values, $cart_item_key ) {
if( isset( $values['custom_data']['text'] ) )
wc_add_order_item_meta( $item_id, "Custom Text", $values["custom_data"]["text"] );
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。
已测试并有效