webentwicklung-frage-antwort-db.com.de

WooCommerce: wc_get_products kann nicht für benutzerdefinierte REST API-Endpunkte) verwendet werden

Ich versuche, einige benutzerdefinierte REST API-Endpunkte zu erstellen, die Produkte mit bestimmten Bedingungen erhalten, z. B. einen Endpunkt für vorgestellte Produkte. Ich habe versucht, die Funktion wc_get_products Wie zu verwenden diese:

add_action('rest_api_init', 'my_custom_featured_product_endpoint');

function my_custom_featured_product_endpoint() {
    register_rest_route('custom-endpoints/v1', '/products/featured', array(
        'methods' => 'GET',
        'callback' => 'my_custom_featured_product_callback',
    ));
}

function my_custom_featured_product_callback() {
    $meta_query  = WC()->query->get_meta_query();
    $tax_query   = WC()->query->get_tax_query();
    $tax_query[] = array(
        'taxonomy' => 'product_visibility',
        'field'    => 'name',
        'terms'    => 'featured',
        'operator' => 'IN',
    );

    $args = array(
        'tax_query' => $tax_query,
        'meta_query' => $meta_query,
    );

    $result = wc_get_products($args);

    return rest_ensure_response($result);
}

Das Ergebnis sind nur einige leere Arrays. Ich kann diese Produkte mit alter Mode get_posts Ersetzen wc_get_products, Aber das Ausgabeformat hat einige Eigenschaften wie 'Preis', 'Bilder' ...

Gibt es also Alternativen für wc_get_products Für benutzerdefinierte REST API-Endpunkte) oder gibt es Möglichkeiten, dies zum Laufen zu bringen?

P/S: Ich habe die Abfrage getestet, indem ich die Rückruffunktion wie folgt geändert habe:

function my_custom_featured_product_callback() {
    $result = wc_get_product(99);//Yes there is a product with ID 99

    return rest_ensure_response($result);
}

Das Ergebnis bleibt gleich, nur ein leeres Array. Ich denke, das Problem muss bei den Funktionen wc_get_products Und wc_get_product Liegen. Vielleicht ist der rest_api_init Nicht der richtige Hook für diese Funktionen?

3
David Lee

sie haben etwas verpasst. Wenn Sie ein Produkt mit wc_get_product erhalten, wird Ihnen ein abstraktes Objekt zurückgegeben. Wenn Sie also ein Produkt benötigen, tun Sie dies

$product =  wc_get_product($product_id);
return $product->get_data();

sie können auch alle anderen Funktionen verwenden, z.

$product->get_status();
$product->get_gallery_image_ids();
...
1
Arash Rabiee

Ich sah mich einem ähnlichen Verhalten gegenüber, bei dem $wc_get_product hat immer leere Objekte von einem benutzerdefinierten REST Endpunkt zurückgegeben, als ich die Antwort mit einem console.log auf der Front-End-Seite überprüft habe.

Da ich das Objekt PHP] direkt in der Antwort zurückgegeben habe, habe ich das Problem gelöst, indem ich das Produktobjekt mithilfe des folgenden Threads in ein Array konvertiert habe:

konvertiere-php-Objekt-in-assoziatives-Array

Danach hat es wie erwartet funktioniert, hoffentlich wird es für Sie genauso sein!

0
Brauperle

Fügen Sie (array) Cast vor wc_get_products($args) wie folgt hinzu:

$result = (array) wc_get_products($args);

Wenn ein Objekt in ein Array konvertiert wird, ist das Ergebnis ein Array, dessen Elemente die Eigenschaften des Objekts sind. Die Schlüssel sind die Namen der Mitgliedsvariablen, mit einigen bemerkenswerten Ausnahmen: Auf Integer-Eigenschaften kann nicht zugegriffen werden. Bei privaten Variablen wird dem Klassennamen der Klassenname vorangestellt. Geschützte Variablen haben ein '*' vor dem Variablennamen. Diese vorangestellten Werte haben auf beiden Seiten Null-Bytes. und Sie können über die Eigenschaft *data auf Produktdaten zugreifen.

0
Vala Khosravi