Salvar o valor do campo personalizado de checkout e exibi-lo nos pedidos de administração do WooCommerce
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?', 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?').':</strong> ' . get_post_meta( $order->id, 'Is this a Gift?', 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? <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
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?').':</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'.