Fix field names with product_view prefix

The Merchant API Reports require product fields to be prefixed:
- product_view.offer_id instead of offer_id
- product_view.gtin instead of gtin
- product_view.title, product_view.price, etc.
- benchmark_price remains without prefix (it's a report-level field)

Also update response parsing to extract from nested productView object.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-23 18:11:06 +01:00
parent 0d1bb72214
commit c13efdcb0d

View File

@@ -407,13 +407,13 @@ class Informatiq_SP_Google_API {
// Use the Reports API to search for competitive visibility data. // Use the Reports API to search for competitive visibility data.
$endpoint = "/reports/v1beta/accounts/{$this->merchant_id}/reports:search"; $endpoint = "/reports/v1beta/accounts/{$this->merchant_id}/reports:search";
// Try searching by offer_id first (snake_case table name for new API). // Try searching by offer_id first (fields prefixed with product_view.).
$query = array( $query = array(
'query' => "SELECT 'query' => "SELECT
offer_id, product_view.offer_id,
benchmark_price benchmark_price
FROM price_competitiveness_product_view FROM price_competitiveness_product_view
WHERE offer_id = '{$sku}'", WHERE product_view.offer_id = '{$sku}'",
); );
$response = $this->api_request( 'POST', $endpoint, $query ); $response = $this->api_request( 'POST', $endpoint, $query );
@@ -423,9 +423,6 @@ class Informatiq_SP_Google_API {
if ( isset( $result['benchmarkPrice']['amountMicros'] ) ) { if ( isset( $result['benchmarkPrice']['amountMicros'] ) ) {
return (float) $result['benchmarkPrice']['amountMicros'] / 1000000; return (float) $result['benchmarkPrice']['amountMicros'] / 1000000;
} }
if ( isset( $result['benchmark_price']['amountMicros'] ) ) {
return (float) $result['benchmark_price']['amountMicros'] / 1000000;
}
} }
} }
@@ -433,10 +430,10 @@ class Informatiq_SP_Google_API {
if ( preg_match( '/^\d{8,14}$/', $sku ) ) { if ( preg_match( '/^\d{8,14}$/', $sku ) ) {
$query = array( $query = array(
'query' => "SELECT 'query' => "SELECT
gtin, product_view.gtin,
benchmark_price benchmark_price
FROM price_competitiveness_product_view FROM price_competitiveness_product_view
WHERE gtin = '{$sku}'", WHERE product_view.gtin = '{$sku}'",
); );
$response = $this->api_request( 'POST', $endpoint, $query ); $response = $this->api_request( 'POST', $endpoint, $query );
@@ -446,9 +443,6 @@ class Informatiq_SP_Google_API {
if ( isset( $result['benchmarkPrice']['amountMicros'] ) ) { if ( isset( $result['benchmarkPrice']['amountMicros'] ) ) {
return (float) $result['benchmarkPrice']['amountMicros'] / 1000000; return (float) $result['benchmarkPrice']['amountMicros'] / 1000000;
} }
if ( isset( $result['benchmark_price']['amountMicros'] ) ) {
return (float) $result['benchmark_price']['amountMicros'] / 1000000;
}
} }
} }
} }
@@ -476,13 +470,14 @@ class Informatiq_SP_Google_API {
do { do {
// New Merchant API uses snake_case table names. // New Merchant API uses snake_case table names.
// Fields from product are prefixed with product_view.
$query = array( $query = array(
'query' => "SELECT 'query' => "SELECT
id, product_view.id,
offer_id, product_view.offer_id,
gtin, product_view.gtin,
title, product_view.title,
price, product_view.price,
benchmark_price benchmark_price
FROM price_competitiveness_product_view", FROM price_competitiveness_product_view",
); );
@@ -500,26 +495,27 @@ class Informatiq_SP_Google_API {
if ( ! empty( $response['results'] ) ) { if ( ! empty( $response['results'] ) ) {
foreach ( $response['results'] as $result ) { foreach ( $response['results'] as $result ) {
// Extract data - field names in response use camelCase. // Extract data - response nests product fields under productView.
$offer_id = $result['offerId'] ?? ( $result['offer_id'] ?? null ); $product_view = $result['productView'] ?? array();
$gtin = $result['gtin'] ?? null; $offer_id = $product_view['offerId'] ?? ( $product_view['offer_id'] ?? null );
$title = $result['title'] ?? ''; $gtin = $product_view['gtin'] ?? null;
$title = $product_view['title'] ?? '';
$benchmark_price = null; $benchmark_price = null;
// Try different possible response structures. // Try different possible response structures for benchmark.
if ( isset( $result['benchmarkPrice']['amountMicros'] ) ) { if ( isset( $result['benchmarkPrice']['amountMicros'] ) ) {
$benchmark_price = (float) $result['benchmarkPrice']['amountMicros'] / 1000000; $benchmark_price = (float) $result['benchmarkPrice']['amountMicros'] / 1000000;
} elseif ( isset( $result['benchmark_price']['amountMicros'] ) ) { } elseif ( isset( $result['benchmark_price']['amountMicros'] ) ) {
$benchmark_price = (float) $result['benchmark_price']['amountMicros'] / 1000000; $benchmark_price = (float) $result['benchmark_price']['amountMicros'] / 1000000;
} elseif ( isset( $result['benchmarkPrice']['priceMicros'] ) ) { } elseif ( isset( $result['priceBenchmark']['priceBenchmarkValue']['amountMicros'] ) ) {
$benchmark_price = (float) $result['benchmarkPrice']['priceMicros'] / 1000000; $benchmark_price = (float) $result['priceBenchmark']['priceBenchmarkValue']['amountMicros'] / 1000000;
} }
$own_price = null; $own_price = null;
if ( isset( $result['price']['amountMicros'] ) ) { if ( isset( $product_view['price']['amountMicros'] ) ) {
$own_price = (float) $product_view['price']['amountMicros'] / 1000000;
} elseif ( isset( $result['price']['amountMicros'] ) ) {
$own_price = (float) $result['price']['amountMicros'] / 1000000; $own_price = (float) $result['price']['amountMicros'] / 1000000;
} elseif ( isset( $result['price']['priceMicros'] ) ) {
$own_price = (float) $result['price']['priceMicros'] / 1000000;
} }
if ( $offer_id && $benchmark_price ) { if ( $offer_id && $benchmark_price ) {