我正在尝试重新排序结帐页面上的结算字段,但到目前为止我尝试过的所有内容都无效。
以下是我目前正在尝试的代码段:
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;
}
有些东西可以覆盖这个片段,因为它曾经适合我。
答案 0 :(得分:16)
您使用的方法不再有效(自WooCommerce 3.0.4更新 - link to github issue here )。它不是一个错误,而是一个规范的变化。
要解决此问题,您只需调整每个字段的优先级即可达到您想要的顺序。
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']
优先级更改为['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;
}
我已将额外的代码段添加到第一个代码块以验证整个块。
答案 1 :(得分:3)
要更改woocommerce结帐字段,您还需要更改字段顺序和显示所需的类别。你可以在functions.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;
}
}
见附图 有关详细信息,请查看此link
答案 2 :(得分:1)
排序(排序)适用于地址-i18n.min.js而不是php代码。
在我的情况下,我在我的js代码上做错了。因此,订购效果不佳(javascript停在那里)。
请检查开发者控制台和js错误。
这是只改变优先级的PHP代码。
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 );
祝你好运!
答案 3 :(得分:0)
正如@Byeongin在其答案中正确提及的那样,除了后端排序(@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;
} );
答案 4 :(得分:0)
更改本地woocommerce类 这种方法对我有用。 实际上,woocommerce使用以下类:form-row-first(css:向左浮动) end form-row-last:向右浮动。 如果将优先级2更改为1,但ccs类为form-row-last,则该字段仍将在右侧。
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;
}
其他字段(例如名字,姓氏,地址_1,地址2,邮政编码,城市,国家/地区,州)必须放置在此过滤器中
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;
}
结果:
答案 5 :(得分:0)
对于 WooCommerce > 4.0,您需要有一个优先键,因为它在打印之前在数组上使用 asort。
你可以这样做:
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" );