Guarde el valor del campo personalizado de pago y muéstrelo en las órdenes de administración de WooCommerce

Jan 07 2021

Tengo algunos campos adicionales en mi pago para hacer preguntas al cliente sobre ciertas cosas relacionadas con su pedido. La mayoría de estos son campos de entrada de texto, pero hay un menú Seleccionar que les pregunta cómo se enteraron del sitio de mis clientes. No he podido averiguar cómo mostrar el valor en el área meta del pedido para la opción seleccionada. Así es como estoy generando ese menú desplegable de selección en mi archivo functions.php de mi tema.

woocommerce_form_field( 'aba_hear', array(
    'type'     => 'select',
    'required' => 'true',
    'class'    => array('hear-class form-row-wide'),
    'label'    => __('How did You Hear About Us?'),
    'options'  => array( // options for <select> or <input type="radio" />
        ''          => 'Please select', // empty values means that field is not selected
        'Instagram' => 'Instagram',
        'Facebook'  => 'Facebook',
        'Yelp'  => 'Yelp',
        'Other' => 'Other',
    )

), $checkout->get_value( 'aba_hear' ) );

Ahora voy a agregar una función para actualizar los meta valores del pedido:

add_action( 'woocommerce_checkout_update_order_meta', 'aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['aba_hear'] ) ) { update_post_meta( $order_id, 'How did You Hear About Us&#63;', sanitize_text_field( $_POST['aba_hear'] ) );
    }
}

Y finalmente muestre el valor en la página del pedido:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'aba_checkout_field_display_admin_order_meta', 10, 1 );
function aba_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . get_post_meta( $order->id, 'Is this a Gift&#63;', true ) . '</p>';
}

Por último, así es como aparece el código del menú de selección al finalizar la compra:

<p class="form-row hear-class form-row-wide validate-required" id="aba_hear_field" data-priority="">
    <label for="aba_hear" class="">How did You Hear About Us&#063;&nbsp;<abbr class="required" title="required">*</abbr></label>
    <span class="woocommerce-input-wrapper">
        <select name="aba_hear" id="aba_hear" class="select " data-allow_clear="true" data-placeholder="Please select">
            <option value=""  selected='selected'>Please select</option>
            <option value="Instagram" >Instagram</option>
            <option value="Facebook" >Facebook</option>
            <option value="Yelp" >Yelp</option>
            <option value="Other" >Other</option>
        </select>
    </span>
</p>

Ahora, esto funciona bien para campos de entrada de texto pero no para seleccionar menús. ¿Cómo puedo cambiar esto para que funcione y pueda mostrar los datos resultantes?

Respuestas

1 LoicTheAztec Jan 07 2021 at 15:07

Hay algunos errores en algunas de sus funciones ... Debe usar la misma clave de campo de pago que la clave meta en las siguientes funciones:

En la segunda función, usa otro gancho y también guarda el campo personalizado como metadatos del usuario:

add_action( 'woocommerce_checkout_create_order', 'aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order ) { if ( isset($_POST['aba_hear']) && ! empty($_POST['aba_hear']) ) { $order->update_meta_data( '_aba_hear', sanitize_text_field( $_POST['aba_hear'] ) ); // Update user data if( $order->get_user_id() > 0 ) {
            update_user_meta( $order->get_user_id(), 'aba_hear', true );
        }
    }
}

En la tercera función usa esto:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'aba_checkout_field_display_admin_order_meta', 10, 1 );
function aba_checkout_field_display_admin_order_meta( $order ){
    $value = $order->get_meta( '_aba_hear' );

    if ( ! empty($value) ) { echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . $value . '</p>';
    }
}

Debería funcionar mejor ahora.


Notas:

¿Por qué guardar este campo de pago también como metadatos de usuario personalizados?

Porque en su primera función tiene $checkout->get_value( 'aba_hear' )que mostrará el valor seleccionado del último pedido del cliente en este campo de pago personalizado. El valor se lee del meta del usuario 'aba_hear'.