Erhalten Sie alle Woocommerce-Bestellungen über die Python-API

Lesezeit: 3 Minuten

Ich möchte alle Bestellungen aus der WooCommerce-API über ein Python-Skript exportieren.

Ich habe die befolgt

Authentifizierungsprozess

und ich habe die Methode verwendet, um die beschriebenen Befehle zu erhalten
Hier. Mein Code sieht wie folgt aus:

wcapi = API(
        url = "url",
        consumer_key = consumerkey,
        consumer_secret = consumersecret
)
r = wcapi.get('orders')
r = r.json()
r = r['orders']
print(len(r))        # output: 8

Dies gibt die letzten 8 Bestellungen aus, aber ich möchte auf alle zugreifen. Derzeit werden über WooCommerce über 200 Bestellungen aufgegeben. Wie kann ich auf alle Bestellungen zugreifen?

Bitte sagen Sie mir, dass ich etwas Einfaches vermisse. Mein ultimatives Ziel ist es, diese Bestellungen automatisch abzurufen, zu transformieren und dann in ein Visualisierungstool hochzuladen. Alle Eingaben sind willkommen.

Erste: Initialisieren Sie Ihre API (wie Sie es getan haben).

wcapi = API(
        url=eshop.url,
        consumer_key=eshop.consumer_key,
        consumer_secret=eshop.consumer_secret,
        wp_api=True,
        version="wc/v2",
        query_string_auth=True,
        verify_ssl = True,
        timeout=10
    )

Zweite: Holen Sie die Bestellungen aus Ihrer Anfrage (wie Sie es getan haben).

 r=wcapi.get("orders")

Dritte: Abrufen der gesamten Seiten.

total_pages = int(r.headers['X-WP-TotalPages'])

Her: Fangen Sie für jede Seite den json ab und greifen Sie über die API auf die Daten zu.

for i in range(1,total_pages+1):
     r=wcapi.get("orders?&page="+str(i)).json()
     ...

  • Es ist sehr hilfreich, die Kopfzeilen zu verwenden, um die Gesamtseitenzahl zu erhalten. Danke @gtopal

    – Timothy Dalton

    3. März um 9:11

Die relevanten Parameter finden sich in der entsprechenden Dokumentation Sind page Und per_page. Der per_page Der Parameter definiert, wie viele Bestellungen bei jeder Anfrage abgerufen werden sollen. Der page Parameter definiert die aktuelle Seite der Auftragssammlung.

Zum Beispiel die Anfrage gesendet von wcapi.get('orders/per_page=5&page=2') sendet die Bestellungen 5 bis 10 zurück.

Allerdings als Standard von per_page 10 ist, ist es nicht klar, warum Sie nur 8 Bestellungen erhalten.

Benutzeravatar von autopoietic
autopoietisch

Ich bin auf das gleiche Problem mit paginierten Antworten für Produkte gestoßen.

Ich baute auf dem gleichen Ansatz auf, der von @gtopal beschrieben wurde, wobei die X-WP-TotalPages Der von WooCommerce zurückgegebene Header wird verwendet, um jede Ergebnisseite zu durchlaufen.

Ich wusste, dass bei anderen WooCommerce-API-Anforderungen (z. B. Bestellungen) wahrscheinlich dasselbe Problem auftreten würde, und ich wollte meinen Code nicht verwirren müssen, indem ich wiederholt eine Schleife ausführe, wenn ich eine paginierte Ergebnismenge anforderte.

Um dies zu vermeiden, habe ich einen Dekorateur verwendet, um die Paginierungslogik zu abstrahieren, so dass get_all_wc_orders kann sich nur auf die Anfrage konzentrieren.

Ich hoffe, der Dekorateur unten könnte für jemand anderen nützlich sein (Kern)

from woocommerce import API

WC_MAX_API_RESULT_COUNT = 100

wcapi = API(
    url=url,
    consumer_key=key,
    consumer_secret=secret,
    version="wc/v3",
    timeout=300,
)

def wcapi_aggregate_paginated_response(func):
    """
    Decorator that repeat calls a decorated function to get 
    all pages of WooCommerce API response.

    Combines the response data into a single list.

    Decorated function must accept parameters:
        - wcapi object
        - page number
    """
    def wrapper(wcapi, page=0, *args, **kwargs):
        items = []
        page = 0
        num_pages = WC_MAX_API_RESULT_COUNT

        while page < num_pages:
            page += 1
            log.debug(f"{page=}")

            response = func(wcapi, page=page, *args, **kwargs)

            items.extend(response.json())
            num_pages = int(response.headers["X-WP-TotalPages"])
            num_products = int(response.headers["X-WP-Total"])

        log.debug(f"{num_products=}, {len(items)=}")
        return items
    return wrapper


@wcapi_aggregate_paginated_response
def get_all_wc_orders(wcapi, page=1):
    """
    Query WooCommerce rest api for all products
    """
    response = wcapi.get(
        "orders",
        params={
            "per_page": WC_MAX_API_RESULT_COUNT,
            "page": page,
        },
    )
    response.raise_for_status()
    return response

orders = get_all_wc_orders(wcapi)

1447000cookie-checkErhalten Sie alle Woocommerce-Bestellungen über die Python-API

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy