Automattic\WooCommerce\Internal\DataStores\Orders

OrdersTableDataStore::persist_order_to_db()protectedWC 6.8.0

Persists order changes to the database.

{} Это метод класса: OrdersTableDataStore{}

Хуков нет.

Возвращает

null. Ничего.

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

// protected - в коде основоного (родительского) или дочернего класса
$result = $this->persist_order_to_db( $order );
$order(\WC_Order) (обязательный) (передается по ссылке — &)
The order.

Список изменений

С версии 6.8.0 Введена.

Код OrdersTableDataStore::persist_order_to_db() WC 6.8.0

protected function persist_order_to_db( &$order ) {
	global $wpdb;

	$context   = ( 0 === absint( $order->get_id() ) ) ? 'create' : 'update';
	$data_sync = wc_get_container()->get( DataSynchronizer::class );

	if ( 'create' === $context ) {
		// XXX: do we want to add some backwards compat for 'woocommerce_new_order_data'?
		$post_id = wp_insert_post(
			array(
				'post_type'   => $data_sync->data_sync_is_enabled() ? 'shop_order' : $data_sync::PLACEHOLDER_ORDER_POST_TYPE,
				'post_status' => 'draft',
			)
		);

		if ( ! $post_id ) {
			throw new \Exception( __( 'Could not create order in posts table.', 'woocommerce' ) );
		}

		$order->set_id( $post_id );
	}

	// Figure out what needs to be updated in the database.
	$db_updates = $this->get_db_rows_for_order( $order, $context, ( 'update' === $context ) );

	// Persist changes.
	foreach ( $db_updates as $update ) {
		// Make sure 'data' and 'format' entries match before passing to $wpdb.
		ksort( $update['data'] );
		ksort( $update['format'] );

		$result = empty( $update['where'] )
				? $wpdb->insert( $update['table'], $update['data'], array_values( $update['format'] ) )
				: $wpdb->update( $update['table'], $update['data'], $update['where'], array_values( $update['format'] ), $update['where_format'] );

		if ( false === $result ) {
			// translators: %s is a table name.
			throw new \Exception( sprintf( __( 'Could not persist order to database table "%s".', 'woocommerce' ), $update['table'] ) );
		}
	}

	// Backfill post record.
	if ( $data_sync->data_sync_is_enabled() ) {
		$this->backfill_post_record( $order );
	}
}