在Woocommerce上,我启用了2种送货方式:免费送货或固定费用。我启用了两种付款方式:银行转帐(bacs)和PayPal (paypal)。
我想要实现的目标: 如果客户选择贝宝(PayPal)作为付款方式,则应强迫他选择“固定费率”(Flat rate)作为送货方式。 “免费送货”应该是隐藏的或显示为灰色等。
如果选择银行转帐,则应同时使用两种运输方式。
感谢您的帮助。
答案 0 :(得分:1)
更新2::当“ paypal”为时,以下代码将禁用“ free_shipping
”运输方式 (方法ID) 选择的付款方式:
add_filter( 'woocommerce_package_rates', 'shipping_methods_based_on_chosen_payment', 100, 2 );
function shipping_methods_based_on_chosen_payment( $rates, $package ) {
// Checking if "paypal" is the chosen payment method
if ( WC()->session->get( 'chosen_payment_method' ) === 'paypal' ) {
// Loop through shipping methods rates
foreach( $rates as $rate_key => $rate ){
if ( 'free_shipping' === $rate->method_id ) {
unset($rates[$rate_key]); // Remove 'Free shipping'shipping method
}
}
}
return $rates;
}
// 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 ( WC()->session->get('chosen_payment_method' ) ) $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();
}
// Jquery script for checkout page
add_action('wp_footer', 'refresh_checkout_on_payment_method_change' );
function refresh_checkout_on_payment_method_change() {
// Only checkout page
if( is_checkout() && ! is_wc_endpoint_url() ):
?>
<script type="text/javascript">
jQuery(function($){
// On shipping method change
$('form.checkout').on( 'change', 'input[name^="payment_method"]', function(){
$('body').trigger('update_checkout'); // Trigger Ajax checkout refresh
});
})
</script>
<?php
endif;
}
代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。
要获取相关的发货方式费率ID (类似于
flat_rate:12
),请使用浏览器代码检查器检查每个相关的单选按钮属性 {{ 1}} ,例如:
答案 1 :(得分:1)
如果有人感兴趣,我找到了解决方案:
function alter_payment_gateways( $list ){
// Retrieve chosen shipping options from all possible packages
$chosen_rates = ( isset( WC()->session ) ) ? WC()->session->get( 'chosen_shipping_methods' ) : array();
if( in_array( 'free_shipping:1', $chosen_rates ) ) {
$array_diff = array('WC_Gateway_Paypal');
$list = array_diff( $list, $array_diff );
}
return $list;
}
add_action('woocommerce_payment_gateways', 'alter_payment_gateways');
如果客户选择免费送货,此代码将停用PayPal。