$this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_scripts'); } public function wt_seq_order_status_changed($order_id, $old_status, $new_status, $order) { $order = wc_get_order( $order_id ); $order_status = $order ? $order->get_status() : ''; $is_draft = self::wt_seq_is_draft_order( $order_status ); $is_draft = apply_filters('wt_sequential_is_draft_order',$is_draft,$order); if( false === $is_draft ) { $this->set_sequential_number( $order_id ); } } public static function wt_seq_is_draft_order($order_status) { $is_draft = false; if( 'checkout-draft' === $order_status) { $is_draft = true; } elseif ( 'draft' === $order_status ) { $is_draft = true; } else { $is_draft = false; } return $is_draft; } /** * Added new filter 'wt_sequential_change_last_order_number'. * @since 1.4.4 * Added new filter 'wt_sequential_alter_order_number'. * @since 1.5.2 * Added additional loop to avoid order number duplication in heavy traffic site * @since 1.5.0 * Added conditionalx check to avoid sequential order number generation for subscription orders. * @since 1.5.0 * @since 1.5.2 Added HPOS Compatibility * @since 1.5.7 Fixed order number duplication issue by using file lock. */ public function set_sequential_number($post_id, $post = array() ) { global $wpdb; if ( is_array( $post ) || is_null( $post ) || ( is_object( $post ) && (( isset( $post->post_type )) || isset( $post->type) ) && (( ( 'shop_order' === $post->post_type ) ) || ( 'shop_order' === $post->type ) ) ) ){ $order = $post instanceof \WC_Order ? $post : ($post_id instanceof \WC_Order ? $post_id :wc_get_order( $post_id )); // checks whether the order is subscription order if ( is_object( $order ) && is_a( $order, 'WC_Subscription' ) ) { $is_subscription = true; } elseif ( is_numeric( $order ) && 'shop_subscription' === get_post_type( $order ) ) { $is_subscription = true; } elseif ( is_object( $order ) && is_a( $order, 'HF_Subscription' ) ) { $is_subscription = true; } elseif ( is_numeric( $order ) && 'hf_shop_subscription' == get_post_type( $order ) ) { $is_subscription = true; } else { $is_subscription = false; } $is_subscription=apply_filters('wt_sequential_is_subscription_order',$is_subscription,$order); // If order is subscription skip sequential order number generation. if( true === $is_subscription) { return ; } $order_id = (WC()->version < '2.7.0') ? $order->id : $order->get_id(); $order_number = Wt_Advanced_Order_Number_Common::get_order_meta($order_id, '_order_number'); $increment_counter = !empty((int) get_option('wt_sequence_increment_counter', 1)) ? (int) get_option('wt_sequence_increment_counter', 1) : 1; $is_old_order = self::is_old_order($order_id); $is_old_order = apply_filters('wt_sequential_is_old_order',$is_old_order,$order_id); $order_status = $order ? $order->get_status() : ''; $is_draft = self::wt_seq_is_draft_order( $order_status ); $is_draft = apply_filters('wt_sequential_is_draft_order',$is_draft,$order); // If order is a draft order skip sequential order number generation. if( true === $is_draft ) { return ; } $lockFolderPath = self::get_temp_dir(); if ( !is_dir( $lockFolderPath ) ) { wp_mkdir_p( $lockFolderPath ); } $lockFilePath = $lockFolderPath.'/wt_sequential_order_number.lock'; $file = fopen($lockFilePath,"w"); if (flock($file,LOCK_EX)) { if (empty($order_number) && false === $is_old_order) { $prefix = self::get_sequence_prefix($order_id); $last_order_num = get_option('wt_last_order_number', 0); $query_array = [ "INSERT INTO {$wpdb->postmeta} (post_id, meta_key, meta_value) VALUES (%d,%s,%s)", ]; if(Wt_Advanced_Order_Number_Common::is_wc_hpos_enabled()) { $table_name = $wpdb->prefix.'wc_orders_meta'; $query_array[] = "INSERT INTO {$table_name} (order_id, meta_key, meta_value) VALUES (%d,%s,%s)"; } $wt_last_order_number = get_option('wt_last_order_number', $last_order_num); $wt_last_order_number = apply_filters('wt_sequential_change_last_order_number',$wt_last_order_number,$order_id); $next_insert_id = $wt_last_order_number + 1; update_option('wt_last_order_number', $next_insert_id,'no'); $next_insert_id_padding=self::add_order_no_padding($next_insert_id); $next_order_number = self::add_prefix_suffix($next_insert_id_padding,$order_id); while(self::wt_sequential_number_already_exists($next_order_number)) { $next_insert_id = $next_insert_id + $increment_counter; update_option('wt_last_order_number', $next_insert_id,'no'); $next_insert_id_padding=self::add_order_no_padding($next_insert_id); $next_order_number = self::add_prefix_suffix($next_insert_id_padding,$order_id); } foreach ($query_array as $sql) { $query = $wpdb->prepare($sql, $post_id, '_order_number', $next_order_number); $res = $wpdb->query($query); } $order->save(); } flock($file,LOCK_UN); } else { sleep(2); self::set_sequential_number( $post_id, $post ); } } } public function get_plugin_name() { return $this->plugin_name; } public function get_plugin_base_name() { return $this->plugin_base_name; } public function get_loader() { return $this->loader; } public function get_version() { return $this->version; } public function display_sequence_number($order_number, $order) { $order_id = (WC()->version < '2.7.0') ? $order->id : $order->get_id(); $sequential_order_number = Wt_Advanced_Order_Number_Common::get_order_meta($order_id, '_order_number'); $sequential_order_number = apply_filters('wt_alter_sequence_number',$sequential_order_number,$order_id); return ($sequential_order_number) ? $sequential_order_number : $order_number; } /** * @since 1.5.8 * Get upload Path * @return string */ public static function get_temp_dir() { $uploads_dir = wp_upload_dir(); $folder_name = WT_SEQUENCIAL_ORDNUMBER_NAME . '-lock'; // Construct the full path for the new folder $folder_path = $uploads_dir['basedir'] . '/' . $folder_name; // Check if the folder already exists if (!file_exists($folder_path)) { // Create the folder and its parent directories wp_mkdir_p($folder_path); } return $folder_path; } public function run() { $this->loader->run(); } }