1

Shopify に統合された PHP アプリケーションに取り組んでいます。基本的に商品情報は「ショップ」とアプリ間で同期する必要があります。製品内にはバリアントがあります (サブ製品に似ています)。Shopify は、これらの変更を報告するために、json データを含む Webhook を送信していました。バリアントを変更/追加/削除するたびに、shopify は json コンテンツのみを変更する「製品更新」Webhook を送信します。これは例です:

{
...
    "variants": [{
        "id": 279656846,
        "position": 1,
        "price": "80.00",
        "product_id": 123022448,
        "sku": "1000",
        "option1": "30 cm",
        "inventory_quantity": 10
    },
    {
        "id": 291321287,
        "position": 2,
        "price": "15.00",
        "product_id": 123022448,
        "sku": "1003",
        "option1": "15 cm",
        "inventory_quantity": 23
    }],
...
}

新しいバリアントを作成すると、現在のステータスを含む「製品の更新」が送信され、json に新しいバリアントが含まれます。同様に、削除すると、現在のステータスを含む「製品の更新」のみが送信されますが、json で削除されたバリアントは送信されません。

変更/追加のケースを適切に処理できる次のコードを作成しました。

foreach ($jsonArr['variants'] as $rows) {

    $variant = $rows['option1'];
    $sku = $rows['sku'];
    $salesPrice = $rows['price'];
    $stockQty = $rows['inventory_quantity'];

    $idVar = $rows['id'];

    $dupchk = mysql_query("SELECT * FROM `variants` WHERE `idVar`='$idVar'",$con) or die (mysql_error());
    $num_rows = mysql_num_rows($dupchk);

    if ($num_rows > 0) {

        $sql = "UPDATE `variants` SET `variant`='$variant',`sku`='$sku',`salesPrice`='$salesPrice',`stockQty`='$stockQty' WHERE `idVar`='$idVar'";

        if (!mysql_query($sql,$con)) {
            die('Error: ' . mysql_error());
        }

    }

    else {

        $sql = "INSERT INTO `variants`(`idVariant`, `idProduct`, `variant`, `sku`, `salesPrice`, `stockQty`, `comments`, `idVar`) VALUES ('','$idProduct','$variant','$sku','$salesPrice','$stockQty','','$idVar')";

        if (!mysql_query($sql,$con)) {
            die('Error: ' . mysql_error());
        }

    }

}

問題は、このコードが削除バリアントのケースを処理しないことです。私はそれをやろうとしましたが、今までは機能しない「大きな紛らわしい」コードしか作成していませんでした。それを処理するスマートな方法について何か提案があればアドバイスしてください。

4

1 に答える 1

0

解決するために、次のコードを使用しました:

//Variable to count variant update or create
$var_count = 0;

foreach ($jsonArr['variants'] as $rows) {

    $variant = $rows['option1'];
    $sku = $rows['sku'];
    $salesPrice = $rows['price'];
    $stockQty = $rows['inventory_quantity'];

    $idVar = $rows['id'];

    $dupchk = mysql_query("SELECT * FROM `variants` WHERE `idVar`='$idVar'",$con) or die (mysql_error());
    $num_rows = mysql_num_rows($dupchk);

    if ($num_rows > 0) {

        $sql = "UPDATE `variants` SET `variant`='$variant',`sku`='$sku',`salesPrice`='$salesPrice',`stockQty`='$stockQty' WHERE `idVar`='$idVar'";
        $var_count++;


        if (!mysql_query($sql,$con)) {
            die('Error: ' . mysql_error());
        }

    }

    else {

        $sql = "INSERT INTO `variants`(`idVariant`, `idProduct`, `variant`, `sku`, `salesPrice`, `stockQty`, `comments`, `idVar`) VALUES ('','$idProduct','$variant','$sku','$salesPrice','$stockQty','','$idVar')";
        $var_count++;

        if (!mysql_query($sql,$con)) {
            die('Error: ' . mysql_error());
        }

    }

}

//Start checking to erase variant if needed
$result = mysql_query("SELECT `idVar` FROM products NATURAL JOIN variants WHERE `idShopify`='$idShopify'",$con);
$num_rows = mysql_num_rows($result);

if ($num_rows>$var_count) {

    while($row = mysql_fetch_array($result))
        {

            $clear = 0;

            foreach ($jsonArr['variants'] as $rows) {

                if ($rows['id']==$row['idVar']) {
                    $clear++;
                }

            }

            if ($clear==0) {

                $idVar = $row['idVar'];
                $sql = "DELETE FROM `variants` WHERE `idVar`='$idVar'";

                if (!mysql_query($sql,$con)) {
                    die('Error: ' . mysql_error());
                }

            }

        }

}

これはエレガントではありませんが、うまくいきました。コードの改善を提案してください。

于 2013-04-22T22:39:03.013 に答える