如何通过 sku 直接更新 WooCommerce 产品库存数量
How to directly update WooCommerce product stock quantity by its sku
A 有大量可变产品。我每 X 分钟使用一次 cron 运行 从外部源获取库存水平的脚本。如果我使用 wc_get_product_id_by_sku
和 update_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
您首先需要 post id 然后您可以更新股票价值。
先通过sku
得到postid
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`" );
}
亲爱的试试这个代码它会工作
您可以使用嵌入在函数中的以下 SQL 查询,该函数将根据产品 SKU 更新产品库存数量(table 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?
$wpdb
和 JOIN
工作速度太慢,所以最快的方法是使用四个单独的准备查询:
$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();
}
}
A 有大量可变产品。我每 X 分钟使用一次 cron 运行 从外部源获取库存水平的脚本。如果我使用 wc_get_product_id_by_sku
和 update_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 |
您首先需要 post id 然后您可以更新股票价值。 先通过sku
得到postidglobal $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`" );
}
亲爱的试试这个代码它会工作
您可以使用嵌入在函数中的以下 SQL 查询,该函数将根据产品 SKU 更新产品库存数量(table 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?
$wpdb
和 JOIN
工作速度太慢,所以最快的方法是使用四个单独的准备查询:
$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();
}
}