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

$number ) : ?>
0 ) : ?>

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