Añadir un campo interno a la ficha de cliente de WooCommerce

Snippet para añadir un campo interno a la ficha de cliente de WooCommerce sin utilizar plugins.


por

Es posible que en tu tienda online en WooCommerce necesites añadir un campo en la ficha de cliente.

El caso más común es el del CIF/NIF, y en ese caso puedes encontrar en este artículo la solución que más me gusta a mí, porque no añade el NIF como un campo aparte de ‘Información adicional’, sino que lo integra perfectamente con el resto de campo y además lo añade a la ficha de datos del cliente, no sólo en las direcciones de envío o facturación.

Pero recientemente me he encontrado un caso en el que la empresa necesitaba añadir un campo interno, que pudiera verse en la ficha del cliente y en los datos de sus pedidos e emails, pero que no apareciera en el checkout de la tienda.

Sería el caso, por ejemplo, de un código u identificador interno que necesitamos añadir a algunos clientes.

Para ello, puedes utilizar el código a continuación:

//Añade el campo Código interno a usuarios
function anade_campo_codigo_usuarios( $campos ) {
 $campos['billing']['fields']['codigo_interno'] = array( 
 'label' => __( 'CodigoInterno', 'woocommerce' ),
 'description' => ''
 );
 
 $campos_nuevos['billing']['fields']['codigo_interno'] = $campos['billing']['fields']['codigo_interno'];
 $campos_nuevos = apply_filters( 'wcbcf_customer_meta_fields', $campos_nuevos );
 
 return $campos_nuevos;
}
add_filter( 'woocommerce_customer_meta_fields', 'anade_campo_codigo_usuarios' );

//Añadimos el Codigo interno a los datos del usuario
function anade_campo_codigo_direccion_facturacion( $campos, $usuario ) {
 $campos['codigo_interno'] = get_user_meta( $usuario, 'codigo_interno', true );
 
}
add_filter( 'woocommerce_user_column_billing_address','anade_campo_codigo_direccion_facturacion', 1, 2 );

//Mostramos el Codigo Interno en el email de pedido:
add_filter( 'woocommerce_email_order_meta_fields', 'custom_woocommerce_email_order_meta_fields', 10, 3 );
function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
 $order = new WC_Order( $order->id );
 $user_id = $order->user_id;
 $fields['codigo_interno'] = array(
 'label' => __( 'Codigo Interno', 'woocommerce' ),
 'value' => get_user_meta( $user_id, 'codigo_interno', true ),
 );
 return $fields;
}
/**
 * Display field value on the order edit page
 */
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
function my_custom_checkout_field_display_admin_order_meta($order){
 $user_id = $order->user_id;
 echo '<p><strong>Código interno:</strong> ' . get_user_meta( $user_id, 'codigo_interno', true ) . '</p>';
}

 

En el caso que necesites añadir varios campos en el checkout u otro tipo de modificaciones, también puedes utilizar WooCommerce Checkout Manager (Gratuito) o WooCommerce Checkout Field Editor Pro ($39),  que te permite personalizar la página de compra de tu tienda añadiendo múltiples campos de diferentes formatos, condicionales, subir archivos y muchas cosas más.

 

 

Comentarios

14 respuestas a «Añadir un campo interno a la ficha de cliente de WooCommerce»

  1. Avatar de Antonio

    |

    Hola Esther! Gracias por tu blog, me ha salvado de muchas cosas.. y me has enseñado muchas más aún!

    Este código es justo el que necesito pero tiene errores (conozco muuuuuuuy poco de código) y no me deja guardar el archivo. (Ej: Pones en la línea 4 «=&GT», entiendo que viene un => ahí, ya que $gt en html significa >)

    ¿Me puedes echar un cable? Muchas gracias! 🙂

    1. Avatar de esther

      |

      Hola Antonio! Me alegra que te sea útil el blog :))
      Ya tienes corregido el código!

      Saludos,

      1. Avatar de Antonio

        |

        Muchas gracias Esther!

        Lo acabo de implementar y está perfecto, pero no veo el campo en los detalles del usuario, sólo lo veo dentro del pedido.

        Y una pregunta, ¿sería posible añadir esto a la factura? (uso el plugin «WooCommerce PDF Invoices & Packing Slips»).

        Muchas gracias!!!!!

        1. Avatar de esther

          |

          Hola Antonio!
          Creo que el plugin de facturas que comentas permite añadir campos personalizados, pero no estoy segura si sólo en la versión de pago.

          Saludos!

  2. Avatar de Andrés

    |

    Hola!

    Muchas gracias por este código, me ha venido de perlas para utilizarlo como código de cliente. Aparece en la ficha del cliente y en el pedido de Woocommerce.
    Pero no viaja en el mail de pedido nuevo.
    Puede ser algo de la versión actual de woo?
    Gracias de antemano.

    1. Avatar de esther

      |

      Hola Andrés!
      Prueba a cambiar el hook, en lugar de:
      add_filter( ‘woocommerce_email_order_meta_fields’, ‘custom_woocommerce_email_order_meta_fields’, 10, 3 );
      utiliza:
      add_action( ‘woocommerce_email_order_meta’, ‘custom_woocommerce_email_order_meta_fields’, 10, 3 );
      El resto se mantendría igual.

      Saludos!

  3. Avatar de Andrés

    |

    Me genera al realizar el pedido/pago un internal server error.

    1. Avatar de esther

      |

      Lo reviso en cuanto pueda y te digo!

  4. Avatar de VERONICA

    |

    Hola! tu codigo me ha resultado de gran ayuda, solo que necesito (y no logro) que desde el checkout, el cliente cargue 1 dato, que luego quede guardado tanto en el pedido como en la ficha de usuario, tal como sucede con el nombre o apellido que al ser obligatorios ya completan el registro.
    Si me puedes ayudar, desde ya te lo agradezco!

    1. Avatar de esther

      |

      Hola Veronica,

      Mírate este tutorial de cómo añadir el NIF al checkout, podrías adaptarlo para el campo que necesites en tu caso: https://woodemia.com/insertar-un-campo-en-la-pagina-de-pago-de-woocommerce/

      Saludos!

      1. Avatar de VERONICA

        |

        Muchas gracias por tu tiempo!
        Te hago otra consulta (siempre hay algo mas que uno quiere hacer con WP y WC), es interminable…
        Es un poco mas complejo: Tengo 5 vendedores (que no manejan el administrador) y tienen asignados clientes (que son los que estan registrado a la pagina para hacer los pedidos).
        Necesito que asi como llega un mail al administrador con el pedido, le llegue el mismo mail al vendedor asignado.
        Seria como agregar una variable que si el cliente tiene tal vendedor, se suma el «x» mail del vendedor para el envio del pedido.
        Con esto estoy realmente perdida… a ver si me podes dar una punta. Muchas Gracias!

        1. Avatar de VERONICA

          |

          Encontre este codigo:
          add_filter( ‘woocommerce_email_headers’, ‘mycustom_headers_filter_function’, 10, 2);

          function mycustom_headers_filter_function($headers, $object) {
          $headers = array();
          $headers[] = ‘Bcc: your name ‘;
          $headers[] = ‘Content-Type: text/html’;
          return $headers;
          }
          Funciona bien, solo que tendria que modificar el mail por la variale «user_registration_correo_vendedor»

          Si tenes alguna idea!

  5. Avatar de Maria

    |

    ¿Y cómo podría añadir el campo interno creado como metadato del pedido para cuando el cliente realice un pedido?

    1. Avatar de esther

      |

      Hola Maria!
      Puedes mirarte este tutorial a ver si te ayuda: https://wisdmlabs.com/blog/add-custom-data-woocommerce-order/
      O si prefieres hacerlo con plugin, este podría servirte: https://es.wordpress.org/plugins/add-fields-to-checkout-page-woocommerce/

      Saludos!