Cómo editar los tipos de campos personalizados en WooCommerce

En este artículo podemos ver los diferentes tipos de campos que podemos añadir a la página de finalizar pedido de WooCommerce e implementarlo con código.

checkout, WooCommerce

WooCommerce, la herramienta para e-commerce de los creadores de WordPress, es una de las plataformas más versátiles a la hora de ofrecer soluciones para tu tienda online.

Buen ejemplo de ellos son los campos personalizados que podemos añadir a la página de ‘checkout’ al finalizar un pedido. En este artículo vamos a explicar cómo implementarlos con código.

Pero antes de ver cada campo vamos a mostrar lo útil que puede ser las personalizaciones con un ejemplo.

Añadir el campo CIF/NIF/NIE

No os voy a contar como hacerlo debido a que Fermando Tellado lo cuenta muy bien en su artículo: Cómo añadir el CIF/NIF/NIE en WooCommerce

Lo que no viene en ese artículo es como añadirle una pequeña ayuda debajo del campo y eso se hace con el atributo description que tiene cada campo.

Imaginaros que queréis añadir que debajo del campo aparezca una leyenda que indique por ej. «Este campo es necesario si quieres una factura válida ante la Administración».

Tendrías que añadir al array eel texto en el atributo description tal que así:

function woo_custom_field_checkout($checkout) {
echo '<div id="additional_checkout_field">';
woocommerce_form_field( 'nif', array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'required' => true, // ¿El campo es obligatorio 'true' o 'false'?
'label' => __('NIF / CIF'),
'placeholder' => __('Ej: 12345678X'),
'description' => __('Este campo es necesario si quieres una factura válida ante la Administración'),
), $checkout->get_value( 'nif' ));
echo '</div>';
}
add_action( 'woocommerce_after_checkout_billing_form', 'woo_custom_field_checkout' );

Y el resultado sería el siguiente.

Tipos de campos personalizados en Woocommerce

Text Box

woocommerce_form_field("my_textbox", array(
    'type'              => 'text',
    'class'             => array('form-row-wide my-textbox'),
    'label'             => 'Textbox Field',
    'placeholder'       => 'Placehoder text',
    'required'          => true,
    'default'           => '',
    'description'       => ''
), $checkout->get_value( 'my_textbox' ) );

Checkbox

woocommerce_form_field("my_textbox", array(
    'type'              => 'checkbox',
    'class'             => array('form-row-wide my-checkbox'),
    'label'             => 'Checkbox Field',
    'description'       => 'A short description of this checkbox',
    'default'           => '',
    'description'       => ''
), $checkout->get_value( 'my_textbox' ) );

Textarea

woocommerce_form_field("my_textarea", array(
    'type'              => 'textarea',
    'class'             => array('form-row-wide my-textarea'),
    'label'             => 'Textarea Field',
    'custom_attributes' => array( 'rows' => 10, 'cols' => 10 ),
    'default'           => '',
    'description'       => ''
), $checkout->get_value( 'my_textarea' ) );

Select

woocommerce_form_field("my_select", array(
    'type'              => 'select',
    'class'             => array('form-row-wide my-select'),
    'label'             => 'Dropdown',
    'options'           => array( '1' => 'Option 1' , '2' => 'Option 2', '3' => 'Option 3' ),
), $checkout->get_value( 'my_select' ) );

Radio

woocommerce_form_field("my_radio", array(
    'type'              => 'radio',
    'class'             => array('form-row-wide my-radio'),
    'label'             => 'Radio',
    'label_class'       => 'radio-box',
    'options'           => array( '1' => 'Option 1' , '2' => 'Option 2', '3' => 'Option 3' ),
), $checkout->get_value( 'my_radio' ) );

Pasword

woocommerce_form_field("my_textbox", array(
    'type'              => 'password',
    'class'             => array('form-row-wide my-textbox'),
    'label'             => 'Password',
    'placeholder'       => '',
    'required'          => true,
    'default'           => '',
    'description'       => ''
), $checkout->get_value( 'my_textbox' ) );

input type=“hidden”

woocommerce_form_field("my_hidden_field", array(
    'type'              => 'hidden',
    'class'             => array('form-row-wide my-hidden-field'),
    'label'             => 'Hidden Field',
    'placeholder'       => '',
    'default'           => '',
    'description'       => ''
), $checkout->get_value( 'my_hidden_field' ) );

Si deseas personalizar por ejemplo el campo de tipo hidden, insertaríamos los siguiente:

function wc_form_hidden_field( $field, $key, $args, $value ){
 
    $defaults = array(
        'label'             => '',
        'id'                => $key,
        'class'             => array(),
        'input_class'       => array(),
        'custom_attributes' => array(),
        'default'           => '',
    ); 
    $args = wp_parse_args( $args, $defaults );
 
    // Custom attribute handling
    $custom_attributes = array();
    if ( ! empty( $args['custom_attributes'] ) && is_array( $args['custom_attributes'] ) )
        foreach ( $args['custom_attributes'] as $attribute => $attribute_value )
            $custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $attribute_value ) . '"';
 
    $field = '<p class="form-row ' . esc_attr( implode( ' ', $args['class'] ) ) .'" id="' . esc_attr( $args['id'] ) . '_field">';
 
    $field .= '<input type="hidden" class="input-text ' . esc_attr( implode( ' ', $args['input_class'] ) ) .'" name="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] ) . '" value="' . esc_attr( $value ) . '" ' . implode( ' ', $custom_attributes ) . ' /></p>';
     
    return $field;
 
}
add_filter( 'woocommerce_form_field_hidden', 'wc_form_hidden_field', 10, 4 );

El html resultante sería el siguiente:

<p class="form-row form-row-wide my-hidden-field" id="my_hidden_field_field">
    <input type="hidden" class="input-text " name="my_hidden_field" id="my_hidden_field" value="">
</p>

En el próximo artículo veremos cómo utilizar estos campos personalizados con un ejemplo práctico. Esperamos que esta información os sirva de ayuda para vuestros próximos desarrollos en WooCommerce.