在 WooCommerce 3 中重新排序结帐字段
Reordering checkout fields in WooCommerce 3
我正在尝试重新排序在 woocommerce_checkout_init
过滤器的帮助下添加的 2 个自定义结帐字段,只是当我应用 woocommerce_checkout_fields
过滤器重新排序字段时,它不会认识他们,他们是 null
.
我认为这是因为过滤器 woocommerce_checkout_init
在 woocommerce_checkout_fields
之后。
我该如何解决这个问题?
这是我的代码:
add_action( 'woocommerce_checkout_init', 'wc_add_confirm_email_checkout', 10, 2 );
function wc_add_confirm_email_checkout( $checkout ) {
$checkout->checkout_fields['billing']['billing_email2'] = array(
'type' => 'text',
'label' => __( 'Confirm Email Address', 'woocommerce' ),
'required' => true,
'placeholder' => _x( 'Confirm Email Address', 'placeholder', 'woocommerce' )
);
}
add_action( 'woocommerce_checkout_init', 'wc_add_confirm_password_checkout', 10, 2 );
function wc_add_confirm_password_checkout( $checkout ) {
//var_dump($checkout->checkout_fields);
if ( get_option( 'woocommerce_registration_generate_password' ) == 'no' ) {
$checkout->checkout_fields['account']['account_password2'] = array(
'type' => 'password',
'label' => __( 'Confirm password', 'woocommerce' ),
'required' => true,
'placeholder' => _x( 'Confirm Password', 'placeholder', 'woocommerce' )
);
}
}
add_filter('woocommerce_checkout_fields','reorder_woo_fields');
function reorder_woo_fields($fields) {
$fields2['billing']['billing_first_name'] = $fields['billing']['billing_first_name'];
$fields2['billing']['billing_last_name'] = $fields['billing']['billing_last_name'];
$fields2['billing']['billingooglg_email'] = $fields['billing']['billing_email'];
$fields2['billing']['billing_email2'] = $fields['billing']['billing_email2'];
$fields2['billing']['account_password'] = $fields['account']['account_password'];
$fields2['billing']['account_password2'] = $fields['account']['account_password2'];
$fields2['billing']['billing_address_1'] = $fields['billing']['billing_address_1'];
$fields2['billing']['billing_postcode'] = $fields['billing']['billing_postcode'];
var_dump($fields2);
//return $fields2;
}
对于 WooCommerce 3+ (更新):
Since WooCommerce 3.0 checkout fields have changed a little bit so is not possible to reorder fields as before.
There is a new 'priority' argument that handle fields order, for checkout fields and my account fields as well.
这是 WooCommerce 3+ 的完整功能示例:
// REORDERING CHECKOUT BILLING FIELDS (WOOCOMMERCE 3+)
add_filter( "woocommerce_checkout_fields", "reordering_checkout_fields", 15, 1 );
function reordering_checkout_fields( $fields ) {
## ---- 1. REORDERING BILLING FIELDS ---- ##
// Set the order of the fields
$billing_order = array(
'billing_first_name',
'billing_last_name',
'billing_email',
'billing_phone',
'billing_company',
'billing_address_1',
'billing_address_2',
'billing_postcode',
'billing_city',
'billing_state',
'billing_country'
);
$count = 0;
$priority = 10;
// Updating the 'priority' argument
foreach($billing_order as $field_name){
$count++;
$fields['billing'][$field_name]['priority'] = $count * $priority;
}
## ---- 2. CHANGING SOME CLASSES FOR BILLING FIELDS ---- ##
$fields['billing']['billing_email']['class'] = array('form-row-first');
$fields['billing']['billing_phone']['class'] = array('form-row-last');
$fields['billing']['billing_postcode']['class'] = array('form-row-first');
$fields['billing']['billing_city']['class'] = array('form-row-last');
## ---- RETURN THE BILLING FIELDS CUSTOMIZED ---- ##
return $fields;
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
WooCommerce 3 之前
我不完全确定,但有些事情是您不能做的,例如将帐单字段与帐户字段合并。如果你想这样做,那将比你在这里尝试做的要复杂得多。在这种情况下,您将需要 rewrite/create 一些结帐模板…
另一件事是 billing_email
和 billing_phone
与 [=14 共享同一条线路=] 和 'class' => 'form-row-last'
。当 not 这个 class 被定义 'class' => 'form-row-wide'
... 所以你需要覆盖这些 'class'
也是。
之后你就不需要使用'woocommerce_checkout_init'
钩子了……
您仍然可以使用 'woocommerce_checkout_fields'
。
您也可以通过这种方式将所有这些合并到一个函数中:
/*
* Creating, overriding and reordering custom fields.
*/
add_filter( "woocommerce_checkout_fields", "custom_override_checkout_fields", 11, 1 );
function custom_override_checkout_fields( $fields ) {
// Creating 'billing_email2' field
$fields['billing']['billing_email2'] = array(
'type' => 'text',
'label' => __( 'Confirm Email Address', 'woocommerce' ),
'placeholder' => _x( 'Confirm Email Address', 'placeholder', 'woocommerce' ),
'required' => true,
'class' => array('form-row-last'),
'clear' => true
);
// =======> I don't really know if you need this one <========
// it already exist (see in first reference link at bottom).
// Creating 'account_password2' field
if ( get_option( 'woocommerce_registration_generate_password' ) == 'no' ) {
$fields['account']['account_password2'] = array(
'type' => 'password',
'label' => __( 'Confirm password', 'woocommerce' ),
'placeholder' => _x( 'Confirm Password', 'placeholder', 'woocommerce' ),
'required' => true,
'class' => array('form-row-wide') //,
// 'clear' => true
);
}
// Overriding existing billing_phone field 'class' property
$fields['billing']['billing_phone']['class'] = array('form-row-wide');
// Reordering billing fields
$order = array(
"billing_first_name",
"billing_last_name",
"billing_email",
"billing_email2",
"billing_phone",
"billing_company",
"billing_address_1",
"billing_address_2",
"billing_postcode",
"billing_country"
);
foreach($order as $field)
{
$ordered_fields[$field] = $fields["billing"][$field];
}
$fields["billing"] = $ordered_fields;
return $fields;
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
正如我之前所说,我认为您不能将帐单字段与帐户字段合并。
由于'account_password2'
已经存在,如果你参考官方文档(见下面第一个参考[=83=]),你可能不需要创建它。您将必须对此进行测试并对其进行微调。但这是做到这一点的方法。
参考文献:
注意!
Woocommerce 进行了一些更改,您应该使用 'woocommerce_default_address_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;
}
添加到已接受的答案...
如果您需要将表单字段从一个字段组移动到另一个字段组,例如将运输字段移动到账单或将帐户字段移动到账单,您可以执行以下操作。
function move_password_field($checkout_fields){
// Move Account Password into Billing
$checkout_fields['billing']['account_password'] = $checkout_fields['account']['account_password'];
// Remove Password from Billing
unset($checkout_fields['account']['account_password']);
return $checkout_fields;
}
add_filter('woocommerce_checkout_fields', 'move_password_field', 999);
我正在尝试重新排序在 woocommerce_checkout_init
过滤器的帮助下添加的 2 个自定义结帐字段,只是当我应用 woocommerce_checkout_fields
过滤器重新排序字段时,它不会认识他们,他们是 null
.
我认为这是因为过滤器 woocommerce_checkout_init
在 woocommerce_checkout_fields
之后。
我该如何解决这个问题?
这是我的代码:
add_action( 'woocommerce_checkout_init', 'wc_add_confirm_email_checkout', 10, 2 );
function wc_add_confirm_email_checkout( $checkout ) {
$checkout->checkout_fields['billing']['billing_email2'] = array(
'type' => 'text',
'label' => __( 'Confirm Email Address', 'woocommerce' ),
'required' => true,
'placeholder' => _x( 'Confirm Email Address', 'placeholder', 'woocommerce' )
);
}
add_action( 'woocommerce_checkout_init', 'wc_add_confirm_password_checkout', 10, 2 );
function wc_add_confirm_password_checkout( $checkout ) {
//var_dump($checkout->checkout_fields);
if ( get_option( 'woocommerce_registration_generate_password' ) == 'no' ) {
$checkout->checkout_fields['account']['account_password2'] = array(
'type' => 'password',
'label' => __( 'Confirm password', 'woocommerce' ),
'required' => true,
'placeholder' => _x( 'Confirm Password', 'placeholder', 'woocommerce' )
);
}
}
add_filter('woocommerce_checkout_fields','reorder_woo_fields');
function reorder_woo_fields($fields) {
$fields2['billing']['billing_first_name'] = $fields['billing']['billing_first_name'];
$fields2['billing']['billing_last_name'] = $fields['billing']['billing_last_name'];
$fields2['billing']['billingooglg_email'] = $fields['billing']['billing_email'];
$fields2['billing']['billing_email2'] = $fields['billing']['billing_email2'];
$fields2['billing']['account_password'] = $fields['account']['account_password'];
$fields2['billing']['account_password2'] = $fields['account']['account_password2'];
$fields2['billing']['billing_address_1'] = $fields['billing']['billing_address_1'];
$fields2['billing']['billing_postcode'] = $fields['billing']['billing_postcode'];
var_dump($fields2);
//return $fields2;
}
对于 WooCommerce 3+ (更新):
Since WooCommerce 3.0 checkout fields have changed a little bit so is not possible to reorder fields as before.
There is a new 'priority' argument that handle fields order, for checkout fields and my account fields as well.
这是 WooCommerce 3+ 的完整功能示例:
// REORDERING CHECKOUT BILLING FIELDS (WOOCOMMERCE 3+)
add_filter( "woocommerce_checkout_fields", "reordering_checkout_fields", 15, 1 );
function reordering_checkout_fields( $fields ) {
## ---- 1. REORDERING BILLING FIELDS ---- ##
// Set the order of the fields
$billing_order = array(
'billing_first_name',
'billing_last_name',
'billing_email',
'billing_phone',
'billing_company',
'billing_address_1',
'billing_address_2',
'billing_postcode',
'billing_city',
'billing_state',
'billing_country'
);
$count = 0;
$priority = 10;
// Updating the 'priority' argument
foreach($billing_order as $field_name){
$count++;
$fields['billing'][$field_name]['priority'] = $count * $priority;
}
## ---- 2. CHANGING SOME CLASSES FOR BILLING FIELDS ---- ##
$fields['billing']['billing_email']['class'] = array('form-row-first');
$fields['billing']['billing_phone']['class'] = array('form-row-last');
$fields['billing']['billing_postcode']['class'] = array('form-row-first');
$fields['billing']['billing_city']['class'] = array('form-row-last');
## ---- RETURN THE BILLING FIELDS CUSTOMIZED ---- ##
return $fields;
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
WooCommerce 3 之前
我不完全确定,但有些事情是您不能做的,例如将帐单字段与帐户字段合并。如果你想这样做,那将比你在这里尝试做的要复杂得多。在这种情况下,您将需要 rewrite/create 一些结帐模板…
另一件事是 billing_email
和 billing_phone
与 [=14 共享同一条线路=] 和 'class' => 'form-row-last'
。当 not 这个 class 被定义 'class' => 'form-row-wide'
... 所以你需要覆盖这些 'class'
也是。
之后你就不需要使用'woocommerce_checkout_init'
钩子了……
您仍然可以使用 'woocommerce_checkout_fields'
。
您也可以通过这种方式将所有这些合并到一个函数中:
/*
* Creating, overriding and reordering custom fields.
*/
add_filter( "woocommerce_checkout_fields", "custom_override_checkout_fields", 11, 1 );
function custom_override_checkout_fields( $fields ) {
// Creating 'billing_email2' field
$fields['billing']['billing_email2'] = array(
'type' => 'text',
'label' => __( 'Confirm Email Address', 'woocommerce' ),
'placeholder' => _x( 'Confirm Email Address', 'placeholder', 'woocommerce' ),
'required' => true,
'class' => array('form-row-last'),
'clear' => true
);
// =======> I don't really know if you need this one <========
// it already exist (see in first reference link at bottom).
// Creating 'account_password2' field
if ( get_option( 'woocommerce_registration_generate_password' ) == 'no' ) {
$fields['account']['account_password2'] = array(
'type' => 'password',
'label' => __( 'Confirm password', 'woocommerce' ),
'placeholder' => _x( 'Confirm Password', 'placeholder', 'woocommerce' ),
'required' => true,
'class' => array('form-row-wide') //,
// 'clear' => true
);
}
// Overriding existing billing_phone field 'class' property
$fields['billing']['billing_phone']['class'] = array('form-row-wide');
// Reordering billing fields
$order = array(
"billing_first_name",
"billing_last_name",
"billing_email",
"billing_email2",
"billing_phone",
"billing_company",
"billing_address_1",
"billing_address_2",
"billing_postcode",
"billing_country"
);
foreach($order as $field)
{
$ordered_fields[$field] = $fields["billing"][$field];
}
$fields["billing"] = $ordered_fields;
return $fields;
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
正如我之前所说,我认为您不能将帐单字段与帐户字段合并。
由于'account_password2'
已经存在,如果你参考官方文档(见下面第一个参考[=83=]),你可能不需要创建它。您将必须对此进行测试并对其进行微调。但这是做到这一点的方法。
参考文献:
注意!
Woocommerce 进行了一些更改,您应该使用 'woocommerce_default_address_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;
}
添加到已接受的答案...
如果您需要将表单字段从一个字段组移动到另一个字段组,例如将运输字段移动到账单或将帐户字段移动到账单,您可以执行以下操作。
function move_password_field($checkout_fields){
// Move Account Password into Billing
$checkout_fields['billing']['account_password'] = $checkout_fields['account']['account_password'];
// Remove Password from Billing
unset($checkout_fields['account']['account_password']);
return $checkout_fields;
}
add_filter('woocommerce_checkout_fields', 'move_password_field', 999);