簡體   English   中英

如何通過sku直接更新WooCommerce產品庫存數量

[英]How to directly update WooCommerce product stock quantity by its sku

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 元密鑰 元值
10 _sku A B C D
10 _股票 25

您可以使用嵌入在 function 中的以下 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文件。 測試和工作。

相關: 如何在 SQL 服務器中使用 JOIN 執行 UPDATE 語句?

您需要先發布 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`" );
}

親愛的試試這個代碼它會工作

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM