Salvar o valor do campo personalizado de checkout e exibi-lo nos pedidos de administração do WooCommerce

Jan 07 2021

Eu tenho alguns campos adicionais em minha finalização da compra para fazer perguntas ao cliente sobre certos itens relacionados ao seu pedido. A maioria deles são campos de entrada de texto, mas há um menu Selecionar perguntando como souberam do site de meus clientes. Não consegui descobrir como exibir o valor na metaárea do pedido para a opção selecionada. Veja como estou gerando aquele menu suspenso de seleção em meu arquivo functions.php do meu 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' ) );

Agora vou adicionar uma função para atualizar os metavalores do 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'] ) );
    }
}

E, finalmente, exiba o valor na página do 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 fim, veja como o código do menu de seleção aparece na finalização da 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>

Agora, isso funciona bem para campos de entrada de texto, mas não para menus de seleção. Como posso alterar isso para que funcione e exiba os dados resultantes?

Respostas

1 LoicTheAztec Jan 07 2021 at 15:07

Existem alguns erros em algumas de suas funções ... Você precisa usar a mesma chave de campo de checkout como meta key nas seguintes funções:

Na 2ª função, você usa outro gancho e salva o campo personalizado como metadados do usuário também:

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 );
        }
    }
}

Na 3ª função use isto:

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>';
    }
}

Deve funcionar melhor agora.


Notas:

Por que salvar este campo de checkout também como metadados de usuário personalizados?

Porque em sua primeira função você tem $checkout->get_value( 'aba_hear' )que exibir o valor selecionado no último pedido do cliente neste campo de checkout personalizado. O valor é lido da meta do usuário 'aba_hear'.