Automattic\WooCommerce\Internal\Logging

OrderLogsCleanupHelper::delete_debug_log_meta_entriesprivateWC 1.0

Delete _debug_log_source and _debug_log_source_pending_deletion meta entries for the given order IDs from the authoritative table and the backup table (when data sync is enabled).

Method of the class: OrderLogsCleanupHelper{}

No Hooks.

Returns

true|false. True if any meta entries were deleted.

Usage

// private - for code of main (parent) class only
$result = $this->delete_debug_log_meta_entries( $order_ids ): bool;
$order_ids(array) (required)
Array of order IDs to delete meta for.

OrderLogsCleanupHelper::delete_debug_log_meta_entries() code WC 11.0.1

private function delete_debug_log_meta_entries( array $order_ids ): bool {
	global $wpdb;

	$hpos_in_use = OrderUtil::custom_orders_table_usage_is_enabled();

	$tables = array(
		array(
			'table'     => $hpos_in_use ? "{$wpdb->prefix}wc_orders_meta" : $wpdb->postmeta,
			'id_column' => $hpos_in_use ? 'order_id' : 'post_id',
		),
	);

	if ( $this->data_synchronizer->data_sync_is_enabled() ) {
		$tables[] = array(
			'table'     => $hpos_in_use ? $wpdb->postmeta : "{$wpdb->prefix}wc_orders_meta",
			'id_column' => $hpos_in_use ? 'post_id' : 'order_id',
		);
	}

	$id_placeholders = implode( ',', array_fill( 0, count( $order_ids ), '%d' ) );

	$deleted = false;

	foreach ( $tables as $table_config ) {
		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber
		$result = $wpdb->query(
			$wpdb->prepare(
				"DELETE FROM {$table_config['table']}
				 WHERE {$table_config['id_column']} IN ({$id_placeholders})
				 AND meta_key IN (%s, %s)",
				array_merge( $order_ids, array( '_debug_log_source', '_debug_log_source_pending_deletion' ) )
			)
		);
		// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber

		if ( is_int( $result ) && $result > 0 ) {
			$deleted = true;
		}
	}

	if ( ! $deleted ) {
		// These IDs came from a query that just matched them on `_debug_log_source`, so deleting nothing
		// means either another process got there first or the writes are failing. Worth surfacing either way.
		wc_get_logger()->warning(
			sprintf(
				'Expected to delete debug log meta for %d order(s), but no rows were removed.',
				count( $order_ids )
			),
			array( 'source' => 'wc-logs-cleanup' )
		);
	}

	return $deleted;
}