【问题标题】:How to directly update WooCommerce product stock quantity by its sku如何通过 sku 直接更新 WooCommerce 产品库存数量
【发布时间】:2021-06-07 23:34:27
【问题描述】:

A 有大量可变产品。我使用 cron 每 X 分钟运行一次脚本,以从外部来源获取库存水平。如果我使用wc_get_product_id_by_skuupdate_post_meta 需要很长时间,所以我试图找到使用自定义准备查询的方法。 如果我知道product_id 查询会是这样的:

$conn->prepare( "UPDATE wp_postmeta SET meta_value=? WHERE post_id=? AND meta_key=`_stock`" );

但我只知道一个产品 SKU。那么如何根据产品 SKU 修改此查询以更新 _stock

post_id meta_key meta_value
10 _sku ABCD
10 _stock 25

【问题讨论】:

    标签: php sql wordpress woocommerce product


    【解决方案1】:

    您可以使用嵌入在函数中的以下 SQL 查询,该函数将根据产品 SKU 更新产品库存数量(表 wp_wc_product_meta_lookup 也需要更新)

    /*
     * Update stock quatity from a product sku
     *
     * @param int $stock_qty The new stock quatity
     * @param int $sku The product sku
     * @return int/null
     */
    function update_stock_qty_from_product_sku( $stock_qty, $sku ) {
        global $wpdb;
    
        return $wpdb->query( $wpdb->prepare( "
            UPDATE {$wpdb->prefix}postmeta pm1
            INNER JOIN {$wpdb->prefix}postmeta pm2
                ON pm1.post_id =  pm2.post_id
            INNER JOIN {$wpdb->prefix}wc_product_meta_lookup pml
                ON pm1.post_id =  pml.product_id
            SET pm1.meta_value = %d, pml.stock_quantity = %d
            WHERE pm1.meta_key = '_stock'
                AND pm2.meta_key = '_sku'
                AND pm2.meta_value = '%s'
        ", $stock_qty, $stock_qty, $sku ) );
    }
    
    

    代码进入活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

    相关: How can I do an UPDATE statement with JOIN in SQL Server?

    【讨论】:

    • @fiter 抱歉,我目前没有更好的方法,但它比你使用的方式更快……别忘了你也需要更新wp_wc_product_meta_lookup 表……
    【解决方案2】:

    您需要先发布 id,然后才能更新股票价值。 先通过sku获取post id

    global $wpdb;
    $productId = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku ) );
    

    我们将获得产品 ID,然后猜测 $productValue = 50;那么

    if ( $product_id )
    {
    $wpdb->prepare( "UPDATE wp_postmeta SET meta_value=".$productValue." WHERE post_id=".$productId." AND meta_key=`_stock`" );
    }
    

    亲爱的试试这段代码,它会起作用的

    【讨论】:

      【解决方案3】:

      $wpdbJOIN 工作太慢,所以最快的方法是使用四个单独的准备好的查询:

      $conn = mysqli_init();
      mysqli_real_connect( $conn, DB_HOST, DB_USER, DB_PASSWORD, DB_NAME );
      
      // Get product ID by SKU
      $stmt1 = $conn->prepare( "SELECT post_id FROM {$wpdb->prefix}postmeta WHERE meta_key = '_sku' AND meta_value = ?");
      
      // Update stock level on postmeta table
      $stmt2 = $conn->prepare( "UPDATE {$wpdb->prefix}postmeta SET meta_value = ? WHERE meta_key = '_stock' AND post_id = ?");
      
      // Update stock data on wc_product_meta_lookup table
      $stmt3 = $conn->prepare( "UPDATE {$wpdb->prefix}wc_product_meta_lookup SET stock_quantity = ?, stock_status = ? WHERE product_id = ?");
      
      // Update stock status on postmeta table
      $stmt4 = $conn->prepare( "UPDATE {$wpdb->prefix}postmeta SET meta_value = ? WHERE meta_key = '_stock_status' AND post_id = ?");
      
      foreach ( $products as $product ) {
          $qty        = $product['ON_HAND'];
          $sku        = $product['PRODUCT_SKU'];
          $status     = $qty ? 'instock' : 'onbackorder';
      
          // Get product ID by SKU
          $stmt1->bind_param( "s", $sku );
          $stmt1->execute();
      
          $res = $stmt1->get_result();
                  
          while ( $row = $res->fetch_assoc() ) {
      
              $id = $row['post_id'];
      
              // Update stock level on postmeta table
              $stmt2->bind_param( "dd", $qty, $id );
              $stmt2->execute();
      
              // Update stock data on wc_product_meta_lookup table
              $stmt3->bind_param( "dsd", $qty, $status, $id );
              $stmt3->execute();
      
              // Update stock status on postmeta table
              $stmt4->bind_param( "sd", $status, $id );
              $stmt4->execute();
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-13
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多