- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在寻找解决方案...我正在尝试根据添加到 Woocommerce 结帐页面的单选按钮选项来显示或隐藏特定运费。但我对 Ajax 和 JQuery 一无所知,我认为这是它所需要的。
基本上,如果用户选择广播option_1,它只会显示“flat_rate:1”和“flat_rate:2”。如果用户选择单选option_2,它将仅显示“flat_rate:3”和“flat_rate:4”
Click here for example of checkout screen
以下是结帐页面上显示的单选按钮的代码:
add_action( 'woocommerce_review_order_before_payment','tc_checkout_radio_choice' );
function tc_checkout_radio_choice() {
$businesstype = array(
'type' => 'radio',
'class' => array( 'business_residential' ),
'required' => true,
'options' => array(
'option_1' => 'Business',
'option_2' => 'Residential',
),
);
echo '<div id="checkout-radio">';
echo '<h3>Select Your Business Type</h3>';
woocommerce_form_field( 'radio_choice', $businesstype );
echo '</div>';
}
我见过的最接近的例子来自“LoicTheAztec”提供的答案。 ' 在这篇文章中:Show/hide shipping methods based on a WooCommerce checkout field value
我完全迷失了这个问题,我越尝试解决它,我就越感到困惑。
最佳答案
这是在结帐页面上基于多个单选按钮选择显示隐藏送货方式的正确方法,需要使用 PHP、Ajax、jQuery 和 WC Session。
当选择“商务”单选按钮(默认选择)时,flat_rate:3
和 flat_rate:4
送货方式将被隐藏,因此客户只能选择 flat_rate:1
或 flat_rate:2
运送方式。
如果选择“住宅”单选按钮,则flat_rate:1
和flat_rate:2
运输方式将被隐藏,因此客户只会可以选择 flat_rate:3
或 flat_rate:4
运送方式。
代码:
// Display a Custom radio buttons fields for shipping options
add_action( 'woocommerce_review_order_before_payment','checkout_customer_type_radio_buttons' );
function checkout_customer_type_radio_buttons() {
$field_id = 'customer_type';
echo '<div id="customer-type-radio">';
echo '<h3>' . __("Select Your Business Type", "woocommerce") . '</h3>';
// Get the selected radio button value (if selected)
$field_value = WC()->session->get( $field_id );
// Get customer selected value on last past order
if( empty($field_value) )
$field_value = WC()->checkout->get_value( $field_id );
// The default value fallback
if( empty($field_value) )
$field_value = 'Business';
woocommerce_form_field( $field_id, array(
'type' => 'radio',
'class' => array( $field_id ),
'required' => true,
'options' => array(
'Business' => __('Business', 'woocommerce'),
'Residential' => __('Residential', 'woocommerce'),
),
), $field_value );
echo '</div>';
}
// Conditionally show/hide shipping methods
add_filter( 'woocommerce_package_rates', 'shipping_package_rates_filter_callback', 100, 2 );
function shipping_package_rates_filter_callback( $rates, $package ) {
$customer_type = WC()->session->get( 'customer_type' ); // Get the customere type
if ( $customer_type === 'Business' ) {
if( isset( $rates['flat_rate:3'] ) )
unset( $rates['flat_rate:3'] );
if( isset( $rates['flat_rate:4'] ) )
unset( $rates['flat_rate:4'] );
}
elseif ( $customer_type === 'Residential' ) {
if( isset( $rates['flat_rate:1'] ) )
unset( $rates['flat_rate:1'] );
if( isset( $rates['flat_rate:2'] ) )
unset( $rates['flat_rate:2'] );
}
return $rates;
}
// function that gets the Ajax data
add_action( 'wp_ajax_get_customer_type', 'wc_get_customer_type' );
add_action( 'wp_ajax_nopriv_get_customer_type', 'wc_get_customer_type' );
function wc_get_customer_type() {
$field_id = 'customer_type';
if ( isset($_POST[$field_id]) && ! empty($_POST[$field_id]) ){
WC()->session->set($field_id, $_POST[$field_id] );
}
echo json_encode( WC()->session->get( $field_id ) );
die(); // (required)
}
// The Jquery Ajax script
add_action( 'wp_footer', 'custom_checkout_ajax_jquery_script' );
function custom_checkout_ajax_jquery_script() {
$field_id = 'customer_type';
if( WC()->session->__isset($field_id) )
WC()->session->__unset($field_id);
// Only on checkout when billing company is not defined
if( is_checkout() && ! is_wc_endpoint_url() ):
?>
<script type="text/javascript">
jQuery( function($){
if (typeof wc_checkout_params === 'undefined')
return false;
var fieldId = 'p#customer_type_field input';
function userTypeTriggerAjax( customerType ){
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'get_customer_type',
'customer_type': customerType,
},
success: function (result) {
// Trigger refresh checkout
$('body').trigger('update_checkout');
console.log(result);
}
});
}
// On start
if( $(fieldId).val() != '' ) {
userTypeTriggerAjax( $(fieldId).val() );
}
// On change
$(fieldId).change( function () {
userTypeTriggerAjax( $(this).val() );
});
});
</script>
<?php
endif;
}
// Enabling, disabling and refreshing session shipping methods data
add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods', 10, 1 );
function refresh_shipping_methods( $post_data ){
$bool = true;
if ( in_array( WC()->session->get('customer_type' ), ['Business', 'Residential'] ) )
$bool = false;
// Mandatory to make it work with shipping methods
foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ){
WC()->session->set( 'shipping_for_package_' . $package_key, $bool );
}
WC()->cart->calculate_shipping();
}
代码位于事件子主题(或事件主题)的functions.php 文件中。经过测试并有效。
基于此相关线程的代码:
关于php - 显示/隐藏基于单选按钮的 WooCommerce 运费,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61549494/
我正在尝试获取运费。这是我的要求: 2017-10-20T11:28:56.000-08:00 pukka30193422993470
我有一个澳大利亚 PayPal 帐户,我正在使用该帐户通过基本网站付款按钮在我的网站上处理付款。送货区域似乎只适用于美国帐户。有什么办法可以为澳大利亚帐户设置不同的运输区域价格。 有点像 Domest
我想根据添加到购物车中的产品数量来计算运费,例如, 如果我购买一部手机,则运费为 2.5,如果我购买了两两部以上手机,则运费为 5.0 那么有什么想法或建议如何根据产品数量计算运费吗? 最佳答案
我们是否可以通过 API 调用或脚本在结账时添加自定义运费? 我想根据一些规则修改价格,但我不知道如何在 Shopify 中进行修改。任何帮助将不胜感激。 最佳答案 您可以通过实现自己的 Carrie
在托管的 PayPal 添加到购物车按钮上,我看到您可以在哪里使用: 是否有可能,如果: 数量为 1 运费总额为 '$x' 如果数量为 2 - 5,则运费总额为 '$xx' 任何超过 6 的总运费
我一直在寻找解决方案...我正在尝试根据添加到 Woocommerce 结帐页面的单选按钮选项来显示或隐藏特定运费。但我对 Ajax 和 JQuery 一无所知,我认为这是它所需要的。 基本上,如果用
我正在努力在产品页面上显示运费,例如在亚马逊和 eBay。 但是,因为我会比通常的购物车页面更多地调用 API,我想知道 USPS API 是否有任何限制可以阻止我在产品页面上使用 API? 你认为我
我正在用 NodeJS 和 MongoDB 开发一个公共(public)电子商务网站,我使用的是 forever 而不是 nginx 或类似的东西。 (请让我知道我是否因为这样做而完全疯了,以及为什么
我正在用 PHP 编写自定义商务 CMS。 我一直在集成 UPS XML API 以获取运费,目前它正在运行。我正在使用 Mark Sandborn 的 PHP 类 http://code.googl
我正在尝试在输入地址后更新运费。当客户开始输入地址时,自动完成功能会帮助客户找到街道名称、建筑物、楼层和侧面。 输入地址后,JavaScript 会计算距离和价格。 然后价格通过 AJAX 发送到 s
出于某种原因,当我尝试使用 SDK 授权 PayPal 付款时,我的日志中不断出现以下错误: ERROR: Got Http response code 400 when accessing http
我想如果订单高于 x 金额,则免费送货,否则需要收取 x 金额。 在免费送货中,我已经设置了 X 数量。 在统一费率中,我设置了 X 量。 但是在前端,如果订单高于 x 数量,则它会同时显示免费送货和
我是一名优秀的程序员,十分优秀!