In Woocommerce I’m trying to modify the Customer Order note to say “Ship with this provider” when a customer billing/shipping address is a specific city.
WordPress 5.2.2 WooCommerce 3.6.5
I’m using the woocommerce_thankyou
hook, getting the order data via order ID and get_customer_note()
, set_customer_note()
.
add_action('woocommerce_thankyou','route_mail_on_customer_location', 30, 1); function route_mail_on_customer_location($order_id){ $CP_cities = ["City 1", "City 2", "City 3"]; $order = wc_get_order( $order_id ); $curr_note = $order->get_customer_note(); echo "<p>Customer note: " . $curr_note . "</p>"; if((strpos($curr_note, "Ship with Canada Post.") == false) && (in_array($order->get_shipping_city(), $CP_cities, true))){ $note = __($curr_note . ". Ship with Canada Post."); $order->set_customer_note($note); } echo "<p>Customer note: " . $order->get_customer_note() . "</p>"; }
The echo results display correctly.
Customer note: Test Note Customer note: Test Note Ship with Canada Post.
When I check the order page the order note is only the original customer note.
Customer provided note: Test Note
It looks like the setter isn’t sending the changes to the database. Is there a method I need to call to make sure that my changes are added to the DB, or should I just do it directly via a wpdb query?
EDIT: Corrected echo results to reflect code.
Advertisement
Answer
Just add the follows code snippet to achieve to task –
function modify_woocommerce_checkout_posted_data( $posted_data ){ $CP_cities = array( 'city1', 'city2', 'city3' ); // make sure to replace with proper city data $curr_note = $posted_data['order_comments']; if( strpos($curr_note, 'Ship with Canada Post.') == false && in_array( $posted_data['shipping_city'], $CP_cities ) ){ $note = $curr_note . __(' Ship with Canada Post.', 'textdomain' ); $posted_data['order_comments'] = $note; } return $posted_data; } add_filter( 'woocommerce_checkout_posted_data', 'modify_woocommerce_checkout_posted_data', 99 );