wordpress - 仅向来自 CA 的客户添加捐赠复选框
问题描述
我正在尝试根据他们的输入/过去的送货地址仅为加拿大客户设置一个捐赠复选框。仅当发货国家/地区为加拿大时,才应显示该复选框。有什么办法可以做到这一点?
add_action( 'woocommerce_before_checkout_billing_form', 'git_box' );
function gift_box ( $checkout ) {
echo '<div id="message_fields">';
woocommerce_form_field( 'add_gift_box', array(
'type' => 'checkbox',
'class' => array('add_gift_box form-row-wide'),
'label' => __('Add Donation to the site? ($2)'),
'placeholder' => __(''),
), $checkout->get_value( 'add_gift_box' ));
echo '</div>';
}
add_action( 'wp_footer', 'woocommerce_add_gift_box' );
function woocommerce_add_gift_box() {
if (is_checkout()) {
?>
<script type="text/javascript">
jQuery( document ).ready(function( $ ) {
$('#add_gift_box').click(function(){
jQuery('body').trigger('update_checkout');
});
});
</script>
<?php
}
}
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $cart ){
if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {
return;
}
if ( isset( $_POST['post_data'] ) ) {
parse_str( $_POST['post_data'], $post_data );
} else {
$post_data = $_POST;
}
if (isset($post_data['add_gift_box'])) {
$extracost = 2.65;
WC()->cart->add_fee( 'Site Donation:', $extracost );
}
}
解决方案
你在正确的轨道上,但你尝试的有点太简单了;-) 这是我测试过的版本。Show/Hide get's triggered on document load and on billing country change,然后取消选中复选框以防新选择的国家/地区不是 CA。
1)添加复选框
add_filter( 'woocommerce_checkout_fields' , 'add_donate_field' );
function add_donate_field( $fields ) {
$fields['order']['order_donate'] = array(
'type' => 'checkbox',
'label' => 'Add Donation to the site? ($2)',
'required' => false,
'class' => array('donation form-row-wide hidden')
);
return $fields;
}
2)添加 Show hide + Ajax 功能(样式可以去其他地方,只是在这里添加,所以它开箱即用)
add_action( 'wp_footer', 'woocommerce_donate_field_js' );
function woocommerce_donate_field_js() {
if (is_checkout()) {
?>
<style> .donation.hidden { display: none; }</style>
<script type="text/javascript">
jQuery(function($){
var donatefield = '.donation',
donatebox = 'input[name=order_donate]',
bc = 'select#billing_country',
donate_enabled_countries = ['CA'],
donate = '0';
// Show/Hide the donate field
function showHideDonate(){
if (jQuery.inArray( $(bc).val(), donate_enabled_countries) === -1){
if ( ! $(donatefield).hasClass('hidden') ) {
$(donatebox).prop('checked',false).trigger('change');
$(donatefield).addClass('hidden');
}
} else {
$(donatefield).removeClass('hidden');
}
}
$(bc).change(showHideDonate);
$(document).ready(showHideDonate);
// Send donate field value to AJAX
$('form.checkout').on('change', donatebox, function(e){
e.preventDefault();
if ($(this).is(":checked")) { donate = '1'; } else { donate = '0'; }
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'woo_get_ajax_data',
'donate': donate,
},
success: function (result) {
$('body').trigger('update_checkout');
}
});
});
});
</script>
<?php
}
}
3) 获取 AJAX 数据
add_action( 'wp_ajax_woo_get_ajax_data', 'checkout_donate_choice_set_session' );
add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'checkout_donate_choice_set_session' );
function checkout_donate_choice_set_session() {
if ( isset($_POST['donate']) ){
$donate = sanitize_key( $_POST['donate'] );
WC()->session->set('donate', $donate );
echo json_encode( $donate );
}
die();
}
4) 更新购物车
add_action( 'woocommerce_cart_calculate_fees', 'woocommerce_donate_fee' );
function woocommerce_donate_fee( $cart ){
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
$donate = WC()->session->get( 'donate' );
$donation = 2; // Donation amount
$test = 0; // just for testing can be removed
if ($donate === '1') {
$cart->add_fee( __('Donation', 'woocommerce'), $donation );
} else { // can be removed as well
$cart->add_fee( __('No Donation', 'woocommerce'), $test );
}
}
推荐阅读
- python - 大熊猫每分钟的日期直方图
- javascript - 如何根据多个键对数据进行分组和聚合?
- algorithm - 哪个算法函数的增长更快,O(n^2) 或 O(n^2*log(n)),为什么?
- python - 测试脚本的 HTML 报告生成
- android - Android Studio ConstraintLayout RTL 问题
- ios - 无法将图像发送到下一个视图控制器 - 无
- java - 休眠验证排序
- python - 如何在 if else 条件下循环函数
- python - TypeError: __add__() 缺少 1 个必需的位置参数:
- xslt - 如何限制 XSLT 中的字数?