亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

php 代碼段破壞了網站

php 代碼段破壞了網站

PHP
慕容森 2021-11-13 16:35:45
我的產品有一個自定義的 meta 'wccaf_virtual_quantity'。現在我想計算并添加另一個自定義元“actual_stock”。'actual_stock'= 的值stock-wccaf_virtual_quantity 我正在嘗試的代碼破壞了我的網站 它'The site is experiencing technical difficulties. Please check your site admin email inbox for instructions.'在訪問管理面板時出現錯誤。但是當我從數據庫中禁用代碼并檢查產品表時'actual_stock',我可以看到 的值'actual_stock'已更新。這意味著代碼可以正常工作,但它會破壞正在處理的站點。我嘗試將以下代碼添加到functions.php. 我正在使用“代碼片段”插件添加 php 片段$args = array(    'post_type' => 'product',    'posts_per_page' => -1,);$products_array = get_posts($args);if (!empty($products_array)) {// loop through each productforeach ($products_array as $product){    update_actual_stock($product->ID);}}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);   }}請檢查我做錯了什么。
查看完整描述

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

    }

});


查看完整回答
反對 回復 2021-11-13
  • 1 回答
  • 0 關注
  • 118 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號