Функция, которая получает количество товара из продукта в WooCommerce.
Я пытаюсь создать функцию, которая извлекает количество товара из продукта в 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 ответ
Вы говорите, что хотите создать функцию, которая извлекает количество товара из продукта в 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 );
}
Код помещается в файл function.php активной дочерней темы (или активной темы). Это должно лучше работать.
Или вы можете просто использовать напрямую:
get_post_meta( $product_id, '_stock', true );
или же
get_post_meta( get_the_ID(), '_stock', true );