我之前使用this answer隐藏了基于所选送货方式的结帐字段,它工作正常,直到更新(3.4.2当前版本)我认为不确定发生了哪些变化但它不起作用正如预期的那样。
以前当选择本地取件时,某些字段被隐藏并且是可选的,当选择交付时,它将再次显示这些字段,而无需重新加载页面。
现在它会根据需要显示和隐藏字段,但是,当选择传递时,它会显示标记为必填字段的正确字段,但旁边还有(可选)符号,这使其成为可选字段。见下图。
以下是我修改后的修补程序:
add_filter('woocommerce_default_address_fields', 'custom_default_checkout_fields', 10, 1 );
function custom_default_checkout_fields( $address_fields ) {
$custom_fields = array( 'country', 'address_1', 'address_2', 'state', 'postcode');
foreach($custom_fields as $field)
$address_fields[$field]['required'] = false;
return $address_fields;
}
add_action( 'wp_footer', 'custom_checkout_field_script' );
function custom_checkout_field_script() {
$pickpoint = 'local_pickup:2';
$free_delivery = 'free_shipping:1';
$flat_rate = 'flat_rate:3';
$required = esc_attr__( 'required', 'woocommerce' );
?>
<script>
jQuery(function($){
var shippingMethod = $('input[name^="shipping_method"]:checked'),
required = '<abbr class="required" title="<?php echo $required; ?>">*</abbr>',
shippingChecked = $('input#ship-to-different-address-checkbox');
shippingChecked.change( function(){
console.log('Shipping Checked: '+shippingChecked.prop('checked'));
});
function showHide( actionToDo='show', selector='' ){
if( actionToDo == 'show' )
$(selector).show(function(){
$(this).addClass("validate-required");
$(this).removeClass("woocommerce-validated");
$(this).removeClass("woocommerce-invalid woocommerce-invalid-required-field");
if( $(selector+' > label > abbr').html() == undefined )
$(selector+' label').append(required);
});
else
$(selector).hide(function(){
$(this).removeClass("validate-required");
$(this).removeClass("woocommerce-validated");
$(this).removeClass("woocommerce-invalid woocommerce-invalid-required-field");
if( $(selector+' > label > abbr').html() != undefined )
$(selector+' label > .required').remove();
});
}
if( shippingMethod.val() == '<?php echo $pickpoint; ?>' )
{
showHide('show','#billing_country_field' );
showHide('hide','#billing_address_1_field' );
showHide('hide','#billing_address_2_field' );
showHide('hide','#billing_postcode_field' );
showHide('hide','#billing_state_field' );
}
else if( shippingMethod.val() == '<?php echo $free_delivery; ?>' || '<?php echo $flat_rate; ?>')
{
showHide('show','#billing_address_1_field');
showHide('show','#billing_address_2_field');
showHide('show','#billing_postcode_field');
showHide('hide','#billing_state_field');
showHide('hide','#billing_country_field');
}
$( 'form.checkout' ).on( 'change', 'input[name^="shipping_method"]', function() {
var shipMethod = $('input[name^="shipping_method"]:checked');
if( shipMethod.val() == '<?php echo $pickpoint; ?>' )
{
showHide('show','#billing_country_field');
showHide('hide','#billing_address_1_field');
showHide('hide','#billing_address_2_field');
showHide('hide','#billing_postcode_field');
showHide('hide','#billing_state_field');
}
else if( shipMethod.val() == '<?php echo $free_delivery; ?>' || '<?php echo $flat_rate; ?>')
{
showHide('show','#billing_address_1_field');
showHide('show','#billing_address_2_field');
showHide('show','#billing_postcode_field');
showHide('hide','#billing_state_field');
showHide('hide','#billing_country_field');
}
else
{
showHide('show','#billing_address_1_field');
showHide('show','#billing_address_2_field');
showHide('show','#billing_postcode_field');
showHide('show','#billing_state_field');
showHide('show','#billing_country_field');
}
});
$( 'input#ship-to-different-address-checkbox' ).click( function() {
var shipMethod = $('input[name^="shipping_method"]:checked');
if( shipMethod.val() == '<?php echo $pickpoint; ?>' && shippingChecked.prop('checked') == true )
{
showHide('show','#billing_country_field');
showHide('hide','#billing_address_1_field');
showHide('hide','#billing_address_2_field');
showHide('hide','#billing_postcode_field');
showHide('hide','#billing_state_field');
showHide('show','#shipping_country_field');
showHide('hide','#shipping_address_1_field');
showHide('hide','#shipping_address_2_field');
showHide('hide','#shipping_postcode_field');
showHide('hide','#shipping_state_field');
}
else if( shipMethod.val() == '<?php echo $free_delivery; ?>' || '<?php echo $flat_rate; ?>' && shippingChecked.prop('checked') == true )
{
showHide('show','#billing_address_1_field');
showHide('show','#billing_address_2_field');
showHide('show','#billing_postcode_field');
showHide('hide','#billing_state_field');
showHide('hide','#billing_country_field');
showHide('show','#shipping_address_1_field');
showHide('show','#shipping_address_2_field');
showHide('show','#shipping_postcode_field');
showHide('hide','#shipping_state_field');
showHide('hide','#shipping_country_field');
}
else if( shippingChecked.prop('checked') == false )
{
showHide('show','#shipping_address_1_field');
showHide('show','#shipping_address_2_field');
showHide('hide','#shipping_state_field');
showHide('hide','#shipping_country_field');
}
});
});
</script>
<?php
}
任何指针都会非常感激!
答案 0 :(得分:4)
更新2
要删除Woocommerce 3.4版中引入的结帐字段标签中的&#34;(可选)&#34; 文字,就像以前一样,您需要添加以下代码:< / p>
// PHP: Remove "(optional)" from our non required fields
add_filter( 'woocommerce_form_field' , 'remove_checkout_optional_fields_label', 10, 4 );
function remove_checkout_optional_fields_label( $field, $key, $args, $value ) {
// Only on checkout page
if( is_checkout() && ! is_wc_endpoint_url() ) {
$optional = ' <span class="optional">(' . esc_html__( 'optional', 'woocommerce' ) . ')</span>';
$field = str_replace( $optional, '', $field );
}
return $field;
}
// JQuery: Needed for checkout fields to Remove "(optional)" from our non required fields
add_filter( 'wp_footer' , 'remove_checkout_optional_fields_label_script' );
function remove_checkout_optional_fields_label_script() {
// Only on checkout page
if( ! ( is_checkout() && ! is_wc_endpoint_url() ) ) return;
$optional = ' <span class="optional">(' . esc_html__( 'optional', 'woocommerce' ) . ')</span>';
?>
<script>
jQuery(function($){
// On "update" checkout form event
$(document.body).on('update_checkout', function(){
$('#billing_country_field label > .optional').remove();
$('#billing_address_1_field label > .optional').remove();
$('#billing_postcode_field label > .optional').remove();
$('#billing_state_field label > .optional').remove();
$('#shipping_country_field label > .optional').remove();
$('#shipping_address_1_field label > .optional').remove();
$('#shipping_postcode_field label > .optional').remove();
$('#shipping_state_field label > .optional').remove();
});
});
</script>
<?php
}
代码放在活动子主题(或活动主题)的function.php文件中。经过测试,适用于Woocommerce版本3.4 +。
您可以将包含的jQuery代码与现有的jQuery代码合并......
答案 1 :(得分:2)
您可以在其中轻松使用CSS
.woocommerce form .form-row .required{
display: none ;
}
.woocommerce form .form-row .optional{
display: none ;
}
答案 2 :(得分:2)
更好的解决方案:
/**
* Remove optional label
* https://elextensions.com/knowledge-base/remove-optional-text-woocommerce-checkout-fields/
*/
add_filter( 'woocommerce_form_field' , 'elex_remove_checkout_optional_text', 10, 4 );
function elex_remove_checkout_optional_text( $field, $key, $args, $value ) {
if( is_checkout() && ! is_wc_endpoint_url() ) {
$optional = ' <span class="optional">(' . esc_html__( 'optional', 'woocommerce' ) . ')</span>';
$field = str_replace( $optional, '', $field );
}
return $field;
}