Функция, которая получает количество товара из продукта в WooCommerce. - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь создать функцию, которая извлекает количество товара из продукта в WooCommerce.Если я закомментирую следующую строку, код запускается, но если я оставлю его внутри, я получу белый экран: $ product = is_a ($ product, 'WC_Product')?$ product: wc_get_product ($ product_id);

Есть идеи, что я здесь не так делаю?

function wc_get_variable_product_stock_quantity( $output = 'raw', $product_id = 0 ){
    global $wpdb, $product;

    // Get the product ID (can be defined)
    $product_id = $product_id > 0 ? $product_id : get_the_id();

    // Check and get the instance of the WC_Product Object
    $product = is_a( $product, 'WC_Product' ) ? $product : wc_get_product($product_id);
    $stock_quantity = $product->get_stock_quantity();

    return $stock_quantity;

}

РЕДАКТИРОВАТЬ (ОБНОВИТЬ):

Мой конеццель состоит в том, чтобы суммировать количество запаса для всех вариантов после изменения статуса заказа, чтобы завершить, а затем записать итоговое значение в количество запаса родительского продукта, чтобы общее количество запаса всегда было актуальным.

Мой упрощенный пример выше долженфактически выглядит как приведенный ниже код, в основном основанный на " Получите общий запас всех вариантов из переменного продукта в коде Woocommerce " со светлыми изменениями (см. дополнительный оператор SQL) :

    function wc_get_variable_product_stock_quantity( $output = 'raw', $product_id = 0 ){
        global $wpdb, $product;

        // Get the product ID (can be defined)
        $product_id = $product_id > 0 ? $product_id : get_the_id();

        // Check and get the instance of the WC_Product Object
        $product = is_a( $product, 'WC_Product' ) ? $product : wc_get_product($product_id);
        // Get the stock quantity sum of all product variations (children)
        $stock_quantity = $wpdb->get_var("
            SELECT SUM(pm.meta_value)
            FROM {$wpdb->prefix}posts as p
            JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
            WHERE p.post_type = 'product_variation'
            AND p.post_status = 'publish'
            AND p.post_parent = '$product_id'
            AND pm.meta_key = '_stock'
            AND pm.meta_value IS NOT NULL
        ");   
        return $stock_quantity;
    }


// Update stock totals for parent product when order status changes to completed...
function mysite_woocommerce_order_status_completed( $order_id ) {

    // For each item in the order, calculate the total stock quantity for all variations and write the total to the parent products's stock quantity
    $order = wc_get_order( $order_id );
    $order_id = $order->get_id();

    $log_txt = '';
    $items = $order->get_items();
    foreach($items as $k=>$val){     
        $product_id = $val[‘product_id’];
        $total_stock_quantity = wc_get_variable_product_stock_quantity( 'raw', $product_id );
        $log_txt .= 'Product ID:'.$val['product_id'].', Name: '.$val['name'].', Total Stock: '.$total_stock_quantity.'\n<br>';
        // Next: add code to write the stock total to the parent product
    }
}

add_action( 'woocommerce_order_status_completed', 'mysite_woocommerce_order_status_completed', 10, 1 );

1 Ответ

0 голосов
/ 17 февраля 2019

Вы говорите, что хотите создать функцию, которая извлекает количество запаса из продукта в WooCommerce, поэтому , почему вы не используете непосредственно один из этих :

  • С помощьюДля экземпляра объекта продукта используйте метод WC_Product get_stock_quantity(),
  • или С идентификатором продукта используйте get_post_meta( $product_id, '_stock', true ).

Теперь, основываясь на " Получить общий запасиз всех вариаций от переменного продукта В ответе Woocommerce"ваш код содержит некоторые ненужные вещи и может быть выполнен по-другому гораздо более легким, компактным и рабочим способом:

function wc_get_variable_product_stock_quantity( $product_id = 0 ){
    // Get the product ID (can be defined)
    $product_id = $product_id > 0 ? $product_id : get_the_ID();

    return get_post_meta( $product_id, '_stock', true );
}

Код входит в функциюФайл .php активной дочерней темы (или активной темы).Это должно лучше работать.

Или вы можете просто использовать напрямую:

get_post_meta( $product_id, '_stock', true );

или

get_post_meta( get_the_ID(), '_stock', true );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...