Automattic\WooCommerce\Internal\DataStores\Orders

DataSynchronizer::process_deleted_orders()privateWC 1.0

Take a batch of order ids pending synchronization and process those that were deleted, ignoring the others (which will be orders that were created or modified) and returning the ids of the orders actually processed.

Метод класса: DataSynchronizer{}

Хуков нет.

Возвращает

Массив. Order ids that have been actually processed.

Использование

// private - только в коде основоного (родительского) класса
$result = $this->process_deleted_orders( $batch, $custom_orders_table_is_authoritative ): array;
$batch(массив) (обязательный)
Array of ids of order pending synchronization.
$custom_orders_table_is_authoritative(true|false) (обязательный)
True if the custom orders table is currently authoritative.

Код DataSynchronizer::process_deleted_orders() WC 8.7.0

private function process_deleted_orders( array $batch, bool $custom_orders_table_is_authoritative ): array {
	global $wpdb;

	$deleted_from_table_name = $this->get_current_deletion_record_meta_value();

	$data_store_for_deletion =
		$custom_orders_table_is_authoritative ?
		new \WC_Order_Data_Store_CPT() :
		wc_get_container()->get( OrdersTableDataStore::class );

	$order_ids_as_sql_list = '(' . implode( ',', $batch ) . ')';

	$deleted_order_ids  = array();
	$meta_ids_to_delete = array();

	// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
	$deletion_data = $wpdb->get_results(
		$wpdb->prepare(
			"SELECT id, order_id FROM {$wpdb->prefix}wc_orders_meta WHERE meta_key=%s AND meta_value=%s AND order_id IN $order_ids_as_sql_list ORDER BY order_id DESC",
			self::DELETED_RECORD_META_KEY,
			$deleted_from_table_name
		),
		ARRAY_A
	);
	// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared

	if ( empty( $deletion_data ) ) {
		return array();
	}

	foreach ( $deletion_data as $item ) {
		$meta_id  = $item['id'];
		$order_id = $item['order_id'];

		if ( isset( $deleted_order_ids[ $order_id ] ) ) {
			$meta_ids_to_delete[] = $meta_id;
			continue;
		}

		if ( ! $data_store_for_deletion->order_exists( $order_id ) ) {
			$this->error_logger->warning( "Order {$order_id} doesn't exist in the backup table, thus it can't be deleted" );
			$deleted_order_ids[]  = $order_id;
			$meta_ids_to_delete[] = $meta_id;
			continue;
		}

		try {
			$order = new \WC_Order();
			$order->set_id( $order_id );
			$data_store_for_deletion->read( $order );

			$data_store_for_deletion->delete(
				$order,
				array(
					'force_delete'     => true,
					'suppress_filters' => true,
				)
			);
		} catch ( \Exception $ex ) {
			$this->error_logger->error( "Couldn't delete order {$order_id} from the backup table: {$ex->getMessage()}" );
			continue;
		}

		$deleted_order_ids[]  = $order_id;
		$meta_ids_to_delete[] = $meta_id;
	}

	if ( ! empty( $meta_ids_to_delete ) ) {
		$order_id_rows_as_sql_list = '(' . implode( ',', $meta_ids_to_delete ) . ')';
		// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
		$wpdb->query( "DELETE FROM {$wpdb->prefix}wc_orders_meta WHERE id IN {$order_id_rows_as_sql_list}" );
	}

	return $deleted_order_ids;
}