php - 在 WooCommerce 中设置折扣的结帐输入文本字段
问题描述
我正在使用复选框字段在 WooCommerce 答案代码中添加/删除自定义费用,该代码在我的商店中完美运行,以设置折扣(负费用)。
但我想使用输入字段设置费用金额。我的目标是通过 num/text 输入字段中的输入值减少购买总量。我不想使用复选框,我想使用输入或提交的数字来确定费用金额。
可能吗 ?我怎样才能做到这一点?
解决方案
要在 WooCommerce 中启用设置自定义折扣的结帐输入文本字段,只需进行一些更改,如下所示:
// Display an input text field after billing fields
add_action( 'woocommerce_after_checkout_billing_form', 'add_custom_checkout_text_field', 20 );
function add_custom_checkout_text_field(){
woocommerce_form_field( 'custom_discount', array(
'type' => 'text',
'label' => __('Add a discount amount'),
'class' => array( 'form-row-wide' ),
), WC()->session->get('custom_discount') );
}
// Remove "(optional)" label on checkbox field
add_filter( 'woocommerce_form_field' , 'remove_order_comments_optional_fields_label', 10, 4 );
function remove_order_comments_optional_fields_label( $field, $key, $args, $value ) {
// Only on checkout page for Order notes field
if( 'custom_discount' === $key && is_checkout() ) {
$optional = ' <span class="optional">(' . esc_html__( 'optional', 'woocommerce' ) . ')</span>';
$field = str_replace( $optional, '', $field );
}
return $field;
}
// Ajax / jQuery script
add_action( 'wp_footer', 'custom_discount_script' );
function custom_discount_script() {
// On checkoutpage
if( ( is_checkout() && ! is_wc_endpoint_url() ) ) :
?>
<script type="text/javascript">
jQuery( function($){
if (typeof woocommerce_params === 'undefined')
return false;
$(document.body).on('input change', 'input[name=custom_discount]', function(){
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
'action': 'custom_discount',
'custom_discount': $(this).val(),
},
success: function (result) {
$('body').trigger('update_checkout');
console.log(result);
},
});
});
});
</script>
<?php
endif;
}
// Get the ajax request and set value to WC session
add_action( 'wp_ajax_custom_discount', 'get_ajax_custom_discount' );
add_action( 'wp_ajax_nopriv_custom_discount', 'get_ajax_custom_discount' );
function get_ajax_custom_discount() {
if ( isset($_POST['custom_discount']) ) {
$discount = $_POST['custom_discount'] ? floatval($_POST['custom_discount']) : '';
WC()->session->set('custom_discount', $discount );
// echo WC()->session->get('custom_discount');
}
die();
}
// Add / Remove a custom discount
add_action( 'woocommerce_cart_calculate_fees', 'add_remove_custom_discount', 10, 1 );
function add_remove_custom_discount( $cart ) {
// Only on checkout
if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) || is_cart() )
return;
$discount = (float) WC()->session->get('custom_discount');
if( $discount > 0 ) {
$cart->add_fee( __( 'Custom Discount', 'woocommerce'), -$discount );
}
}
// Reset WC Session custom discount variable
add_action( 'woocommerce_checkout_order_created', 'reset_wc_session_custom_discount_variable' );
function reset_wc_session_custom_discount_variable( $order ) {
if ( WC()->session->__isset('custom_discount') ) {
WC()->session->__unset('custom_discount');
}
}
代码位于活动子主题(或活动主题)的 functions.php 文件中。测试和工作。
推荐阅读
- html - 如何控制缩略图的 div 容器的宽度?
- javascript - Ajax 不调用 PHP
- gruntjs - Grunt:预处理的目录要求
- excel - 从一个工作表中垂直拖动列平均值,在另一个 excel 中
- libreoffice-calc - “ Libreoffice Calc:在 B 列中查找 A 列的对应方,然后将 B 列的值复制到新列”
- swift - Swift Firebase UICollectionView 刷新导致重复缩略图
- xcode - 如何理解远程内核扩展代码签名?
- inno-setup - 使 Inno Setup 按照指示盲目使用 system32 和/或 syswow64
- uwp - 从 WinIoT Core 上的另一个 UWP 应用安装 UWP 应用
- asp.net - 具有通用方法的存储库的工作单元