php - Reordenando los campos de pago en WooCommerce 3
wordpress field (3)
Estoy tratando de reordenar 2 campos de pago personalizados agregados con la ayuda del filtro
woocommerce_checkout_init
, solo que cuando aplico el filtro
woocommerce_checkout_fields
para reordenar los campos, no los reconoce y son
null
.
Creo que es porque el filtro
woocommerce_checkout_init
va después de
woocommerce_checkout_fields
.
¿Como puedo resolver esto?
Aquí está mi código:
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;
}
Agregar a la respuesta aceptada ...
Si necesita mover campos de formulario de un grupo de campos a otro, por ejemplo, mover un campo de envío a facturación o un campo de cuenta a facturación, puede hacer lo siguiente.
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);
¡Aviso!
Woocommerce ha realizado algunos cambios y para organizar los campos de dirección debe usar el filtro ''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;
}
Para WooCommerce 3+ (actualización) :
Dado que los campos de pago de WooCommerce 3.0 han cambiado un poco, no es posible reordenar los campos como antes.
Hay un nuevo argumento de ''prioridad'' que maneja el orden de los campos , para los campos de pago y también para los campos de mi cuenta.
Aquí hay un ejemplo completamente funcional para 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;
}
El código va en el archivo function.php de su tema secundario activo (o tema) o también en cualquier archivo de complemento.
Antes de WooCommerce 3
No estoy completamente seguro, pero hay algunas cosas que no puede hacer, como combinar campos de facturación con campos de cuenta. Si quieres hacer eso, será mucho más complicado de lo que intentas hacer aquí. En ese caso, deberá volver a escribir / crear algunas plantillas de pago ...
Otra cosa es que
billing_email
y
billing_phone
comparten la misma línea junto con
''class'' => ''form-row-first''
y
''class'' => ''form-row-last''
.
Cuando
no
esta clase se define
''class'' => ''form-row-wide''
... Por lo tanto, también necesitará anular estas
''class''
.
Después de eso, no necesita usar
''woocommerce_checkout_init''
gancho
''woocommerce_checkout_init''
...
Todavía puede usar
''woocommerce_checkout_fields''
.
También puede fusionarlos todos en una función de esta manera:
/*
* 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;
}
El código va en el archivo function.php de su tema secundario activo (o tema) o también en cualquier archivo de complemento.
Como he dicho antes, creo que no puede combinar campos de facturación con campos de cuenta.
Como
''account_password2''
ya existe si hace referencia a la documentación oficial (ver más abajo en el primer enlace de referencia), es posible que no necesite crearla.
Tendrá que probar esto y afinarlo.
Pero esta es la forma de hacerlo.
Referencias