ID );
if ( ! $order ) {
return;
}
if ( AISP_order_tracking_notification_Settings::is_pickup_order( $order ) ) {
echo '
';
esc_html_e(
'Pickup order – tracking information is not required.',
'aisp-order-tracking-notification'
);
echo '
';
return;
}
wp_nonce_field(
'aisp_order_tracking_notification_save_tracking',
'aisp_order_tracking_notification_nonce'
);
$carriers = aisp_order_tracking_notification_Helpers::aisp_order_tracking_notification_get_carriers();
$data = aisp_order_tracking_notification_Helpers::aisp_get_order_tracking_data( $order );
$current_carrier = $data['carrier'];
$current_trackings = $data['tracking']; // array
// Ensure at least one empty row for new orders.
if ( empty( $current_trackings ) ) {
$current_trackings = array( '' );
}
$boxes = $order->get_meta( aisp_order_tracking_notification_Helpers::META_BOXES, true );
if ( '' !== $boxes && is_numeric( $boxes ) ) {
$boxes = absint( $boxes );
} else {
$boxes = '';
}
?>
get_id() );
if ( ! $post ) {
return;
}
echo '';
$this->render_meta_box( $post );
echo '
';
}
public function save_order_meta( $post_id, $order ) {
if ( ! $order instanceof WC_Order ) {
return;
}
if ( AISP_order_tracking_notification_Settings::is_pickup_order( $order ) ) {
return;
}
if ( ! isset( $_POST['aisp_order_tracking_notification_nonce'] ) ) {
return;
}
if (
! check_admin_referer(
'aisp_order_tracking_notification_save_tracking',
'aisp_order_tracking_notification_nonce'
)
) {
return;
}
if ( ! current_user_can( 'edit_shop_order', $post_id ) ) {
return;
}
// Carrier.
$carrier = isset( $_POST['aisp_order_tracking_notification_carrier'] )
? sanitize_text_field( wp_unslash( $_POST['aisp_order_tracking_notification_carrier'] ) )
: '';
// Tracking numbers — filter out empty rows.
$raw_trackings = isset( $_POST['aisp_order_tracking_notification_trackings'] )
? array_map( 'sanitize_text_field', wp_unslash( (array) $_POST['aisp_order_tracking_notification_trackings'] ) )
: array();
$trackings = array_values(
array_filter(
$raw_trackings,
function( $v ) { return '' !== trim( $v ); }
)
);
// Boxes.
if ( current_user_can( 'manage_woocommerce' ) ) {
$boxes = isset( $_POST['aisp_order_tracking_notification_boxes'] )
? sanitize_text_field( wp_unslash( $_POST['aisp_order_tracking_notification_boxes'] ) )
: '';
if ( '' === $boxes ) {
$order->delete_meta_data( aisp_order_tracking_notification_Helpers::META_BOXES );
} else {
$boxes = max( 1, absint( $boxes ) );
$order->update_meta_data( aisp_order_tracking_notification_Helpers::META_BOXES, $boxes );
}
}
// Retrieve previous values to detect changes for the order note.
$prev_carrier = $order->get_meta( aisp_order_tracking_notification_Helpers::META_CARRIER, true );
$prev_trackings = aisp_order_tracking_notification_Helpers::aisp_normalize_tracking_value(
$order->get_meta( aisp_order_tracking_notification_Helpers::META_TRACKING, true )
);
// Save carrier and tracking array as JSON.
$order->update_meta_data( aisp_order_tracking_notification_Helpers::META_CARRIER, $carrier );
$order->update_meta_data(
aisp_order_tracking_notification_Helpers::META_TRACKING,
! empty( $trackings ) ? wp_json_encode( $trackings ) : ''
);
$order->save();
// Add internal order note only when something actually changed.
if ( ! empty( $carrier ) && ! empty( $trackings ) ) {
$changed = ( $carrier !== $prev_carrier ) || ( $trackings !== $prev_trackings );
if ( $changed ) {
$summary = aisp_order_tracking_notification_Helpers::aisp_build_tracking_note_summary(
$carrier,
$trackings
);
$is_update = ! empty( $prev_trackings );
$note = $is_update
/* translators: %s: carrier + tracking numbers summary */
? sprintf( __( 'Tracking updated manually — %s', 'aisp-order-tracking-notification' ), $summary )
/* translators: %s: carrier + tracking numbers summary */
: sprintf( __( 'Tracking added manually — %s', 'aisp-order-tracking-notification' ), $summary );
aisp_order_tracking_notification_Helpers::aisp_add_order_note( $order, $note );
}
}
}
/**
* Inline JS for add/remove tracking rows — output only on order edit pages.
*/
public function render_tracking_row_js() {
$screen = get_current_screen();
if ( ! $screen ) {
return;
}
// Works on both legacy (shop_order) and HPOS (woocommerce_page_wc-orders) screens.
if ( 'shop_order' !== $screen->id && 'woocommerce_page_wc-orders' !== $screen->id ) {
return;
}
?>