如何操作`get_price_html()`函数?

时间:2017-05-10 01:06:09

标签: javascript php jquery wordpress

我正在使用WooCommerce功能在WordPress网站上工作。

我创建了一个自定义字段,它出现在产品页面上,允许购物者输入自己的自定义文本。然后,此自定义文本将被刻在相关产品上,我的客户希望每封输入的字母收取2英镑。我的客户还要求产品价格实时更新购物者在自定义字段中输入/删除字母的时间。

因此,我需要操纵get_price_html()函数以输出以下等式的总和:

  

当前产品价格+(字符数*£2)

为了生成字符计数,我在单个产品模板中输入了以下jQuery代码:

<script type="text/javascript"> 
jQuery(document).on('keyup', '.product-custom-text', updateCount);
jQuery(document).on('keydown', '.product-custom-text', updateCount);

function updateCount() {
    var cs = jQuery(this).val().length;
    jQuery('#letter_count').text(cs);
}
</script>

然后输出字符计数,我在functions.php文件中输入了下一位编码:

function custom_letter_counter(){
    echo '<span id="letter_count"></span>';
}
add_action('woocommerce_single_product_summary', 'custom_letter_counter');

是否有人能够指出我需要做的下一步的正确方向,以便操纵/覆盖get_price_html()函数以反映上述等式的总和?

1 个答案:

答案 0 :(得分:0)

对于您提出的问题,这有点模糊,因为更改价格的HTML实际上并没有改变产品价格。

  1. 您需要为需要雕刻的文字添加自定义输入框
  2. 然后,您需要挂钩购物车并将此自定义字段值附加到产品
  3. 您需要通过计算产品添加到购物车后的字符数来计算总价格
  4. 然后,您需要将自定义字段挂钩到订单数据,以便日后查看
  5. 以下是如何完成所有这些......

    首先让我们添加文字输入:

    function add_engrave_text_field() {
        echo '<table class="variations" cellspacing="0">
                <tbody>
                    <tr>
                        <td class="label"><label>Engrave Text</label></td>
                        <td class="value">
                            <label><input type="text" name="engrave_text" placeholder="Engrave Text" /> £2 per letter</label>                        
                        </td>
                    </tr>                             
                </tbody>
            </table>';
    }
    add_action( 'woocommerce_before_add_to_cart_button', 'add_engrave_text_field' );
    

    然后,当用户点击“添加到购物车”后,我们会将其附加到购物车订单中。按钮:

    function save_engrave_text( $cart_item_data, $product_id ) {
        if( isset( $_POST['engrave_text'] ) && !empty( $_POST['engrave_text'] ) ) {
            $cart_item_data[ "engrave_text" ] = esc_attr( $_POST['engrave_text'] );     
        }
    
        return $cart_item_data;
    }
    add_filter( 'woocommerce_add_cart_item_data', 'save_engrave_text', 99, 2 );
    

    然后我们根据需要雕刻的文字计算总成本:

    function calculate_engrave_text_fee( $cart_object ) {  
        foreach ( $cart_object->cart_contents as $key => $value ) {
            if( isset( $value["engrave_text"] ) ) {
                // Get how many characters there are
                $chars = strlen( $value["engrave_text"] );
                // Calculate the character count by 2 (£2)
                $engrave_text_fee = $chars * 2;
                $orgPrice = floatval( $value['data']->price );
                $value['data']->set_price( $orgPrice + $engrave_text_fee );
            }
        }
    }
    add_action( 'woocommerce_before_calculate_totals', 'calculate_engrave_text_fee', 99 );
    

    (可选)您可以在每个产品的购物车/结帐时渲染雕刻文字:

    function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
        $meta_items = array();
    
        /* Woo 2.4.2 updates */
        if( !empty( $cart_data ) ) {
            $meta_items = $cart_data;
        }
    
        if( isset( $cart_item["engrave_text"] ) ) {
            $meta_items[] = array( "name" => "Engrave Text", "value" => $cart_item["engrave_text"] );
        }
    
        return $meta_items;
    }
    add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 99, 2 );
    

    最后,您需要添加以下内容,以便在电子邮件,订单等上显示雕刻文字。

    function engrave_text_order_meta_handler( $item_id, $values, $cart_item_key ) {
        if( isset( $values["engrave_text"] ) ) {
            wc_add_order_item_meta( $item_id, "Engrave Text", $values["engrave_text"] );
        }
    }
    add_action( 'woocommerce_add_order_item_meta', 'engrave_text_order_meta_handler', 99, 3 );
    

    这是从我的一个旧项目中复制而来,并根据您自己的需要进行了修改,因此未经过全面测试。调试应该相当简单,因为有关WooCommerce的文档很多。