[Woocommerce] Guardar novos campos na página checkout

Anfanger

Membro
Boas,

Estou a tentar adicionar quatro campos na página de checkout e guardar os inputs do user para depois apresentar nos detalhes da encomenda (página thankyou e backoffice).
Estou a fazê-lo da seguinte forma:

PHP:
//Display custom fields
add_filter( 'woocommerce_checkout_before_customer_details', 'message_zone' );
function message_zone( $msg ) {


  $domain = 'woocommerce';
    $checkout = WC()->checkout;

    $shipping_method ='flat_rate:1'; // Set the desired shipping method to hide the checkout field(s).
    global $woocommerce;
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = $chosen_methods[0];


    if ($chosen_shipping == $shipping_method)
    {
        echo '<p>O destino de entrega da encomenda encontra-se fora do raio de entregas por nós previsto. Os custos associados ao transporte terão de ser alvo de análise. Pedimos que preencha o seguinte formulário para que possamos fazer uma avaliação e assim que oportuno entraremos em contacto para finalizar-mos a sua encomenda.</p><p></p>';

        echo '<div id="my_custom_checkout_field">';

        echo '<h3>' . __('Detalhes de encomenda:') . '</h3>';

        woocommerce_form_field( '_shipping_address', array(
        'type'          => 'text',
        'label'         => __('Morada de entrega', $domain ),
        'placeholder'   => __('Introduza a morada de entrega', $domain ),
        'class'         => array('my-field-class form-row-wide'),
        'required'      => true, // or false
       ), $checkout->get_value( '_shipping_address' ) );

        woocommerce_form_field( '_postal_code', array(
        'type'          => 'text',
        'label'         => __('Código Postal', $domain ),
        'placeholder'   => __('Introduza o código postal', $domain ),
        'class'         => array('my-field-class form-row-wide'),
        'required'      => true, // or false
       ), $checkout->get_value( '_postal_code' ) );

         echo '<h5>' . __('Contacto em obra:') . '</h5>';

         woocommerce_form_field( '_name', array(
        'type'          => 'text',
        'label'         => __('Nome da pessoa em obra', $domain ),
        'placeholder'   => __('Introduza o nome da pessoa em obra que irá receber a encomenda', $domain ),
        'class'         => array('my-field-class form-row-wide'),
        'required'      => true, // or false
       ), $checkout->get_value( '_name' ) );

           woocommerce_form_field( '_tlm', array(
        'type'          => 'text',
        'label'         => __('Telemóvel', $domain ),
        'placeholder'   => __('Introduza o contacto telefónico da pessoa em obra que irá receber a encomenda', $domain ),
        'class'         => array('my-field-class form-row-wide'),
        'required'      => true, // or false
       ), $checkout->get_value( '_tlm' ) );

       echo '</div>';
    }
    else
      echo '';

    echo $msg;
}


// Custom checkout fields validation
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['_shipping_address'] )
        wc_add_notice( __( 'Prencha a morada de entrega' ), 'error' );
    if ( ! $_POST['_postal_code'] )
        wc_add_notice( __( 'Preencha o código postal' ), 'error' ); 
    if ( ! $_POST['_name'] )
        wc_add_notice( __( 'Preencha o nome da pessoa em obra' ), 'error' );
    if ( ! $_POST['_tlm'] )
        wc_add_notice( __( 'Prencha o contacto telefónico' ), 'error' );         
}


//save custom fields
function save_extra_checkout_fields( $order_id, $posted )
{
    // don't forget appropriate sanitization if you are using a different field type
    if( isset( $posted['_shipping_address'] ) )
    {
        update_post_meta( $order_id, '_shipping_address', sanitize_text_field( $posted['_shipping_address'] ) );
    }
    if( isset( $posted['_postal_code'] ) )
    {
        update_post_meta( $order_id, '_postal_code', sanitize_text_field( $posted['_postal_code'] ) );
    }
    if( isset( $posted['_name'] ) )
    {
        update_post_meta( $order_id, '_name', sanitize_text_field( $posted['_name'] ) );
    }
    if( isset( $posted['_tlm'] ) )
    {
        update_post_meta( $order_id, '_tlm', sanitize_text_field( $posted['_tlm'] ) );
    }
}
add_action( 'woocommerce_checkout_update_order_meta', 'save_extra_checkout_fields', 10, 2 );


//Display custom fields in thankyou page
function display_order_data( $order_id ){  ?>
    <h2><?php _e( 'Detalhes da encomenda:' ); ?></h2>
    <table class="shop_table shop_table_responsive additional_info">
        <tbody>
            <tr>
                <th><?php _e( 'Morada de entrega:' ); ?></th>
                <td><?php echo get_post_meta( $order_id, '_shipping_address', true ); ?></td>
            </tr>
            <tr>
                <th><?php _e( 'Código Postal:' ); ?></th>
                <td><?php echo get_post_meta( $order_id, '_postal_code', true ); ?></td>
            </tr>
            <tr>
                <th><?php _e( 'Nome da pessoa em obra:' ); ?></th>
                <td><?php echo get_post_meta( $order_id, '_name', true ); ?></td>
            </tr>
            <tr>
                <th><?php _e( 'Contacto telefónico:' ); ?></th>
                <td><?php echo get_post_meta( $order_id, '_tlm', true ); ?></td>
            </tr>
        </tbody>
    </table>
<?php }
add_action( 'woocommerce_thankyou', 'display_order_data', 20 );
add_action( 'woocommerce_view_order', 'display_order_data', 20 );


//Display custom fields in order page (backoffice)
function display_order_data_in_admin( $order ){  ?>
    <div class="order_data_column">
        <h4><?php _e( 'Detalhes da encomenda:', 'woocommerce' ); ?><a href="#" class="edit_address"><?php _e( 'Editar', 'woocommerce' ); ?></a></h4>
        <div class="address">
        <?php
            echo '<p><strong>' . __( 'Morada de entrega' ) . ':</strong>' . get_post_meta( $order->id, '_shipping_address', true ) . '</p>';
            echo '<p><strong>' . __( 'Código Postal' ) . ':</strong>' . get_post_meta( $order->id, '_postal_code', true ) . '</p>';
            echo '<p><strong>' . __( 'Nome da pessoa em obra' ) . ':</strong>' . get_post_meta( $order->id, '_name', true ) . '</p>';
            echo '<p><strong>' . __( 'Contacto telefónico' ) . ':</strong>' . get_post_meta( $order->id, '_tlm', true ) . '</p>';
            ?>
        </div>
        <div class="edit_address">
            <?php woocommerce_wp_text_input( array( 'id' => '_shipping_address', 'label' => __( 'Morada de entrega:' ), 'wrapper_class' => '_billing_company_field' ) ); ?>
            <?php woocommerce_wp_text_input( array( 'id' => '_postal_code', 'label' => __( 'Código Postal:' ), 'wrapper_class' => '_billing_company_field' ) ); ?>
            <?php woocommerce_wp_text_input( array( 'id' => '_name', 'label' => __( 'Nome da pessoa em obra:' ), 'wrapper_class' => '_billing_company_field' ) ); ?>
            <?php woocommerce_wp_text_input( array( 'id' => '_tlm', 'label' => __( 'Contacto telefónico:' ), 'wrapper_class' => '_billing_company_field' ) ); ?>
        </div>
    </div>
<?php }
add_action( 'woocommerce_admin_order_data_after_order_details', 'display_order_data_in_admin' );


function save_extra_details( $post_id, $post )
{
    update_post_meta( $post_id, '_shipping_address', wc_clean( $_POST[ '_shipping_address' ] ) );
    update_post_meta( $post_id, '_postal_code', wc_clean( $_POST[ '_postal_code' ] ) );
    update_post_meta( $post_id, '_name', wc_clean( $_POST[ '_name' ] ) );
    update_post_meta( $post_id, '_tlm', wc_clean( $_POST[ '_tlm' ] ) );
}
add_action( 'woocommerce_process_shop_order_meta', 'save_extra_details', 45, 2 );

Os campos são criados, apresentados na página thankyou e order details (backoffice), mas por alguma razão não me apresenta os inputs introduzidos pelo user.

https://imgur.com/KJ9frZJ
https://imgur.com/AOzhvFQ

Alguém me consegue dar uma ajuda ?
 
Estou a usar Storefront.
Confirma se os dados estão aparecer na BD. Pelo o que estou a ver o update_post_meta não estão a executar corretamente.

Estive analisar o hook woocommerce_checkout_update_order_meta e isso está mal.

do_action( 'woocommerce_checkout_update_order_meta', $process_checkout, $int, $int );

Ele não te passa o parâmetro $posted. Tens de o remover e usar $_POST['_postal'] para aceder aos dados
 
Back
Topo