function deleteProductById($productId) { // Convert numeric ID to Shopify GID if necessary if (strpos($productId, 'gid://shopify/Product/') === false) { $productId = 'gid://shopify/Product/' . $productId; } $query = <<<'GRAPHQL' mutation DeleteProduct($id: ID!) { productDelete(input: {id: $id}) { deletedProductId userErrors { field message } } } GRAPHQL; $variables = [ 'id' => $productId ]; $gql_query = [ 'query' => $query, 'variables' => $variables ]; $fullURL = $this->shopifyStoreURL . '/graphql.json'; $curl = curl_init($fullURL); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_MAXREDIRS, 3); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $request_headers = []; $request_headers[] = 'Content-Type: application/json'; $request_headers[] = 'Accept: application/json'; if (!is_null($this->accessToken)) { $request_headers[] = 'X-Shopify-Access-Token: ' . $this->accessToken; } curl_setopt($curl, CURLOPT_HTTPHEADER, $request_headers); curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode($gql_query) ); curl_setopt($curl, CURLOPT_POST, true); $response = curl_exec($curl); if ($response === false) { echo "cURL ERROR deleting product " . $productId . ": " . curl_error($curl) . PHP_EOL; curl_close($curl); return false; } curl_close($curl); $responseJson = json_decode($response); /* * GraphQL-level errors */ if (isset($responseJson->errors)) { echo PHP_EOL; echo "GRAPHQL ERROR deleting product " . $productId . ":" . PHP_EOL; print_r($responseJson->errors); return false; } /* * Check response structure */ if ( !isset( $responseJson ->data ->productDelete ) ) { echo PHP_EOL; echo "INVALID DELETE RESPONSE for " . $productId . ":" . PHP_EOL; print_r($responseJson); return false; } $deleteResult = $responseJson ->data ->productDelete; /* * Shopify user errors */ if ( isset($deleteResult->userErrors) && count($deleteResult->userErrors) > 0 ) { echo PHP_EOL; echo "SHOPIFY ERROR deleting product " . $productId . ":" . PHP_EOL; foreach ( $deleteResult->userErrors as $error ) { echo " "; if ( isset($error->field) ) { echo implode( '.', $error->field ); echo ": "; } echo $error->message . PHP_EOL; } return false; } /* * Successful deletion */ if ( isset( $deleteResult->deletedProductId ) && $deleteResult->deletedProductId !== null ) { echo "DELETED: " . $deleteResult->deletedProductId . PHP_EOL; return true; } echo "Product was not deleted: " . $productId . PHP_EOL; return false; }