autoship_update_schedule_items_action_handler (function)
( src/scheduled-orders.php) The main handler for the for updating Scheduled Orders items. It takes the (Scheduled) $order_id, and the $data needed to perform the action as parameters and returns whether the update was successful or not.
Function
/** * The main handler for the autoship_update_schedule_items action * Updates the Scheduled Items for the supplied order ID * * @param int $order_id The Autoship Scheduled Order ID * @param mixed $data The Data necessary to perform this action. * @return int|bool|WP_Error True if successful or WR_Error|false on failure. */ function autoship_update_schedule_items_action_handler( $order_id, $data ){ // Get Current Scheduled Order items & // Verify it needs to be updated if possible $original_autoship_order_items = $updated_autoship_order_items = array(); if ( isset( $data['original_autoship_order'] ) && !empty( $data['original_autoship_order'] ) ) { $original_order_items = $data['original_autoship_order']['scheduledOrderItems']; // Flip supplied ids for better lookup. $item_ids = array_flip( array_keys( $data['order_items'] ) ); // Iterate through the scheduled order items and unset any // not requested. foreach ($original_order_items as $key => $item) { if ( empty( $item_ids ) || isset( $item_ids[$item['id']] ) ) $original_autoship_order_items[$item['id']] = $original_order_items[$key]; } } else { $original_autoship_order_items = autoship_get_scheduled_order_items( $order_id, array_keys( $data['order_items'] ) ); $original_autoship_order_items = autoship_convert_object_to_array( $original_autoship_order_items ); } // Check changes are actual changes and if so init updates. foreach ( $data['order_items'] as $item_id => $item) { $change = false; $temp = $original_autoship_order_items[$item_id]; // Insert item value update code ( need to make extendable ) if ( $original_autoship_order_items[$item_id]['quantity'] != $item['qty'] ){ $change = true; $temp['quantity'] = $item['qty']; } if ( isset( $item['price'] ) && ( $original_autoship_order_items[$item_id]['price'] != $item['price'] ) ){ $change = true; $temp['price'] = $item['price']; } if ( isset( $item['sale_price'] ) && ( $original_autoship_order_items[$item_id]['salePrice'] != $item['sale_price'] ) ){ $change = true; $temp['salePrice'] = $item['sale_price']; } // If there was indeed a change then add it to updated items. if ( apply_filters( 'autoship_update_schedule_items_changed_made', $change, $original_autoship_order_items[$item_id], $item ) ) $updated_autoship_order_items[$item_id] = $temp; } /** * Allow devs to modify item changes on the fly. */ $updated_autoship_order_items = apply_filters( 'autoship_update_schedule_items_changes', $updated_autoship_order_items, $original_autoship_order_items, $order_id, 'autoship_update_schedule_items' , $data ); /** * Now update any existing order items if necessary. */ if ( !empty( $updated_autoship_order_items ) ){ // Run the Set method // Method returns WP_Error on failure. $result = autoship_set_scheduled_order_items ( $order_id, $updated_autoship_order_items ); } // Check for new items $new_autoship_order_items = array(); if ( ( empty( $updated_autoship_order_items ) || ( !empty( $updated_autoship_order_items ) && !is_wp_error( $result ) ) ) && !empty( $data['new_order_items'] ) ){ // Get Current Scheduled Order Frequency and FrequencyType needed for new items $original_frequency = $original_type = ''; if ( !isset( $data['original_autoship_order'] ) || empty( $data['original_autoship_order'] ) ){ $data['original_autoship_order'] = autoship_get_scheduled_orders( $order_id ); $data['original_autoship_order'] = autoship_convert_object_to_array( $data['original_autoship_order'] ); } // No problems getting the original order if ( !is_wp_error( $data['original_autoship_order'] ) ){ foreach ( $data['new_order_items'] as $item_ids => $item_data) { // Item ids are QPilot id - External ID $ids = explode( '-', $item_ids ); // Get the Product Data associated with the item. $new_autoship_order_items[] = autoship_create_scheduled_order_item_data ( $order_id, $ids[0], $ids[1], $item_data['qty'], $data['original_autoship_order']['frequencyType'], $data['original_autoship_order']['frequency'] ); } /** * Allow devs to modify item changes on the fly. */ $new_autoship_order_items = apply_filters( 'autoship_update_schedule_new_items_changes', $new_autoship_order_items, $order_id, 'autoship_update_schedule_items' , $data ); // Now add the items via the api $result = autoship_create_scheduled_order_items( $order_id, $new_autoship_order_items ); } } $scheduled_order_label = autoship_translate_text( 'Scheduled Order' ); // Check if no change is being made if ( empty( $updated_autoship_order_items ) && empty( $new_autoship_order_items ) ){ do_action( 'autoship_after_update_schedule_items_handler_nochange', $order_id, 'autoship_update_schedule_items' , $data ); wc_add_notice( __( sprintf( 'No changes updated for %s #%s.', $scheduled_order_label, $order_id ) , 'autoship' ), 'notice' ); return true; } // Dynamically adjust notice based on what action was being performed. $new_messages = ''; if ( !empty( $updated_autoship_order_items ) && !empty( $new_autoship_order_items ) ){ $new_messages = array( 'error' => __( "A problem was encountered updating the {$scheduled_order_label}'s items.", 'autoship'), 'success' => __( "The items for {$scheduled_order_label} #%s were successfully updated.", 'autoship'), ); } else if ( !empty( $new_autoship_order_items ) ){ $new_messages = array( 'error' => __( "A problem was encountered Adding the new {$scheduled_order_label}'s items.", 'autoship'), 'success' => __( "The items for {$scheduled_order_label} #%s were successfully added.", 'autoship'), ); } if ( !empty( $new_messages ) ) add_filter( 'default_autoship_update_schedule_items_action_messages', function( $messages ) { return array_merge( $messages, $new_messages ); }, 11, 1 ); return $result; }