从 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 文件或任何插件文件。

此代码应该有效