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'] . '&rarr;' . $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) . '&rarr;' . $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;
}