1 回答

TA貢獻2003條經驗 獲得超2個贊
為什么你必須在每個請求上運行這個函數?
當然,您的代碼可以殺死您的服務器,它會為管理員或前端的每個請求觸發,它的查詢和循環遍歷所有帖子,然后更新所有產品帖子,
你應該把它掛在某個地方,比如在創建/更新帖子時
結帳save_post功能
//Your function to update the meta
function update_actual_stock($post_id) {
$post_type = get_post_type($post_id);
if ($post_type == 'product') {
$product = wc_get_product($post_id);
$virtual_stock = get_post_meta( $post_id, 'wccaf_virtual_quantity', true );
$visible_stock = $product->get_stock_quantity();
$actual_quantity = $visible_stock - $virtual_stock;
update_post_meta( $post_id, 'actual_stock',$actual_quantity);
}
}
// hook it on 'save_post' action hook so it only updates meta of specific post if its updated/created
function _update_blabla_meta( $post_id ) {
update_actual_stock($post_id)
}
add_action( 'save_post', '_update_blabla_meta' );
如果您需要在下訂單后運行您的功能,您必須將其掛鉤woocommerce_checkout_order_processed,有三個參數傳遞給該操作,do_action( 'woocommerce_checkout_order_processed', $order_id, $posted_data, $order );供您獲取要更新的帖子
檢查這里的代碼https://docs.woocommerce.com/wc-apidocs/source-class-WC_Checkout.html#1120
編輯....
這應該可以實現您想要的,或者只是修改它以滿足您的需求;
//run meta update on products only after order is place
add_action( 'woocommerce_checkout_order_processed', function($order_id) {
$order = wc_get_order( $order_id ); // get the order from ID
$items = $order->get_items(); // get order items
//Loop through order each items
foreach ( $items as $item ) {
$porduct_id = $item->get_product_id(); //get the product ID from order item
$virtual_stock = get_post_meta( $porduct_id, 'wccaf_virtual_quantity', true ); // get your own meta value
$visible_stock = get_post_meta( $porduct_id, '_stock', true ); // get the product current stock count
$actual_quantity = $visible_stock - $virtual_stock;
update_post_meta( $porduct_id, 'actual_stock', $actual_quantity); // Update your own meta
}
});
- 1 回答
- 0 關注
- 118 瀏覽
添加回答
舉報