Création d’une variation de produit dans Shopify à partir d’une application Laravel
Après la connexion et la récupération des données d’un produit, il est temps d’ajouter une variation à ce dernier, pour cela nous allons utiliser une nouvelle fonction avec une requête équivalente à la précédente mais un peu plus complexe.
public function setVariant(VariantsRequest $request) {
$shop = $request->user();
$data = $request->validated();
$productId = $data['productId'];
$option1 = $data['valeur_1'];
$option2 = $data['valeur_2'];
$price = 12;
$variants = [];
$variants['optionValues'] = [
['optionName' => 'option 1', 'name' => $option1],
['optionName' => 'option 2', 'name' => $option2]
];
$variants['price'] = $price;
// If stock not tracked
$variants['inventoryItem'] = ['tracked' => false];
// If stock is tracked
$variants['inventoryItem'] = ['tracked' => true];
$variants['inventoryQuantities'] = [
['availableQuantity' => 5, 'locationId' => 'gid://shopify/Location/1541541541'],
];
$token = $this->functions->decryptString($shop->access_token);
$queryString = <<<QUERY
mutation productVariantsBulkCreate(\$productId: ID!, \$variants: [ProductVariantsBulkInput!]!) {
productVariantsBulkCreate(productId: \$productId, variants: \$variants) {
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
productVariants {
id
title
selectedOptions {
name
value
}
}
}
}
QUERY;
$variables = [
"productId" => 'gid://shopify/Product/'.$productId,
"variants" => $variants,
];
$url = 'https://'.$shop->name.'/admin/api/'.env('SHOPIFY_API_VERSION').'/graphql.json';
$options = array(CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'X-Shopify-Access-Token: '.$token));
$post_parameters = array('query' => $queryString, 'variables' => $variables);
$result = AiCurl::sendRequest($url, array(), true, $post_parameters, $options, true);
dd($result);
}
Cette fonction est donc appelée avec 3 variables :
{"productId":"7615721668687","valeur_1":"valeur 1 2","valeur_2":"valeur 2 2"}
Le format des variables est vérifié via un fichier request, si tout se passe bien les variables sont passées, sinon une erreur est retournée à l’utilisateur.
Ensuite il est nécessaire de construire notre tableau variants grâce au code suivant :
$variants = [];
$variants['optionValues'] = [
['optionName' => 'option 1', 'name' => $option1],
['optionName' => 'option 2', 'name' => $option2]
];
$variants['price'] = $price;
// If stock not tracked
$variants['inventoryItem'] = ['tracked' => false];
// If stock is tracked
$variants['inventoryItem'] = ['tracked' => true];
$variants['inventoryQuantities'] = [
['availableQuantity' => 5, 'locationId' => 'gid://shopify/Location/1541541541'],
];
Nous définissons donc un tableau qui va contenir plusieurs données, la liste est non exhaustive.
Il faut impérativement définir les composantes de la variation, pour cela il faut donc des couples optionName (nom de l’option) et name (valeur de l’option)
Ensuite on donne un prix (facultatif) price.
Puis il est important d’indiquer, si le stock n’est pas géré, le paramètre inventoryItem avec tracked à false, sinon par défaut le stock sera considéré comme géré avec une valeur à 0 ce qui bloquera la commande de la variation.
Enfin si on souhaite indiquer la quantité en stock, il faut utiliser le paramètre inventoryQuantities avec le couple availableQuantity, locationId qui sont impératifs.
On appelle donc l’url concernée en passant le token dans le header, si l’opération se déroule correctement, le résultat devrait être de la forme :
array:2 [ // app\Http\Controllers\ProductsVariantsController.php:143
"data" => array:1 [
"productVariantsBulkCreate" => array:2 [
"product" => array:2 [
"id" => "gid://shopify/Product/7615721668687"
"options" => array:2 [
0 => array:5 [
"id" => "gid://shopify/ProductOption/9935701213263"
"name" => "option 1"
"values" => array:2 [
0 => "valeur 1 1"
1 => "valeur 1 2"
]
"position" => 1
"optionValues" => array:2 [
0 => array:3 [
"id" => "gid://shopify/ProductOptionValue/2929305780303"
"name" => "valeur 1 1"
"hasVariants" => true
]
1 => array:3 [
"id" => "gid://shopify/ProductOptionValue/2929693491279"
"name" => "valeur 1 2"
"hasVariants" => true
]
]
]
1 => array:5 [
"id" => "gid://shopify/ProductOption/9935701246031"
"name" => "option 2"
"values" => array:2 [
0 => "valeur 2 1"
1 => "valeur 2 2"
]
"position" => 2
"optionValues" => array:2 [
0 => array:3 [
"id" => "gid://shopify/ProductOptionValue/2929305813071"
"name" => "valeur 2 1"
"hasVariants" => true
]
1 => array:3 [
"id" => "gid://shopify/ProductOptionValue/2929693524047"
"name" => "valeur 2 2"
"hasVariants" => true
]
]
]
]
]
"productVariants" => array:1 [
0 => array:3 [
"id" => "gid://shopify/ProductVariant/42244012408911"
"title" => "valeur 1 2 / valeur 2 2"
"selectedOptions" => array:2 [
0 => array:2 [
"name" => "option 1"
"value" => "valeur 1 2"
]
1 => array:2 [
"name" => "option 2"
"value" => "valeur 2 2"
]
]
]
]
]
]
"extensions" => array:1 [
"cost" => array:3 [
"requestedQueryCost" => 13
"actualQueryCost" => 13
"throttleStatus" => array:3 [
"maximumAvailable" => 2000.0
"currentlyAvailable" => 1987
"restoreRate" => 100.0
]
]
]
]
La variation est créée, si on va sur la page de notre produit, elle est apparue :

Nous avons créé notre première variation.