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
'programing' 카테고리의 다른 글
컨트롤러 내에서 $setValid 사용 (0) | 2023.03.21 |
---|---|
React Native의 PhaseScriptExecution [CP-User]오류 (0) | 2023.03.21 |
JSX 내부의 React에서 숫자를 루프오버하는 방법 (0) | 2023.03.21 |
다른 옵션 파라미터는 생략한 채 옵션 파라미터를 전달하려면 어떻게 해야 합니까? (0) | 2023.03.21 |
Python json.loads가 'ValueError:잘못된 컨트롤 문자: 1행 33(char 33)' (0) | 2023.03.21 |