Actualmente estoy tratando de agregar un campo personalizado a los campos de dirección predeterminados (nombre, apellido, etc.)
El campo debe usarse para establecer un saludo para el cliente.
Para ello utilicé el siguiente filtro:
add_filter( 'woocommerce_default_address_fields', 'custom_woocommerce_address_fields' ); function custom_woocommerce_address_fields($fields) { $fields['salutation'] = array( 'label' => __('Anrede', 'woocommerce'), // Add custom field label 'placeholder' => 'CA12345678', // Add custom field placeholder 'required' => true, // if field is required or not 'clear' => false, // add clear or not 'type' => 'select', // add field type 'options' => array( 'Herr' => 'Herr', 'Frau' => 'Frau', 'Firma' => 'Firma' ), 'priority' => 1, // add priority 'class' => array('billing-salutation-input')// add class name ); return $fields; }Guardando el campo personalizado:
add_action( 'woocommerce_checkout_update_order_meta', 'save_new_checkout_field' ); function save_new_checkout_field( $order_id ) { if ( $_POST['billing_salutation'] ) update_post_meta( $order_id, '_salutation', esc_attr( $_POST['billing_salutation'] ) ); }Problema:
Cuando miro los detalles del pedido, el nuevo campo no aparece debajo de los campos de dirección predeterminados.
Entonces usé el siguiente código para mostrar los nuevos datos.
add_action( 'woocommerce_admin_order_data_after_billing_address', 'show_new_checkout_field_order', 10, 1 ); function show_new_checkout_field_order( $order ) { $order_id = $order->get_id(); if ( get_post_meta( $order_id, '_salutation', true ) ) echo '<p><strong>Anrede:</strong> ' . get_post_meta( $order_id, '_salutation', true ) . '</p>'; }Sin embargo, el campo siempre se muestra en la parte inferior y no puedo encontrar la manera de llevar el campo a la posición deseada (imagen)
¿Tengo que usar un enlace diferente para mostrar los datos en la ubicación deseada (detalles de facturación)?
¿O tengo que editar una plantilla específica de woocommerce?
El resultado es una cadena, que usa <br/> para separar los detalles de la dirección de facturación del pedido.
Así que hay 2 vistas posibles:
company_name<br/>Firstname Lastname<br/>street<br/>1<br/>1000 LocationFirstname Lastname<br/>street<br/>1<br/>1000 Location Hay varias posibilidades que puede aplicar para responder a su pregunta, pero la más fácil es editar la cadena a través del gancho de filtro woocommerce_order_get_formatted_billing_address .
Nota: vamos a verificar si realmente hay una empresa de facturación y ajustaremos nuestro resultado en función de eso.
Nota: ajuste $order->get_meta( '_your_meta_key' ); a tus necesidades
Entonces obtienes:
function str_replace_first( $search, $replace, $subject ) { $pos = strpos( $subject, $search ); if ( $pos !== false ) { return substr_replace( $subject, $replace, $pos, strlen( $search ) ); } return $subject; } /** * Filter orders formatterd billing address. * * @since 3.8.0 * @param string $address Formatted billing address string. * @param array $raw_address Raw billing address. * @param WC_Order $order Order data. @since 3.9.0 */ function filter_woocommerce_order_get_formatted_billing_address( $address, $raw_address, $order ) { // Get meta $value = $order->get_meta( '_your_meta_key' ); // When empty, return if ( empty ( $value ) ) return $address; // Get billing company $billing_company = $order->get_billing_company(); // Not empty if ( ! empty ( $billing_company ) ) { $address = str_replace_first( '<br/>', '<br/>' . $value . '<br/>', $address ); } else { $address = $value . '<br/>' . $address; } return $address; } add_filter( 'woocommerce_order_get_formatted_billing_address', 'filter_woocommerce_order_get_formatted_billing_address', 10, 3 );Resultado:
company_name<br/>meta_value<br/>Firstname Lastname<br/>street<br/>1<br/>1000 Locationmeta_value<br/>Firstname Lastname<br/>street<br/>1<br/>1000 LocationUsado en esta respuesta: https://stackoverflow.com/a/2606638/11987538
¡Es absolutamente factible! Puede billing_address_fields append ¡Solo necesita personalizar sus datos usando los ganchos correctos!
Así que usó el gancho de filtro woocommerce_default_address_fields para append $fields['salutation'] a los datos predeterminados. En la pantalla de administración, debe hacer lo mismo pero usando diferentes ganchos.
Esto es lo que vamos a hacer:
woocommerce_localisation_address_formats para definir un marcador de posición para nuestros datos personalizados.woocommerce_formatted_address_replacements .woocommerce_order_formatted_billing_address . 1- woocommerce_localisation_address_formats
add_filter('woocommerce_localisation_address_formats', 'admin_customized_localisation_address_formats', 99); function admin_customized_localisation_address_formats($billing_address_formats) { if (is_admin()) { foreach($billing_address_formats as $key => $value) { $billing_address_formats[$key] .= "\n{salutation}"; } } return $billing_address_formats; } 2- woocommerce_formatted_address_replacements
add_filter('woocommerce_formatted_address_replacements', 'adding_customized_replacements', 10, 2); function adding_customized_replacements($replacements, $args) { $replacements["{salutation}"] = !empty($args["salutation"]) ? $args["salutation"] : ""; return $replacements; } 3- woocommerce_order_formatted_billing_address
add_filter('woocommerce_order_formatted_billing_address', 'display_customized_order_address_fields_on_admin', 10, 2); function display_customized_order_address_fields_on_admin($address, $order) { $order_id = $order->get_id(); $address["salutation"] = get_post_meta($order_id, '_salutation', true) ? 'Anrede: ' . get_post_meta($order_id, '_salutation', true) : "No salutation data"; return $address; }Esto generará esto: