从 WooCommerce 中的自定义字段值动态更改购物车商品价格
Change cart items price dynamically from a custom field value in WooCommerce
我目前正在开发一个具有 WooCommerce 功能的 WordPress 网站。
每个产品页面都有一个自定义字段,允许网站访问者输入他们想要应用于产品的文本。费用按 'per letter entered' 计算。
为了计算产品的总成本(产品价格 + 输入的自定义字母),我已将以下代码插入到 functions.php
文件中:
<?php
function calculate_engrave_text_fee( $cart_object ) {
foreach ( $cart_object->cart_contents as $key => $value ) {
if( isset( $value["engrave_text"] ) ) {
// Quantity of characters entered into Custom Text Field:
$chars = strlen( $value["engrave_text"] );
// Characters Entered Multiplied by Cost of Each Letter:
$engrave_text_fee = $chars * 3; //Need to dynamically call this.
$orgPrice = floatval( $value['data']->price );
$value['data']->set_price( $orgPrice + $engrave_text_fee );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_engrave_text_fee', 99 );
?>
上面的代码绝对没问题;除了一个例外。
由于每封信的成本会有所不同,具体取决于产品,因此使用 $engrave_text_fee = $chars * 3;
之类的静态条目并不理想。或者,我在 WooCommerce 产品仪表板中创建了一个自定义字段,站点管理员可以通过该字段为每个产品的单独自定义字母输入价格。
问题
要从 WooCommerce 产品仪表板动态调用自定义字段条目并将其放入上面的数学中,我尝试将:$engrave_text_fee = $chars * 3;
替换为:
$engrave_text_fee = $chars * <?php global $post; echo get_post_meta($post->ID,'_pricing_engrave_text_option',true)?>;
不幸的是,这只会使网站脱机。我只能假设编码语法有问题!?有谁能指出我这里可能哪里出错了?
php 标签 <?php
似乎不合适。它应该看起来更像这样
global $post;
$engrave_text_fee = $chars * get_post_meta($post->ID,'_pricing_engrave_text_option',true);
已更新 (2018 年 10 月)
您正确的动态代码应该是(因为您有一些错误和过时的代码):
add_action( 'woocommerce_before_calculate_totals', 'calculate_engrave_text_fee', 99, 1 );
function calculate_engrave_text_fee( $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 ) {
// Checking that we got the engrave text in cart object
if( isset( $cart_item["engrave_text"] ) && ! empty( $cart_item["engrave_text"] ) ) {
// Quantity of characters entered into Custom Text Field:
$lenght = strlen( $cart_item["engrave_text"] );
// Get the engrave pricing for this product
$pricing_engrave = get_post_meta( $cart_item['data']->get_id(), '_pricing_engrave_text_option', true );
// Characters Entered Multiplied by Cost of Each Letter:
$engrave_text_fee = $lenght * $pricing_engrave;
// get product price
$price = floatval( $cart_item['data']->get_price() );
// set new price
$cart_item['data']->set_price( $price + $engrave_text_fee );
}
}
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
此代码应该有效
我目前正在开发一个具有 WooCommerce 功能的 WordPress 网站。
每个产品页面都有一个自定义字段,允许网站访问者输入他们想要应用于产品的文本。费用按 'per letter entered' 计算。
为了计算产品的总成本(产品价格 + 输入的自定义字母),我已将以下代码插入到 functions.php
文件中:
<?php
function calculate_engrave_text_fee( $cart_object ) {
foreach ( $cart_object->cart_contents as $key => $value ) {
if( isset( $value["engrave_text"] ) ) {
// Quantity of characters entered into Custom Text Field:
$chars = strlen( $value["engrave_text"] );
// Characters Entered Multiplied by Cost of Each Letter:
$engrave_text_fee = $chars * 3; //Need to dynamically call this.
$orgPrice = floatval( $value['data']->price );
$value['data']->set_price( $orgPrice + $engrave_text_fee );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_engrave_text_fee', 99 );
?>
上面的代码绝对没问题;除了一个例外。
由于每封信的成本会有所不同,具体取决于产品,因此使用 $engrave_text_fee = $chars * 3;
之类的静态条目并不理想。或者,我在 WooCommerce 产品仪表板中创建了一个自定义字段,站点管理员可以通过该字段为每个产品的单独自定义字母输入价格。
问题
要从 WooCommerce 产品仪表板动态调用自定义字段条目并将其放入上面的数学中,我尝试将:$engrave_text_fee = $chars * 3;
替换为:
$engrave_text_fee = $chars * <?php global $post; echo get_post_meta($post->ID,'_pricing_engrave_text_option',true)?>;
不幸的是,这只会使网站脱机。我只能假设编码语法有问题!?有谁能指出我这里可能哪里出错了?
php 标签 <?php
似乎不合适。它应该看起来更像这样
global $post;
$engrave_text_fee = $chars * get_post_meta($post->ID,'_pricing_engrave_text_option',true);
已更新 (2018 年 10 月)
您正确的动态代码应该是(因为您有一些错误和过时的代码):
add_action( 'woocommerce_before_calculate_totals', 'calculate_engrave_text_fee', 99, 1 );
function calculate_engrave_text_fee( $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 ) {
// Checking that we got the engrave text in cart object
if( isset( $cart_item["engrave_text"] ) && ! empty( $cart_item["engrave_text"] ) ) {
// Quantity of characters entered into Custom Text Field:
$lenght = strlen( $cart_item["engrave_text"] );
// Get the engrave pricing for this product
$pricing_engrave = get_post_meta( $cart_item['data']->get_id(), '_pricing_engrave_text_option', true );
// Characters Entered Multiplied by Cost of Each Letter:
$engrave_text_fee = $lenght * $pricing_engrave;
// get product price
$price = floatval( $cart_item['data']->get_price() );
// set new price
$cart_item['data']->set_price( $price + $engrave_text_fee );
}
}
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
此代码应该有效