I’m using Wix’s API to query products. I’ve made progress converting their examples to PHP but am stumped with their filtering method. For example, this basic query:
curl -X POST 'https://www.wixapis.com/stores/v1/products/query' --data-binary '{ "includeVariants": true }' -H 'Content-Type: application/json' -H 'Authorization: <AUTH>'enter code here
works fine when rewritten as:
public function getProducts($code){ $curl_postData = array( 'includeVariants' => 'true' ); $params = json_encode($curl_postData); $productsURL = 'https://www.wixapis.com/stores/v1/products/query'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $productsURL); curl_setopt($ch, CURLOPT_HEADER, false); $headers = [ 'Content-Type:application/json', 'Authorization:' . $code ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, ''); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($ch); $curlErr = curl_error($ch); curl_close($ch); return $output; }
But I’m having trouble filtering to a specific collection. Here’s their example:
curl 'https://www.wixapis.com/stores/v1/products/query' --data-binary '{ "query": { "filter": "{"collections.id": { "$hasSome": ["32fd0b3a-2d38-2235-7754-78a3f819274a"]} }" } }' -H 'Content-Type: application/json' -H 'Authorization: <AUTH>'
And here’s my interpretation of it ($collection is my variable to replace the fixed value in Wix’s example):
public function getProducts($code, $collection){ $curl_postData = array( 'filter' => array( 'collections.id' => array( '$hasSome' => $collection ) ) ); $params = json_encode($curl_postData); $productsURL = 'https://www.wixapis.com/stores/v1/products/query'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $productsURL); curl_setopt($ch, CURLOPT_HEADER, false); $headers = [ 'Content-Type:application/json', 'Authorization:' . $code ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, ''); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($ch); $curlErr = curl_error($ch); curl_close($ch); return $output; }
The response is identical to the first example–I get all the products instead of just one collection. The problem is almost certainly my interpretation of their example. I think it’s meant to be a multidimensional array, but I could be reading it wrong. I’d appreciate any suggestions.
Advertisement
Answer
In the second code block, the value of the filter
property is not an object, but a JSON-encoded object. I’m not sure why the API requires that, but it means you have to use nested json_encode()
in PHP.
$curl_postData = array( 'filter' => json_encode(array( 'collections.id' => array( '$hasSome' => $collection ) )) );