Skip to content

Instantly share code, notes, and snippets.

@machelinos
Last active December 25, 2023 17:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save machelinos/9a7d757b2544927db61e28e6c8a3534b to your computer and use it in GitHub Desktop.
Save machelinos/9a7d757b2544927db61e28e6c8a3534b to your computer and use it in GitHub Desktop.
Several ways to customize checkout fields in woocommerce
<?php
/**
* Función para cambiar de lugar los campos del checkout de Woocommerce
*/
function claserama_rearrange_checkout_fields($fields){
//para mover el orden de los elementos del array, debemos asignar una propiedad de prioridad a cada campo, en nuestro ejemplo le dimos una prioridad menor al email, entonces colocará este campo al principio de nuestra forma
$fields['billing']['billing_email']['priority'] = 10;
$fields['billing']['billing_first_name']['priority'] = 20;
$fields['billing']['billing_last_name']['priority'] = 30;
$fields['billing']['billing_company']['priority'] = 40;
$fields['billing']['billing_address_1']['priority'] = 50;
$fields['billing']['billing_address_2']['priority'] = 60;
$fields['billing']['billing_postcode']['priority'] = 70;
$fields['billing']['billing_country']['priority'] = 80;
$fields['billing']['billing_state']['priority'] = 90;
$fields['billing']['billing_phone']['priority'] = 100;
//Podemos hacer lo mismo para los campos de envío. En este ejemplo cambiamos el orden de los campos de Nombre y apellido con el apellido primero
$fields['shipping']['shipping_first_name']['priority'] = 20;
$fields['shipping']['shipping_last_name']['priority'] = 10;
$fields['shipping']['shipping_company']['priority'] = 30;
$fields['shipping']['shipping_address_1']['priority'] = 40;
$fields['shipping']['shipping_address_2']['priority'] = 50;
$fields['shipping']['shipping_postcode']['priority'] = 60;
$fields['shipping']['shipping_country']['priority'] = 70;
$fields['shipping']['shipping_city']['priority'] = 80;
$fields['shipping']['shipping_state']['priority'] = 90;
return $fields;
}
add_filter('woocommerce_checkout_fields','claserama_rearrange_checkout_fields');
/**
* Función para cambiar las clases de los campos
*/
function claserama_change_field_class($fields){
$fields['shipping']['shipping_first_name']['class'][0] = 'form-row-last';
$fields['shipping']['shipping_last_name']['class'][0] = 'form-row-first';
return $fields;
}
add_filter('woocommerce_checkout_fields','claserama_change_field_class');
/**
* Función para remover el campo de "Empresa" del formulario de checkout
*/
function claserama_edit_checkout_fields($fields){
unset($fields['billing']['billing_company']);
return $fields;
}
add_filter('woocommerce_checkout_fields','claserama_edit_checkout_fields');
/**
* Función para cambiar las etiquetas(labels) y placeholders de los campos que no sean de dirección
*/
function claserama_edit_labels_placeholders_checkout($fields){
$fields['order']['order_comments']['label']='Facturación';
$fields['order']['order_comments']['placeholder']='Ingresa tu RFC si deseas obtener una factura';
return $fields;
}
add_filter('woocommerce_checkout_fields','claserama_edit_labels_placeholders_checkout');
/**
* Función para cambiar las etiquetas(labels) y placeholders de los campos de dirección
*/
function claserama_edit_address_labels_placeholders_checkout($address_fields){
$address_fields['address_1']['label']='Dirección';
$address_fields['address_1']['placeholder']='Calle, Número y Colonia';
return $address_fields;
}
add_filter('woocommerce_default_address_fields','claserama_edit_address_labels_placeholders_checkout');
/**
* Función para cambiar el tipo de algunos de los campos en el checkout de Woocommerce
*/
function claserama_change_field_type_woo($fields){
$fields['billing']['billing_postcode']['type'] = 'tel';
return $fields;
}
add_filter('woocommerce_checkout_fields','claserama_change_field_type_woo');
/**
* Funciones para agregar campos personalizados
*Select
*/
function claserama_add_select_prefered_contact_method($checkout){
woocommerce_form_field('contactmethod',array(
'type' => 'select', //textarea, text,select, radio, checkbox, password
'required' => true, //este parámetro no valida, solo agrega un "*" al campo
'class' => array('form-row-wide'), // debe ser un array aunque solo tenga un elemento puede ser la clase 'form-row-wide', 'form-row-first', 'form-row-last'
'label' => 'Método de contacto preferido',
'options' => array( //opciones para un select o un input radio
'' => 'Selecciona uno',
'email' => 'Por email', // valor => nombre
'telefono' => 'Por teléfono'
)
), $checkout->get_value('contactmethod')
);
}
add_action('woocommerce_after_checkout_billing_form','claserama_add_select_prefered_contact_method');
/**
* Funciones para agregar campos personalizados
*Checkbox después de los comentarios de la orden
*/
function claserama_add_newsletter_optin($checkout){
woocommerce_form_field('subscribe',array(
'type' => 'checkbox',
'class' => array('form-row-wide'),
'label' => '&nbsp;Suscribirte al Newsletter'
), $checkout->get_value('subscribe'));
}
add_action('woocommerce_after_order_notes','claserama_add_newsletter_optin');
/**
* Validar el campo select que agregamos
*/
function claserama_validate_select_field(){
//Verificar que el campo haya sido seleccionado, si no mostrar un error
if ( empty( $_POST['contactmethod'] ) )
wc_add_notice( 'Por favor selecciona tu método preferido de contacto.', 'error' );
}
add_action('woocommerce_checkout_process','claserama_validate_select_field');
/**
* Guardar los campos adicionales cuando el usuario termine el proceso de checkout
*/
function claserama_save_additional_fields_checkout($order_id){
if( !empty( $_POST['contactmethod'] ) )
update_post_meta( $order_id, 'contactmethod', sanitize_text_field( $_POST['contactmethod'] ) );
if( !empty( $_POST['subscribe'] ) && $_POST['subscribe'] == 1 )
update_post_meta( $order_id, 'subscribe', 1 );
}
add_action('woocommerce_checkout_update_order_meta','claserama_save_additional_fields_checkout');
/**
* Mostrar los valores de los campos personalizados adicionales en la vista de la orden en el administrador
*/
function claserama_show_custom_fields_order($order){
echo '<p><strong>'.__('Método preferido de contacto').':</strong> ' . get_post_meta( $order->id, 'contactmethod', true ) . '</p>';
if(get_post_meta( $order->id, 'subscribe', true )==1){
$suscribir = "Si";
}else{
$suscribir = "No";
}
echo '<p><strong>'.__('Suscribirse al Newsletter').':</strong> ' . $suscribir . '</p>';
}
add_action('woocommerce_admin_order_data_after_billing_address','claserama_show_custom_fields_order');
/**
* Mostrar los valores de los campos personalizados adicionales en la vista de la orden en la página de gracias y en la página de Orden en la página "Mi cuenta" del usuario
*/
function claserama_show_custom_fields_thankyou($order_id){
echo '<p><strong>'.__('Método preferido de contacto').':</strong> ' . get_post_meta( $order_id, 'contactmethod', true ) . '</p>';
if(get_post_meta( $order_id, 'subscribe', true )==1){
$suscribir = "Si";
}else{
$suscribir = "No";
}
echo '<p><strong>'.__('Suscribirse al Newsletter').':</strong> ' . $suscribir . '</p>';
}
add_action('woocommerce_thankyou','claserama_show_custom_fields_thankyou', 20);
add_action('woocommerce_view_order','claserama_show_custom_fields_thankyou', 20);
/**
* Mostrar los valores de los campos personalizados adicionales en los correos electrónicos
*/
function claserama_show_custom_fields_emails($order, $sent_to_admin, $order){
if(get_post_meta( $order_id, 'subscribe', true )==1){
$suscribir = "Si";
}else{
$suscribir = "No";
}
$fields['contactmethod'] = array(
'label' => __('Método de contacto preferido'),
'value' => get_post_meta( $order->id, 'contactmethod', true ),
);
$fields['subscribe'] = array(
'label' => __('Suscribirse al newsletter?'),
'value' => $suscribir,
);
return $fields;
}
add_action('woocommerce_email_order_meta_fields','claserama_show_custom_fields_emails', 10, 3);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment