php 代码段破坏了网站

我的产品有一个自定义的 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 product

foreach ($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);   

}

}

请检查我做错了什么。


慕容森
浏览 106回答 1
1回答

湖上湖

为什么你必须在每个请求上运行这个函数?当然,您的代码可以杀死您的服务器,它会为管理员或前端的每个请求触发,它的查询和循环遍历所有帖子,然后更新所有产品帖子,你应该把它挂在某个地方,比如在创建/更新帖子时结帐save_post功能//Your function to update the metafunction 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/createdfunction _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 placeadd_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    }});
打开App,查看更多内容
随时随地看视频慕课网APP