File "wc-stock-functions.php"
Full path: /home/kosmetik/public_html/wp-content/plugins/woocommerce/includes/wc-stock-functions.php
File
size: 9.13 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
defined('ABSPATH') || exit;
function wc_update_product_stock($product, $stock_quantity = null, $operation = 'set', $updating = false)
{
if (!is_a($product, 'WC_Product')) {
$product = wc_get_product($product);
}
if (!$product) {
return false;
}
if (!is_null($stock_quantity) && $product->managing_stock()) {
$product_id_with_stock = $product->get_stock_managed_by_id();
$product_with_stock = $product_id_with_stock !== $product->get_id() ? wc_get_product($product_id_with_stock) : $product;
$data_store = WC_Data_Store::load('product');
if ($product_with_stock->is_type('variation')) {
do_action('woocommerce_variation_before_set_stock', $product_with_stock);
} else {
do_action('woocommerce_product_before_set_stock', $product_with_stock);
}
$new_stock = $data_store->update_product_stock($product_id_with_stock, $stock_quantity, $operation);
$data_store->read_stock_quantity($product_with_stock, $new_stock);
if (!$updating) {
$product_with_stock->save();
}
if ($product_with_stock->is_type('variation')) {
do_action('woocommerce_variation_set_stock', $product_with_stock);
} else {
do_action('woocommerce_product_set_stock', $product_with_stock);
}
return $product_with_stock->get_stock_quantity();
}
return $product->get_stock_quantity();
}
function wc_update_product_stock_status($product_id, $status)
{
$product = wc_get_product($product_id);
if ($product) {
$product->set_stock_status($status);
$product->save();
}
}
function wc_maybe_reduce_stock_levels($order_id)
{
$order = wc_get_order($order_id);
if (!$order) {
return;
}
$stock_reduced = $order->get_data_store()->get_stock_reduced($order_id);
$trigger_reduce = apply_filters('woocommerce_payment_complete_reduce_order_stock', !$stock_reduced, $order_id);
if (!$trigger_reduce) {
return;
}
wc_reduce_stock_levels($order);
$order->get_data_store()->set_stock_reduced($order_id, true);
}
add_action('woocommerce_payment_complete', 'wc_maybe_reduce_stock_levels');
add_action('woocommerce_order_status_completed', 'wc_maybe_reduce_stock_levels');
add_action('woocommerce_order_status_processing', 'wc_maybe_reduce_stock_levels');
add_action('woocommerce_order_status_on-hold', 'wc_maybe_reduce_stock_levels');
function wc_maybe_increase_stock_levels($order_id)
{
$order = wc_get_order($order_id);
if (!$order) {
return;
}
$stock_reduced = $order->get_data_store()->get_stock_reduced($order_id);
$trigger_increase = (bool) $stock_reduced;
if (!$trigger_increase) {
return;
}
wc_increase_stock_levels($order);
$order->get_data_store()->set_stock_reduced($order_id, false);
}
add_action('woocommerce_order_status_cancelled', 'wc_maybe_increase_stock_levels');
add_action('woocommerce_order_status_pending', 'wc_maybe_increase_stock_levels');
function wc_reduce_stock_levels($order_id)
{
if (is_a($order_id, 'WC_Order')) {
$order = $order_id;
$order_id = $order->get_id();
} else {
$order = wc_get_order($order_id);
}
if (!$order || 'yes' !== get_option('woocommerce_manage_stock') || !apply_filters('woocommerce_can_reduce_order_stock', true, $order)) {
return;
}
$changes = array();
foreach ($order->get_items() as $item) {
if (!$item->is_type('line_item')) {
continue;
}
$product = $item->get_product();
$item_stock_reduced = $item->get_meta('_reduced_stock', true);
if ($item_stock_reduced || !$product || !$product->managing_stock()) {
continue;
}
$qty = apply_filters('woocommerce_order_item_quantity', $item->get_quantity(), $order, $item);
$item_name = $product->get_formatted_name();
$new_stock = wc_update_product_stock($product, $qty, 'decrease');
if (is_wp_error($new_stock)) {
$order->add_order_note(sprintf(__('Unable to reduce stock for item %s.', 'woocommerce'), $item_name));
continue;
}
$item->add_meta_data('_reduced_stock', $qty, true);
$item->save();
$changes[] = array('product' => $product, 'from' => $new_stock + $qty, 'to' => $new_stock);
}
wc_trigger_stock_change_notifications($order, $changes);
do_action('woocommerce_reduce_order_stock', $order);
}
function wc_trigger_stock_change_notifications($order, $changes)
{
if (empty($changes)) {
return;
}
$order_notes = array();
$no_stock_amount = absint(get_option('woocommerce_notify_no_stock_amount', 0));
foreach ($changes as $change) {
$order_notes[] = $change['product']->get_formatted_name() . ' ' . $change['from'] . '→' . $change['to'];
$low_stock_amount = absint(wc_get_low_stock_amount(wc_get_product($change['product']->get_id())));
if ($change['to'] <= $no_stock_amount) {
do_action('woocommerce_no_stock', wc_get_product($change['product']->get_id()));
} elseif ($change['to'] <= $low_stock_amount) {
do_action('woocommerce_low_stock', wc_get_product($change['product']->get_id()));
}
if ($change['to'] < 0) {
do_action('woocommerce_product_on_backorder', array('product' => wc_get_product($change['product']->get_id()), 'order_id' => $order->get_id(), 'quantity' => abs($change['from'] - $change['to'])));
}
}
$order->add_order_note(__('Stock levels reduced:', 'woocommerce') . ' ' . implode(', ', $order_notes));
}
function wc_increase_stock_levels($order_id)
{
if (is_a($order_id, 'WC_Order')) {
$order = $order_id;
$order_id = $order->get_id();
} else {
$order = wc_get_order($order_id);
}
if (!$order || 'yes' !== get_option('woocommerce_manage_stock') || !apply_filters('woocommerce_can_restore_order_stock', true, $order)) {
return;
}
$changes = array();
foreach ($order->get_items() as $item) {
if (!$item->is_type('line_item')) {
continue;
}
$product = $item->get_product();
$item_stock_reduced = $item->get_meta('_reduced_stock', true);
if (!$item_stock_reduced || !$product || !$product->managing_stock()) {
continue;
}
$item_name = $product->get_formatted_name();
$new_stock = wc_update_product_stock($product, $item_stock_reduced, 'increase');
if (is_wp_error($new_stock)) {
$order->add_order_note(sprintf(__('Unable to restore stock for item %s.', 'woocommerce'), $item_name));
continue;
}
$item->delete_meta_data('_reduced_stock');
$item->save();
$changes[] = $item_name . ' ' . ($new_stock - $item_stock_reduced) . '→' . $new_stock;
}
if ($changes) {
$order->add_order_note(__('Stock levels increased:', 'woocommerce') . ' ' . implode(', ', $changes));
}
do_action('woocommerce_restore_order_stock', $order);
}
function wc_get_held_stock_quantity(WC_Product $product, $exclude_order_id = 0)
{
if (!apply_filters('woocommerce_hold_stock_for_checkout', wc_string_to_bool(get_option('woocommerce_manage_stock', 'yes')))) {
return 0;
}
return (new \Automattic\WooCommerce\Checkout\Helpers\ReserveStock())->get_reserved_stock($product, $exclude_order_id);
}
function wc_reserve_stock_for_order($order)
{
if (!apply_filters('woocommerce_hold_stock_for_checkout', wc_string_to_bool(get_option('woocommerce_manage_stock', 'yes')))) {
return;
}
$order = $order instanceof WC_Order ? $order : wc_get_order($order);
if ($order) {
(new \Automattic\WooCommerce\Checkout\Helpers\ReserveStock())->reserve_stock_for_order($order);
}
}
add_action('woocommerce_checkout_order_created', 'wc_reserve_stock_for_order');
function wc_release_stock_for_order($order)
{
if (!apply_filters('woocommerce_hold_stock_for_checkout', wc_string_to_bool(get_option('woocommerce_manage_stock', 'yes')))) {
return;
}
$order = $order instanceof WC_Order ? $order : wc_get_order($order);
if ($order) {
(new \Automattic\WooCommerce\Checkout\Helpers\ReserveStock())->release_stock_for_order($order);
}
}
add_action('woocommerce_checkout_order_exception', 'wc_release_stock_for_order');
add_action('woocommerce_payment_complete', 'wc_release_stock_for_order', 11);
add_action('woocommerce_order_status_cancelled', 'wc_release_stock_for_order', 11);
add_action('woocommerce_order_status_completed', 'wc_release_stock_for_order', 11);
add_action('woocommerce_order_status_processing', 'wc_release_stock_for_order', 11);
add_action('woocommerce_order_status_on-hold', 'wc_release_stock_for_order', 11);
function wc_get_low_stock_amount(WC_Product $product)
{
$low_stock_amount = $product->get_low_stock_amount();
if ('' === $low_stock_amount && $product->is_type('variation')) {
$product = wc_get_product($product->get_parent_id());
$low_stock_amount = $product->get_low_stock_amount();
}
if ('' === $low_stock_amount) {
$low_stock_amount = get_option('woocommerce_notify_low_stock_amount', 2);
}
return (int) $low_stock_amount;
}