programing

Woocommerce 체크 아웃필드 순서 변경

yellowcard 2023. 3. 21. 21:51
반응형

Woocommerce 체크 아웃필드 순서 변경

체크아웃 페이지의 청구 필드를 다시 주문하려고 하는데, 지금까지 시도했던 모든 것이 작동하지 않습니다.

다음은 제가 현재 시도하고 있는 단편입니다.

add_filter("woocommerce_checkout_fields", "order_fields");

function order_fields($fields) {
  $order = array(
    "billing_first_name", 
    "billing_last_name", 
    "billing_country", 
    "billing_state", 
    "billing_address_1", 
    "billing_address_2", 
    "billing_email", 
    "billing_phone"
  );

  foreach($order as $field) {
    $ordered_fields[$field] = $fields["billing"][$field];
  }

  $fields["billing"] = $ordered_fields;
  return $fields;
}

이 조각보다 우선시 되는 건 아닐까? 나한테는 잘 먹혔거든

WooCommerce 3.0.4 업데이트 이후 사용 중인 방법은 더 이상 작동하지 않습니다(여기서 github 문제에 링크).버그가 아니라 사양의 변경입니다.

이 문제를 해결하려면 각 필드의 우선순위를 원하는 순서에 맞게 조정하기만 하면 됩니다.

add_filter("woocommerce_checkout_fields", "custom_override_checkout_fields", 1);
function custom_override_checkout_fields($fields) {
    $fields['billing']['billing_first_name']['priority'] = 1;
    $fields['billing']['billing_last_name']['priority'] = 2;
    $fields['billing']['billing_company']['priority'] = 3;
    $fields['billing']['billing_country']['priority'] = 4;
    $fields['billing']['billing_state']['priority'] = 5;
    $fields['billing']['billing_address_1']['priority'] = 6;
    $fields['billing']['billing_address_2']['priority'] = 7;
    $fields['billing']['billing_city']['priority'] = 8;
    $fields['billing']['billing_postcode']['priority'] = 9;
    $fields['billing']['billing_email']['priority'] = 10;
    $fields['billing']['billing_phone']['priority'] = 11;
    return $fields;
}

add_filter( 'woocommerce_default_address_fields', 'custom_override_default_locale_fields' );
function custom_override_default_locale_fields( $fields ) {
    $fields['state']['priority'] = 5;
    $fields['address_1']['priority'] = 6;
    $fields['address_2']['priority'] = 7;
    return $fields;
}

코드의 줄 바꿈이 아니라 필드에 할당되어 있는 우선순위에 따라 순서가 조정된다는 점에 유의하시기 바랍니다.아, 아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.['billing_state']합니다.5( 예에서는) 다음입니다.['billing_country'] and ★★★★★★★★★★★★★★★★★★.['billing_address_1'].


편집:

코멘트에 의하면, 이것은 어떠한 이유로 동작하지 않았습니다(첫 번째 WooCommerce 설치 테스트에서는 동작했습니다만, 스토어 장소를 변경해 실패했습니다).

좀 더 자세히 살펴보니 기본 로케일 설정이 오버라이드 위에 적용된다는 것을 알 수 있었습니다(다른 설명 방법은 모르지만 참고하십시오).

위의 코드가 동작하지 않는 곳에서 인스톨을 실행해, 다음의 코드도 추가해 수정했습니다.

add_filter( 'woocommerce_default_address_fields', 'custom_override_default_locale_fields' );
function custom_override_default_locale_fields( $fields ) {
    $fields['state']['priority'] = 5;
    $fields['address_1']['priority'] = 6;
    $fields['address_2']['priority'] = 7;
    return $fields;
}

블록 전체를 검증하기 위해 첫 번째 코드 블록에 추가 스니펫을 추가했습니다.

woocommerce 체크 아웃필드를 변경하려면 표시되는 필드 순서와 필수 클래스 베이스도 변경해야 합니다.아래 코드를 함수에 추가할 수 있습니다.php로 동작합니다.

add_filter("woocommerce_checkout_fields", "woocommerce_reorder_checkout_fields", 9999);

if ( ! function_exists( 'woocommerce_reorder_checkout_fields' ) ) {
    function woocommerce_reorder_checkout_fields( $fields ) {

        /* To reorder state field you need to add this array. */
        $order = array(
        "billing_first_name", 
        "billing_last_name", 
        "billing_country", 
        "billing_state", 
        "billing_address_1", 
        "billing_address_2", 
        "billing_email", 
        "billing_phone"
        );

        foreach($order as $field) {
        $ordered_fields[$field] = $fields["billing"][$field];
        }

        $fields["billing"] = $ordered_fields;

        /* To change email and phone number you have to add only class no need to add priority. */

        $fields['billing']['billing_email']['class'][0] = 'form-row-first';
        $fields['billing']['billing_phone']['class'][0] = 'form-row-last';

    return $fields;
    }
}

첨부된 이미지를 참조하십시오. 자세한 내용은 이 링크를 확인하십시오.

순서(정렬)는 php 코드가 아닌 address-i18n.min.js로 동작합니다.

여기에 이미지 설명 입력

내 경우 js코드를 잘못 입력했어.그래서 주문이 잘 되지 않았습니다(javascript stop).

개발 콘솔 및 js 오류를 확인하십시오.

그리고 이것은 php 코드이며 priority만 변경됩니다.

function rpf_edit_default_address_fields($fields) {

  /* ------ reordering ------ */
  $fields['country']['priority'] = 10;
  $fields['first_name']['priority'] = 20;
  $fields['last_name']['priority'] = 30;
  $fields['address_1']['priority'] = 40;
  $fields['address_2']['priority'] = 50;
  $fields['city']['priority'] = 60;
  $fields['state']['priority'] = 70;
  $fields['postcode']['priority'] = 80;

  return $fields;
}
add_filter( 'woocommerce_default_address_fields', 'rpf_edit_default_address_fields', 100, 1 );

행운을 빕니다.

@Beongin이 답변에서 올바르게 언급했듯이 백엔드 순서(@Frits 답변에 포함됨)와는 별도로 사용자가 드롭다운메뉴에서 특정 국가를 선택할 때 프런트엔드의 JavaSrcipt를 통해 이루어지는 순서도 있습니다.

이 프런트 엔드 재주문이 발생하지 않도록 하려면 지금까지 경험한 최고의 해결책은woocommerce_get_country_locale필터 및 삭제priority오버라이드 할 수 있습니다.

다음과 같은 것이 효과적입니다(WooCommerce에서 테스트됨).v3.5.4):

add_filter( 'woocommerce_get_country_locale', function( $locale ) {
    foreach ( $locale as $country_code => $locale_fields ) {
        foreach ( $locale_fields as $field_key => $field_options ) {
            if ( isset( $field_options['priority'] ) ) {
                unset( $field_options['priority'] );
            }

            $locale[ $country_code ][ $field_key ] = $field_options;
        }
    }

    return $locale;
} );

네이티브 woocommerce 클래스 변경 이 메서드는 저와 함께 사용할 수 있습니다.실제로 woocommerce에서는 form-row-first(css: float left) end form-row-last: float right(float right) 클래스를 사용합니다.priority 2를 1로 변경해도 ccs 클래스가 폼 행 라스트인 경우 필드는 오른쪽입니다.

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields',1 );
function custom_override_checkout_fields( $fields ) {
    $fields['billing']['billing_email']['priority'] = 3;
    $fields['billing']['billing_email']['label'] = mb_strtoupper("adresse email");
    $fields['billing']['billing_email']['class'] = array('form-left');
    $fields['billing']['billing_company']['priority'] = 5;
    $fields['billing']['billing_company']['label'] = mb_strtoupper("entreprise");
    $fields['billing']['billing_company']['required'] = false;
    $fields['billing']['billing_company']['class'] = array('form-left');
    $fields['billing']['billing_phone']['priority'] = 6;
    $fields['billing']['billing_phone']['label'] = mb_strtoupper("téléphone");
    $fields['billing']['billing_phone']['required'] = false;
    $fields['billing']['billing_phone']['class'] = array('form-right');
    $fields['billing']['billing_phone']['validate'] = array('phone');
    $fields['shipping']['shipping_company']['priority'] = 3;
    $fields['shipping']['shipping_company']['label'] = mb_strtoupper("entreprise");
    $fields['shipping']['shipping_company']['required'] = false;
    $fields['shipping']['shipping_company']['class'] = array('form-left');

    return $fields;
}

first_name, last_name, address_1, address-2, post_code, city, country, state 등의 필드는 이 필터에 배치해야 합니다.

add_filter( 'woocommerce_default_address_fields','custom_override_default_locale_fields');
function custom_override_default_locale_fields( $fields ) {
    $fields['last_name']['priority'] = 1;
    $fields['last_name']['label'] = mb_strtoupper("nom");
    $fields['last_name']['class'] = array('form-left');
    $fields['first_name']['priority'] = 2;
    $fields['first_name']['label'] = mb_strtoupper("prénom");
    $fields['first_name']['class'] = array('form-right');
    $fields['address_1']['priority'] = 110;
    $fields['address_1']['label'] = mb_strtoupper("adresse 1");
    $fields['address_2']['priority'] = 120;
    $fields['address_2']['label'] = mb_strtoupper("adresse 2");
    $fields['postcode']['label'] = mb_strtoupper("code postal");
    $fields['postcode']['priority'] = 130;
    $fields['postcode']['class'] = array('form-left-small');
    $fields['city']['label'] = mb_strtoupper("ville");
    $fields['city']['priority'] = 140;
    $fields['city']['class'] = array('form-right-big');
    $fields['country']['priority'] = 4;
    $fields['country']['label'] = mb_strtoupper("pays");
    $fields['country']['required'] = true;
    $fields['country']['class'] = array('form-right','address-field','update_totals_on_change');
    $fields['state']['priority'] = 120;
    $fields['state']['label'] = mb_strtoupper("téléphone");
    $fields['state']['required'] = true;
    $fields['state']['class'] = array('form-right');
return $fields;
    return $fields;
}

및 CSS

.woocommerce form .form-right,
.woocommerce form .form-left,
.woocommerce form .form-left-small,
.woocommerce form .form-right-big {
    display: inline-block;
}
.woocommerce form .form-right,
.woocommerce form .form-left {
    width: 48%
}
.woocommerce form .form-right,
.woocommerce form .form-big-right {
    margin-left: 2% !important;
}
.woocommerce form .form-left,
.woocommerce form .form-left-small {
    margin-right: 2% !important;
}
.woocommerce form .form-big-right {
    width: 63%;
}
.woocommerce form .form-left-small {
    width: 33%;
}
.woocommerce form .woocommerce-input-wrapper strong {
    height: 38px;
    line-height: 38px;
}

결과:

여기에 이미지 설명 입력

WooCommerce > 4.0의 경우 인쇄 직전에 어레이 상에서 asort를 사용하기 때문에 priority 키가 필요합니다.

다음과 같이 할 수 있습니다.

function order_fields( $fields ) {
    $i = 0;

    $order = array(
        "billing_email",
        "billing_customfield", <- this is your custom field
        "billing_company",
        "billing_cvr",
        "billing_ean",
        "billing_first_name",
        "billing_last_name",
        "billing_address_1",
        "billing_address_2",
        "billing_country",
        "billing_postcode",
        "billing_city",
        "billing_phone"
    );

    foreach ( $order as $field ) {
        $ordered_fields[ $field ] = $fields["billing"][ $field ];
        $ordered_fields[ $field ][ "priority" ] = ++$i;
    }

    $fields["billing"] = $ordered_fields;

    return $fields;

}

add_filter( "woocommerce_checkout_fields", "order_fields" );

언급URL : https://stackoverflow.com/questions/45200360/reorder-woocommerce-checkout-fields

반응형