這裡會有到同步庫存的技術API Hook的方式去達成庫存同步
先到api2網站啟用 REST API
wp-admin/admin.php?page=wc-settings&tab=advanced§ion=keys
接著再使用function即可達成同步
function sync_product_stock_to_api2( $product_id, $product ) {
// 取得商品 SKU 與庫存數量
$sku = $product->get_sku();
$stock_quantity = $product->get_stock_quantity();
if ( empty( $sku ) ) {
return;
}
// API2 設定
$api2_url = 'https://api2.yoursite.com/wp-json/wc/v3/products';
$consumer_key = 'ck_key';
$consumer_secret = 'cs_secret';
// 利用 SKU 先查詢 API2 中是否已存在該商品
$search_url = $api2_url . '?sku=' . urlencode( $sku );
$args = array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode( $consumer_key . ':' . $consumer_secret )
)
);
$response = wp_remote_get( $search_url, $args );
if ( is_wp_error( $response ) ) {
error_log( 'API2 查詢錯誤:' . $response->get_error_message() );
return;
}
$body = wp_remote_retrieve_body( $response );
$data = json_decode( $body, true );
// 準備要更新或建立的資料,這邊只同步庫存相關資訊
$update_data = array(
'manage_stock' => true,
'stock_quantity'=> $stock_quantity,
);
// 若存在則更新,否則建立新商品(這裡僅示範庫存部分,同步其他欄位可自行擴充)
if ( ! empty( $data ) && is_array( $data ) ) {
// 假設 SKU 為唯一值,取第一筆商品進行更新
$product_api2_id = $data[0]['id'];
$update_url = $api2_url . '/' . $product_api2_id;
$args = array(
'method' => 'PUT',
'headers' => array(
'Content-Type' => 'application/json',
'Authorization' => 'Basic ' . base64_encode( $consumer_key . ':' . $consumer_secret )
),
'body' => json_encode( $update_data )
);
$update_response = wp_remote_request( $update_url, $args );
if ( is_wp_error( $update_response ) ) {
error_log( 'API2 更新錯誤:' . $update_response->get_error_message() );
}
} else {
// 若不存在則建立新商品,這裡僅以 SKU 與庫存建立
$new_product_data = array_merge(
array(
'sku' => $sku,
),
$update_data
);
$args = array(
'method' => 'POST',
'headers' => array(
'Content-Type' => 'application/json',
'Authorization' => 'Basic ' . base64_encode( $consumer_key . ':' . $consumer_secret )
),
'body' => json_encode( $new_product_data )
);
$create_response = wp_remote_post( $api2_url, $args );
if ( is_wp_error( $create_response ) ) {
error_log( 'API2 建立商品錯誤:' . $create_response->get_error_message() );
}
}
}
// 當商品更新時觸發 hook,注意這個 hook 會傳入商品 ID 與 WC_Product 物件
add_action( 'woocommerce_update_product', 'sync_product_stock_to_api2', 10, 2 );
成功的效果就是當api有庫存變動,api2的庫存也會跟著連動,這裡是用sku就同步的依據