1
votes

Comment définir tous les produits comme impossibles à taxer dans Shopify à l'aide de la gemme Shopify_api Ruby?

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)


0 commentaires

3 Réponses :


0
votes

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


0 commentaires

1
votes

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 .


5 commentaires

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.



1
votes

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 


0 commentaires