Je dois définir plus de 10000 variantes de produit sur non taxables dans Shopify à l'aide du joyau Ruby shopify_api
.
J'ai essayé:
NoMethodError: undefined method `update_all' for ShopifyAPI::Variant:Class from (irb):1 from /var/lib/gems/2.3.0/gems/shopify_api_console-2.0.0/lib/shopify_api_console/console.rb:156:in `launch_shell' from /var/lib/gems/2.3.0/gems/shopify_api_console-2.0.0/lib/shopify_api_console/console.rb:113:in `console' from /var/lib/gems/2.3.0/gems/thor-0.18.1/lib/thor/command.rb:27:in `run' from /var/lib/gems/2.3.0/gems/thor-0.18.1/lib/thor/invocation.rb:120:in `invoke_command' from /var/lib/gems/2.3.0/gems/thor-0.18.1/lib/thor.rb:363:in `dispatch' from /var/lib/gems/2.3.0/gems/thor-0.18.1/lib/thor/base.rb:439:in `start' from /var/lib/gems/2.3.0/gems/shopify_api_console-2.0.0/bin/shopify-api:4:in `<top (required)>' from /usr/local/bin/shopify-api:22:in `load' from /usr/local/bin/shopify-api:22:in `<main>'
mais j'obtiens le message d'erreur:
irb(main):001:0> ShopifyAPI::Variant.update_all(taxable: false)
3 Réponses :
Vous devez probablement parcourir une collection. Je pense que cela devrait fonctionner, et pour éviter la limite de débit API, vous pouvez dormir tous les 1000 appels.
variants = ShopifyAPI::Variant.find(:all) variants.each_with_index do |v, call_counter| if call_counter % 1000 == 0 sleep 1 # sleep 1 second every 1000 calls end v.taxable = false v.save end
shopify_app
gem utilise Active Resource
.
Vous pouvez consulter son wiki pour voir quelles méthodes sont prises en charge ( update_all
n'en fait pas partie). Pour autant que je sache (mais je suis relativement nouveau dans l'utilisation de Shopify), vous ne pouvez pas mettre à jour en masse 10.000 produits. Il existe un inventaireBulkAdjustQuantityAtLocation, mais il est uniquement destiné à l'inventaire.
Vous devez effectuer plusieurs appels et vous devez faire attention à limitation de débit .
Pour mettre à jour les variantes de produit, essayez ceci:
products = ShopifyAPI::Product.find(:all, params: { limit: 50 }) while products.next_page? products = products.fetch_next_page products.each do |p| product = ShopifyAPI::Product.find(p.id) product.variants.each do |v| v.taxable = false end product.save end end
À partir de la version de l'API 2019-10
, voici comment paginer les résultats:
page = 1 count = ShopifyAPI::Product.count # Get total number of products if count > 0 page += count.divmod(250).first while page > 0 products = ShopifyAPI::Product.find(:all, params: {limit: 250, page: page}) products.each do |p| product = ShopifyAPI::Product.find(p.id) product.variants.each do |v| v.taxable = false end product.save end page -= 1 end end
Je pense que cela mettra à jour un produit avec toutes ses variantes. Utilisation du commentaire de David et du post .
Cette boucle ne fonctionnera pas car elle s'arrête après 250 produits. Pour faire tous vos produits, vous inspectez l'en-tête de réponse, extrayez les paramètres de pagination et utilisez ceux-ci pour parcourir vos produits.
@DavidLazar merci pour la tête! Et maintenant?
Ce code est obsolète et cessera probablement de fonctionner de sitôt. Vous devez utiliser la pagination. L'ajustement à la pagination demande très peu d'efforts et vous bénéficierez d'un code qui fonctionnera beaucoup plus longtemps. help.shopify.com/en/api/guides/paginated-rest- résultats
@DavidLazar J'ai mis à jour ma réponse. Est-ce ainsi que vous procéderiez pour mettre cela en œuvre?
Non ... voyez ma réponse. Votre code appelle les produits que vous avez déjà récupérés, ce qui garantit que ce sera très lent comme la mélasse.
Ce code est meilleur ...
products = ShopifyAPI::Product.find(:all) process_products(products) while products.next_page? products = products.fetch_next_page process_products(products) end def process_products(products) products.each do |product| # do something with product end rescue StandardError => e puts "Process failed #{e.message} #{e.backtrace}" end