我正在使用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()
函数以反映上述等式的总和?
答案 0 :(得分:0)
对于您提出的问题,这有点模糊,因为更改价格的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的文档很多。