WooCommerce同步庫存

這裡會有到同步庫存的技術API Hook的方式去達成庫存同步

先到api2網站啟用 REST API

wp-admin/admin.php?page=wc-settings&tab=advanced&section=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就同步的依據

瀏覽次數:21