gpt4 book ai didi

php - 根据 WooCommerce 结帐字段值显示/隐藏送货方式

转载 作者:搜寻专家 更新时间:2023-10-31 20:57:08 24 4
gpt4 key购买 nike

在 WooCommerce 中,我设置了不同的运输方式但其中一种必须是公司独有的。

为此,我使用了以下代码:

add_filter( 'woocommerce_package_rates', array( $this, 'package_rates' ), 10, 2 );

public function package_rates( $rates, $package ) {
$company_rate_id = 'flat_rate:7';

if(!empty(WC()->customer->get_billing_company())){
$company_rates = $rates[ $company_rate_id ];
$rates = array( $company_rate_id => $company_rates );
}else{
unset( $rates[ $company_rate_id ] );
}

return $rates;
}

该解决方案有效,但前提是计费公司已经存在并保存在数据库中。因此,如果客户在结帐页面上更新此信息,则它不起作用。

一个可能的解决方案是实时保存此字段 (billing_company)。

我尝试了以下功能:

add_filter( 'woocommerce_checkout_fields' , 'trigger_update_checkout_on_change' );
function trigger_update_checkout_on_change( $fields ) {

$fields['billing']['billing_company']['class'][] = 'update_totals_on_change';

return $fields;
}

这更新了送货方式,问题是,该字段没有保存在数据库中,package_rates() 函数无法实时找到它。

最佳答案

这比那个复杂一点……需要 jQuery 和 Ajax 代码才能根据结帐字段用户输入显示/隐藏送货方式。

以下代码将根据结帐开票公司字段启用显示/隐藏预定义的送货方式:

// 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 ) {
// The defined rate id
$company_rate_id = 'flat_rate:7';

if( WC()->session->get('company' ) === '1' ) {
$rates = array( $company_rate_id => $rates[ $company_rate_id ] );
} else {
unset( $rates[ $company_rate_id ] );
}
return $rates;
}

// function that gets the Ajax data
add_action( 'wp_ajax_get_customer_company', 'wc_get_customer_company' );
add_action( 'wp_ajax_nopriv_get_customer_company', 'wc_get_customer_company' );
function wc_get_customer_company() {
if ( isset($_POST['company']) && ! empty($_POST['company']) ){
WC()->session->set('company', '1' );
} else {
WC()->session->set('company', '0' );
}
die(); // (required)
}

// The Jquery Ajax script
add_action( 'wp_footer', 'custom_checkout_script' );
function custom_checkout_script() {
if( WC()->session->__isset('company') )
WC()->session->__unset('company');

// 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 = 'input#billing_company';

function companyTriggerAjax( company ){
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'get_customer_company',
'company': company,
},
success: function (result) {
// Trigger refresh checkout
$('body').trigger('update_checkout');
}
});
}

// On start
if( $(fieldId).val() != '' ) {
companyTriggerAjax( $(fieldId).val() );
}

// On change
$(fieldId).change( function () {
companyTriggerAjax( $(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 ( WC()->session->get('company' ) === '1' )
$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();
}

代码进入事件子主题(或事件主题)的 function.php 文件。经过测试并有效。


相关:Remove shipping cost if custom checkbox is checked in WooCommerce Checkout

关于php - 根据 WooCommerce 结帐字段值显示/隐藏送货方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55836775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com