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

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

我创建了一个“自定义字段”,该字段显示在“产品页面”上,使购物者可以输入自己的自定义文本。然后,此自定义文字将被雕刻到相关产品上,我的客户想对输入的每个字母收取£2的费用。我的客户还要求在购物者在自定义字段中输入/删除字母时实时更新产品价格。

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

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

为了生成字符数,我将以下jQuery代码输入到Single Product Template中:

<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()函数以反映上述等式的总和,是否有人可以为我指明下一步的正确方向?

参考方案

您的要求有点含糊,因为更改价格的HTML实际上并不会更改产品价格本身。

您需要为需要雕刻的文字添加一个自定义输入框
然后,您需要连接到购物车并将此自定义字段值附加到产品
您需要通过计算将商品添加到购物车后有多少个字符来计算总价
然后,您需要将自定义字段挂接到订单数据,以便稍后进行检查

这是完成所有这些步骤的方法...

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

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的文档很多。

html onClick打开url存储在php变量中 - javascript

以下是我的代码,正在获取Uncaught SyntaxError: Unexpected token },但是我的代码中没有看到任何}。 window.open期望用引号引起来的url,我尝试了单引号和双引号的不同组合,但不起作用并且也无法在echo中转义双引号。请帮助谢谢..<?php $a = "https://www.google.co…

DotNetBrowser是否支持网络工作者? - javascript

我想在WinForm(c#)中使用Web worker(专用worker)开发自定义浏览器,DotNetBrowser是否支持Web Worker?或对此有其他建议吗? 参考方案 是的,DotNetBrowser支持JavaScript Web Worker。您可以通过在DotNetBrowser WinForms演示应用程序中通过以下链接http://ww…

如何安全地将数据从php表单传递到html - javascript

我有一个html格式的登录系统,我需要将用户名和密码发送回php后端,在那里我可以安全地对其进行加密并将其存储在数据库中。我想知道什么是最新和最安全的方法。请记住,这是密码的准系统字符串形式,请务必谨慎以最安全的方式将其返回。我知道$ _GET和$ _POST是非常不安全的。我是否在将javascript数据发送回服务器之前对其进行加密,因此将javascr…

html | textarea中的额外标签 - javascript

我正在尝试将Markdown从数据库加载到textarea:<textarea class="wmd-input" id="wmd-input" name="question" required="required"> <?php echo '**Th…

laravel如何验证动态添加的元素 - javascript

我的页面上有一个下拉列表选择an action。此选择的名称为action_id。使用可以有许多动作。因此,我添加了一个链接,当用户单击它时,我使用javascript和jquery生成了一个新选择,然后将此新选择添加到了DOM中。此新选择还具有名称action_id。最后,我将有许多名称为action_id的选择。我为您创建了这个jsfiddle来向您展示…