Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions facebook-commerce.php
Original file line number Diff line number Diff line change
Expand Up @@ -3079,17 +3079,22 @@ public function get_product_fbid( string $fbid_type, int $wp_id, $woo_product =
$fb_retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( $woo_product );

try {
$facebook_ids = $this->facebook_for_woocommerce->get_api()->get_product_facebook_ids(
$response = $this->facebook_for_woocommerce->get_api()->get_product_facebook_ids(
$this->get_product_catalog_id(),
$fb_retailer_id
);

if ( $facebook_ids->id ) {
if ( $response->data && $response->data[0] && $response->data[0]['id'] ) {
$fb_id = $fbid_type == self::FB_PRODUCT_GROUP_ID
? $facebook_ids->get_facebook_product_group_id()
: $facebook_ids->id;
? $response->data[0]['product_group']['id']
: $response->data[0]['id'];
update_post_meta( $wp_id, $fbid_type, $fb_id );
return $fb_id;
} elseif ( $response->id ) {
$fb_id = $fbid_type == self::FB_PRODUCT_GROUP_ID
? $response->get_facebook_product_group_id()
: $response->id;
update_post_meta( $wp_id, $fbid_type, $fb_id );

return $fb_id;
}
} catch ( Exception $e ) {
Expand Down
19 changes: 15 additions & 4 deletions includes/API/ProductCatalog/Products/Id/Request.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
defined( 'ABSPATH' ) || exit;

/**
* Request object for Product Catalog > Product Groups > Products > Update Graph Api.
* Request object for Product Catalog > Products > Get Graph Api.
*
* @link https://developers.facebook.com/docs/marketing-api/reference/product-group/products/
* @link https://developers.facebook.com/docs/marketing-api/reference/product-catalog/products/
*/
class Request extends ApiRequest {

Expand All @@ -19,7 +19,18 @@ class Request extends ApiRequest {
* @param string $facebook_product_retailer_id Facebook Product Retailer ID.
*/
public function __construct( string $facebook_product_catalog_id, string $facebook_product_retailer_id ) {
$path = "catalog:{$facebook_product_catalog_id}:" . base64_encode( $facebook_product_retailer_id ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
parent::__construct( "/{$path}/?fields=id,product_group{id}", 'GET' );

/**
* We use the endpoint with filter to get the product id and group id for new products to check if the product is already synced to Facebook.
*/
$path = "/{$facebook_product_catalog_id}/products";
parent::__construct( $path, 'GET' );

$this->set_params(
array(
'filter' => '{"retailer_id":{"eq":"' . $facebook_product_retailer_id . '"}}',
'fields' => 'id,product_group{id}',
)
);
}
}
2 changes: 1 addition & 1 deletion includes/API/ProductCatalog/Products/Id/Response.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
/**
* Response object for Product Catalog > Product Groups > Update Graph Api.
*
* @link https://developers.facebook.com/docs/marketing-api/reference/product-group/products/
* @link https://developers.facebook.com/docs/marketing-api/reference/product-catalog/products/
* @property-read string id Either request was successful or not.
* @property-read array product_group Product group data container containing facebook product group id
* e.g. product_group => [ id => <facebook product group id>]
Expand Down
92 changes: 90 additions & 2 deletions tests/Unit/ApiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -540,8 +540,9 @@ public function test_get_product_facebook_ids_creates_get_ids_request() {
$response = function( $result, $parsed_args, $url ) use ( $facebook_product_catalog_id, $facebook_product_retailer_id ) {
$this->assertEquals( 'GET', $parsed_args['method'] );

$path = "catalog:{$facebook_product_catalog_id}:" . base64_encode( $facebook_product_retailer_id );
$path = "/{$path}/?fields=id,product_group{id}";
$filter = urlencode('{"retailer_id":{"eq":"' . $facebook_product_retailer_id . '"}}');
$fields = urlencode('id,product_group{id}');
$path = "/{$facebook_product_catalog_id}/products?filter={$filter}&fields={$fields}";

$this->assertEquals( "{$this->endpoint}{$this->version}{$path}", $url );
return [
Expand All @@ -560,6 +561,93 @@ public function test_get_product_facebook_ids_creates_get_ids_request() {
$this->assertEquals( '8672727046074523', $response->get_facebook_product_group_id() );
}

/**
* Tests get product ids prepares a request to Facebook.
* This test is for the filter endpoint.
*
* @return void
* @throws ApiException In case of network request error.
*/
public function test_get_product_facebook_ids_creates_get_ids_request_with_filter_endpoint() {
$facebook_product_catalog_id = '726635365295186';
$facebook_product_retailer_id = 'woo-cap_97';

$response = function( $result, $parsed_args, $url ) use ( $facebook_product_catalog_id, $facebook_product_retailer_id ) {
$this->assertEquals( 'GET', $parsed_args['method'] );

$filter = urlencode('{"retailer_id":{"eq":"' . $facebook_product_retailer_id . '"}}');
$fields = urlencode('id,product_group{id}');
$path = "/{$facebook_product_catalog_id}/products?filter={$filter}&fields={$fields}";

$this->assertEquals( "{$this->endpoint}{$this->version}{$path}", $url );
return [
'body' => '{"data":[{"id":"8672727132741181","product_group":{"id":"8672727046074523"}}]}',
'response' => [
'code' => 200,
'message' => 'OK',
],
];
};
add_filter( 'pre_http_request', $response, 10, 3 );

$is_call_before_sync = true;
$product = WC_Helper_Product::create_simple_product();
$woo_product = new WC_Facebook_Product( $product );
$response = $this->api->get_product_facebook_ids( $facebook_product_catalog_id, $facebook_product_retailer_id, $woo_product, $is_call_before_sync );

$this->assertEquals(
[
[
'id' => '8672727132741181',
'product_group' => [
'id' => '8672727046074523',
],
],
],
$response->data
);
}

/**
* Tests get product ids prepares a request to Facebook.
* This test is for the filter endpoint with a product retailer id that doesn't exist.
*
* @return void
* @throws ApiException In case of network request error.
*/
public function test_get_product_facebook_ids_creates_get_ids_request_with_filter_endpoint_nonexisting_product() {
$facebook_product_catalog_id = '726635365295186';
$facebook_product_retailer_id = 'nonexisting_product_retailer_id';

$response = function( $result, $parsed_args, $url ) use ( $facebook_product_catalog_id, $facebook_product_retailer_id ) {
$this->assertEquals( 'GET', $parsed_args['method'] );

$filter = urlencode('{"retailer_id":{"eq":"' . $facebook_product_retailer_id . '"}}');
$fields = urlencode('id,product_group{id}');
$path = "/{$facebook_product_catalog_id}/products?filter={$filter}&fields={$fields}";

$this->assertEquals( "{$this->endpoint}{$this->version}{$path}", $url );
return [
'body' => '{"data":[]}',
'response' => [
'code' => 200,
'message' => 'OK',
],
];
};
add_filter( 'pre_http_request', $response, 10, 3 );

$is_call_before_sync = true;
$product = WC_Helper_Product::create_simple_product();
$woo_product = new \WC_Facebook_Product( $product );
$response = $this->api->get_product_facebook_ids( $facebook_product_catalog_id, $facebook_product_retailer_id, $woo_product, $is_call_before_sync );

$this->assertEquals(
[],
$response->data
);
}

/**
* Tests delete product prepares a request to Facebook.
*
Expand Down
45 changes: 45 additions & 0 deletions tests/Unit/WCFacebookCommerceIntegrationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3215,4 +3215,49 @@ public function test_get_product_fbid_calls_facebook_and_sets_post_meta_value_fo
$this->assertEquals( 'product-id', $facebook_product_id );
$this->assertEquals( 'product-id', get_post_meta( $product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, true ) );
}

/**
* Tests get product facebook id calls facebook graph api with the endpoint with filter to get id and updates
* post meta item id value.
*
* @return void
*/
public function test_get_product_fbid_calls_facebook_and_sets_post_meta_value_for_item_id_with_filter_endpoint() {
add_option( WC_Facebookcommerce_Integration::OPTION_PRODUCT_CATALOG_ID, '1122334455' );

$product = WC_Helper_Product::create_simple_product();
$fb_retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( new WC_Facebook_Product( $product->get_id() ) );

$this->api->expects( $this->once() )
->method( 'get_product_facebook_ids' )
->with( '1122334455', $fb_retailer_id )
->willReturn( new API\ProductCatalog\Products\Id\Response( '{"data":[{"id":"product-id","product_group":{"id":"product-group-id"}}]}' ) );

$facebook_product_id = $this->integration->get_product_fbid( WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, $product->get_id() );

$this->assertEquals( 'product-id', $facebook_product_id );
$this->assertEquals( 'product-id', get_post_meta( $product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, true ) );
}

/**
* Tests get product facebook id calls facebook graph api with the endpoint with filter to find that the item doesn't exist.
*
* @return void
*/
public function test_get_product_fbid_calls_facebook_and_sets_post_meta_value_for_item_id_with_filter_endpoint_empty_data() {
add_option( WC_Facebookcommerce_Integration::OPTION_PRODUCT_CATALOG_ID, '1122334455' );

$product = WC_Helper_Product::create_simple_product();
$fb_retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( new WC_Facebook_Product( $product->get_id() ) );

$this->api->expects( $this->once() )
->method( 'get_product_facebook_ids' )
->with( '1122334455', $fb_retailer_id )
->willReturn( new API\ProductCatalog\Products\Id\Response( '{"data":[]}' ) );

$facebook_product_id = $this->integration->get_product_fbid( WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, $product->get_id() );

$this->assertEquals( null, $facebook_product_id );
$this->assertEquals( null, get_post_meta( $product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, true ) );
}
}