Dodanie i usunięcie kategorii do produktu w zależności od ilości w magazynie

Poniższy kod umożliwia dodawanie kategorii do produktu i usuwanie kategorii z produktu w zależności o ilości produktu w magazynie. Skopiuj poniższy kod do pliku functions.php motywu.

Ustaw wymagane dla siebie parametry.  W przykładnie została użyta kategoria o identyfikatorze 38 i graniczna ilość produktu w magazynie: 10 (linia 116).

category_id = $category_id;
		$this->stock_level = $stock_level;
		add_action( 'woocommerce_product_set_stock', array( $this, 'woocommerce_product_set_stock' ) );
		add_action( 'woocommerce_variation_set_stock', array( $this, 'woocommerce_variation_set_stock' ) );
		add_action( 'woocommerce_process_product_meta_variable', array( $this, 'woocommerce_process_product_meta_variable' ) );
	}

	public function woocommerce_process_product_meta_variable( $product_id ) {
		/** @var WC_Product_Variable $product */
		$product = wc_get_product( $product_id );
		if ( 'yes' === get_option( 'woocommerce_manage_stock' ) ) {
			$managing_stock = true;
			$stock_quantity = 0;
			if ( !$product->managing_stock() ) {
				$available_variations = $product->get_available_variations();
				foreach ( $available_variations as $available_variation ) {
					$variation = wc_get_product( $available_variation['variation_id'] );
					if ( $variation->managing_stock() ) {
						$stock_quantity += $variation->get_stock_quantity();
					}
					else {
						$managing_stock = false;
					}
				}
			}
			if ( $managing_stock ) {
				$category_ids = $product->get_category_ids();
				if ( $stock_quantity <= $this->stock_level ) {
					if ( !in_array( $this->category_id, $category_ids ) ) {
						$category_ids[] = $this->category_id;
						$product->set_category_ids( $category_ids );
						$product->save();
					}
				}
				else {
					if ( in_array( $this->category_id, $category_ids ) ) {
						unset( $category_ids[array_search($this->category_id, $category_ids)] );
						$product->set_category_ids( $category_ids );
						$product->save();
					}
				}
			}
		}
	}

	/**
	 * @param WC_Product_Variation $variation
	 */
	public function woocommerce_variation_set_stock( $variation ) {
		/** @var WC_Product_Variable $product */
		$product = wc_get_product( $variation->get_parent_id() );
		$stock_quantity = 0;
		$available_variations = $product->get_available_variations();
		foreach ( $available_variations as $available_variation ) {
			$variation = wc_get_product( $available_variation['variation_id'] );
			if ( $variation->managing_stock() ) {
				$stock_quantity += $variation->get_stock_quantity();
			}
		}
		$category_ids = $product->get_category_ids();
		if ( $stock_quantity <= $this->stock_level ) {
			if ( !in_array( $this->category_id, $category_ids ) ) {
				$category_ids[] = $this->category_id;
				$product->set_category_ids( $category_ids );
				$product->save();
			}
		}
		else {
			if ( in_array( $this->category_id, $category_ids ) ) {
				unset( $category_ids[array_search($this->category_id, $category_ids)] );
				$product->set_category_ids( $category_ids );
				$product->save();
			}
		}
	}

	/**
	 * @param WC_Product $product
	 */
	public function woocommerce_product_set_stock( $product ) {
		$stock_quantity = $product->get_stock_quantity();
		$category_ids = $product->get_category_ids();
		if ( $stock_quantity <= $this->stock_level ) {
			if ( !in_array( $this->category_id, $category_ids ) ) {
				$category_ids[] = $this->category_id;
				$product->set_category_ids( $category_ids );
				$product->save();
			}
		}
		else {
			if ( in_array( $this->category_id, $category_ids ) ) {
				unset( $category_ids[array_search($this->category_id, $category_ids)] );
				$product->set_category_ids( $category_ids );
				$product->save();
			}
		}
	}

}
/**
 * Example
 * when stock quantity equals or is less than 10 add product to category with id 38
 * when stock is grater than 10 remove product from category with id 38
 */
new studiowp_product_category_on_stock_change( 38, 10 );

View the code on Gist.

Kopiując kod pomiń znacznik <?php - w większości przypadków nie ma potrzeby dodawania go do pliku functions.php. Jeżeli nie używasz motywu potomnego pamiętaj o tym, że zmiany wprowadzone do pliku functions.php zostaną nadpisane podczas aktualizacji motywu.

O grola

Pasjonat Wordpressa i WooCommerce od wielu lat. Autor wtyczek i krótkich snippetów usprawniających działanie Wordpressa i WooCommerce.

Pokaż wszystkie wpisy grola →