I added some data with the function :
woocommerce_register_additional_checkout_field(
array(
'id' => 'namespace/newsletter-opt-in',
'label' => 'Subscribe to newsletter ?',
'location' => 'order',
'type' => 'checkbox',
)
);
I try to check this checkbox but I can't get the value However, the data is well returned in my order data column
I tried :
$order = wc_get_order($order_id);
$subscribe = $order->get_meta('namespace/newsletter-opt-in');
But $subscribe
is empty
I added some data with the function :
woocommerce_register_additional_checkout_field(
array(
'id' => 'namespace/newsletter-opt-in',
'label' => 'Subscribe to newsletter ?',
'location' => 'order',
'type' => 'checkbox',
)
);
I try to check this checkbox but I can't get the value However, the data is well returned in my order data column
I tried :
$order = wc_get_order($order_id);
$subscribe = $order->get_meta('namespace/newsletter-opt-in');
But $subscribe
is empty
2 Answers
Reset to default 2Your provided code is a bit incomplete and you missed saving the field value. Try the following:
// Add a custom checkout field (checkout blocks)
add_action(
'woocommerce_init',
function() {
woocommerce_register_additional_checkout_field( array(
'id' => 'namespace/newsletter-opt-in',
'label' => 'Subscribe to newsletter?',
'location' => 'order',
'type' => 'checkbox',
) );
}
);
// Save the custom checkout field value (when the checkbox ix checked)
add_action(
'woocommerce_set_additional_field_value',
function ( $key, $value, $group, $wc_object ) {
if ( 'namespace/newsletter-opt-in' === $key ) {
$wc_object->update_meta_data( 'newsletter_opt_in', $value );
}
},
10,
4
);
Now the field value is saved as custom order meta data when submitting an order and you can retreive the "newsletter opt-in" value from the WC_Order
object like:
$order = wc_get_order($order_id);
$subscribe = $order->get_meta('newsletter_opt_in');
The value will equal to '1'
if the customer has subscribed. If the customer didn't subscribed there is no value (an empty string).
In complement to @LoicTheAztec answer, I use this hook :
woocommerce_payment_complete
The code :
#[Action('woocommerce_payment_complete')]
function validate_newsletter_opt_in($order_id)
{
$order = wc_get_order($order_id);
$newsletter_opt_in = $order->get_meta('newsletter_opt_in');
if ($newsletter_opt_in) {
$email = $order->get_billing_email();
if ($email) {
//here the code to subscribe
}
}
}
'namespace/newsletter-opt-in'
, but you're trying to retrieve it with'szf/newsletter-opt-in'
. – Richard Commented Mar 31 at 7:23