WC_API_Products::save_variations()protectedWC 2.2

Save variations.

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

Хуки из метода

Возвращает

true|false.

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

// protected - в коде основоного (родительского) или дочернего класса
$result = $this->save_variations( $product, $request );
$product(WC_Product) (обязательный)
-
$request(массив) (обязательный)
-

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

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

Код WC_API_Products::save_variations() WC 8.7.0

protected function save_variations( $product, $request ) {
	global $wpdb;

	$id         = $product->get_id();
	$variations = $request['variations'];
	$attributes = $product->get_attributes();

	foreach ( $variations as $menu_order => $data ) {
		$variation_id = isset( $data['id'] ) ? absint( $data['id'] ) : 0;
		$variation    = new WC_Product_Variation( $variation_id );

		// Create initial name and status.
		if ( ! $variation->get_slug() ) {
			/* translators: 1: variation id 2: product name */
			$variation->set_name( sprintf( __( 'Variation #%1$s of %2$s', 'woocommerce' ), $variation->get_id(), $product->get_name() ) );
			$variation->set_status( isset( $data['visible'] ) && false === $data['visible'] ? 'private' : 'publish' );
		}

		// Parent ID.
		$variation->set_parent_id( $product->get_id() );

		// Menu order.
		$variation->set_menu_order( $menu_order );

		// Status.
		if ( isset( $data['visible'] ) ) {
			$variation->set_status( false === $data['visible'] ? 'private' : 'publish' );
		}

		// SKU.
		if ( isset( $data['sku'] ) ) {
			$variation->set_sku( wc_clean( $data['sku'] ) );
		}

		// Thumbnail.
		if ( isset( $data['image'] ) && is_array( $data['image'] ) ) {
			$image = current( $data['image'] );
			if ( is_array( $image ) ) {
				$image['position'] = 0;
			}

			$variation = $this->save_product_images( $variation, array( $image ) );
		}

		// Virtual variation.
		if ( isset( $data['virtual'] ) ) {
			$variation->set_virtual( $data['virtual'] );
		}

		// Downloadable variation.
		if ( isset( $data['downloadable'] ) ) {
			$is_downloadable = $data['downloadable'];
			$variation->set_downloadable( $is_downloadable );
		} else {
			$is_downloadable = $variation->get_downloadable();
		}

		// Downloads.
		if ( $is_downloadable ) {
			// Downloadable files.
			if ( isset( $data['downloads'] ) && is_array( $data['downloads'] ) ) {
				$variation = $this->save_downloadable_files( $variation, $data['downloads'] );
			}

			// Download limit.
			if ( isset( $data['download_limit'] ) ) {
				$variation->set_download_limit( $data['download_limit'] );
			}

			// Download expiry.
			if ( isset( $data['download_expiry'] ) ) {
				$variation->set_download_expiry( $data['download_expiry'] );
			}
		}

		// Shipping data.
		$variation = $this->save_product_shipping_data( $variation, $data );

		// Stock handling.
		$manage_stock = (bool) $variation->get_manage_stock();
		if ( isset( $data['managing_stock'] ) ) {
			$manage_stock = $data['managing_stock'];
		}
		$variation->set_manage_stock( $manage_stock );

		$stock_status = $variation->get_stock_status();
		if ( isset( $data['in_stock'] ) ) {
			$stock_status = true === $data['in_stock'] ? 'instock' : 'outofstock';
		}
		$variation->set_stock_status( $stock_status );

		$backorders = $variation->get_backorders();
		if ( isset( $data['backorders'] ) ) {
			$backorders = $data['backorders'];
		}
		$variation->set_backorders( $backorders );

		if ( $manage_stock ) {
			if ( isset( $data['stock_quantity'] ) ) {
				$variation->set_stock_quantity( $data['stock_quantity'] );
			} elseif ( isset( $data['inventory_delta'] ) ) {
				$stock_quantity  = wc_stock_amount( $variation->get_stock_quantity() );
				$stock_quantity += wc_stock_amount( $data['inventory_delta'] );
				$variation->set_stock_quantity( $stock_quantity );
			}
		} else {
			$variation->set_backorders( 'no' );
			$variation->set_stock_quantity( '' );
		}

		// Regular Price.
		if ( isset( $data['regular_price'] ) ) {
			$variation->set_regular_price( $data['regular_price'] );
		}

		// Sale Price.
		if ( isset( $data['sale_price'] ) ) {
			$variation->set_sale_price( $data['sale_price'] );
		}

		if ( isset( $data['sale_price_dates_from'] ) ) {
			$variation->set_date_on_sale_from( $data['sale_price_dates_from'] );
		}

		if ( isset( $data['sale_price_dates_to'] ) ) {
			$variation->set_date_on_sale_to( $data['sale_price_dates_to'] );
		}

		// Tax class.
		if ( isset( $data['tax_class'] ) ) {
			$variation->set_tax_class( $data['tax_class'] );
		}

		// Description.
		if ( isset( $data['description'] ) ) {
			$variation->set_description( wp_kses_post( $data['description'] ) );
		}

		// Update taxonomies.
		if ( isset( $data['attributes'] ) ) {
			$_attributes = array();

			foreach ( $data['attributes'] as $attribute_key => $attribute ) {
				if ( ! isset( $attribute['name'] ) ) {
					continue;
				}

				$taxonomy   = 0;
				$_attribute = array();

				if ( isset( $attribute['slug'] ) ) {
					$taxonomy = $this->get_attribute_taxonomy_by_slug( $attribute['slug'] );
				}

				if ( ! $taxonomy ) {
					$taxonomy = sanitize_title( $attribute['name'] );
				}

				if ( isset( $attributes[ $taxonomy ] ) ) {
					$_attribute = $attributes[ $taxonomy ];
				}

				if ( isset( $_attribute['is_variation'] ) && $_attribute['is_variation'] ) {
					$_attribute_key = sanitize_title( $_attribute['name'] );

					if ( isset( $_attribute['is_taxonomy'] ) && $_attribute['is_taxonomy'] ) {
						// Don't use wc_clean as it destroys sanitized characters.
						$_attribute_value = isset( $attribute['option'] ) ? sanitize_title( stripslashes( $attribute['option'] ) ) : '';
					} else {
						$_attribute_value = isset( $attribute['option'] ) ? wc_clean( stripslashes( $attribute['option'] ) ) : '';
					}

					$_attributes[ $_attribute_key ] = $_attribute_value;
				}
			}

			$variation->set_attributes( $_attributes );
		}

		$variation->save();

		do_action( 'woocommerce_api_save_product_variation', $variation_id, $menu_order, $variation );
	}

	return true;
}