Skip to content

Commit

Permalink
Fixes the item not found error by using filter in the product endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
halilozanakgul committed Jan 22, 2025
1 parent 00f5ff1 commit ea5224e
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 15 deletions.
29 changes: 23 additions & 6 deletions facebook-commerce.php
Original file line number Diff line number Diff line change
Expand Up @@ -1107,9 +1107,11 @@ public function on_variable_product_publish( $wp_id, $woo_product = null ) {
return;
}

$use_filter_endpoint = ($woo_product->woo_product->get_date_created() == $woo_product->woo_product->get_date_modified());

// Check if product group has been published to FB. If not, it's new.
// If yes, loop through variants and see if product items are published.
$fb_product_group_id = $this->get_product_fbid( self::FB_PRODUCT_GROUP_ID, $wp_id, $woo_product );
$fb_product_group_id = $this->get_product_fbid( self::FB_PRODUCT_GROUP_ID, $wp_id, $woo_product, $use_filter_endpoint );
if ( $fb_product_group_id ) {
$woo_product->fb_visibility = Products::is_product_visible( $woo_product->woo_product );
$this->update_product_group( $woo_product );
Expand Down Expand Up @@ -1152,9 +1154,11 @@ public function on_simple_product_publish( $wp_id, $woo_product = null, &$parent
return;
}

$use_filter_endpoint = ($woo_product->woo_product->get_date_created() == $woo_product->woo_product->get_date_modified());

// Check if this product has already been published to FB.
// If not, it's new!
$fb_product_item_id = $this->get_product_fbid( self::FB_PRODUCT_ITEM_ID, $wp_id, $woo_product );
$fb_product_item_id = $this->get_product_fbid( self::FB_PRODUCT_ITEM_ID, $wp_id, $woo_product, $use_filter_endpoint );

if ( $fb_product_item_id ) {
$woo_product->fb_visibility = Products::is_product_visible( $woo_product->woo_product );
Expand Down Expand Up @@ -2920,7 +2924,7 @@ public function on_quick_and_bulk_edit_save( $product ) {
* @param WC_Facebook_Product|null $woo_product product
* @return string facebook product id or an empty string
*/
public function get_product_fbid( string $fbid_type, int $wp_id, $woo_product = null ) {
public function get_product_fbid( string $fbid_type, int $wp_id, $woo_product = null, $use_filter_endpoint = false ) {
$fb_id = WC_Facebookcommerce_Utils::get_fbid_post_meta( $wp_id, $fbid_type );
if ( $fb_id ) {
return $fb_id;
Expand All @@ -2935,12 +2939,25 @@ 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
$fb_retailer_id,
$use_filter_endpoint
);

if ( $facebook_ids->id ) {
if ( $use_filter_endpoint ) {
if ( empty( $response->data ) ) {
return null;
}

$facebook_ids = $response->data[0];
}
else
{
$facebook_ids = $response;
}

if ( $facebook_ids->id) {
$fb_id = $fbid_type == self::FB_PRODUCT_GROUP_ID
? $facebook_ids->get_facebook_product_group_id()
: $facebook_ids->id;
Expand Down
4 changes: 2 additions & 2 deletions includes/API.php
Original file line number Diff line number Diff line change
Expand Up @@ -443,8 +443,8 @@ public function delete_product_item( string $facebook_product_id ): API\ProductC
* @throws ApiException In case of network request error.
* @throws API\Exceptions\Request_Limit_Reached
*/
public function get_product_facebook_ids( string $facebook_product_catalog_id, string $facebook_retailer_id ): API\ProductCatalog\Products\Id\Response {
$request = new API\ProductCatalog\Products\Id\Request( $facebook_product_catalog_id, $facebook_retailer_id );
public function get_product_facebook_ids( string $facebook_product_catalog_id, string $facebook_retailer_id, $use_filter_endpoint ): API\ProductCatalog\Products\Id\Response {
$request = new API\ProductCatalog\Products\Id\Request( $facebook_product_catalog_id, $facebook_retailer_id, $use_filter_endpoint );
$this->set_response_handler( API\ProductCatalog\Products\Id\Response::class );
return $this->perform_request( $request );
}
Expand Down
23 changes: 18 additions & 5 deletions includes/API/ProductCatalog/Products/Id/Request.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,31 @@
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 {

/**
* @param string $facebook_product_catalog_id Facebook Product Catalog ID.
* @param string $facebook_product_retailer_id Facebook Product Retailer ID.
* @param bool $use_filter_endpoint Whether to use endpoint with the filter parameter.
*/
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' );
public function __construct( string $facebook_product_catalog_id, string $facebook_product_retailer_id, $use_filter_endpoint ) {
if ( $use_filter_endpoint ) {
$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}',
)
);
} else {
$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' );
}
}
}
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
48 changes: 47 additions & 1 deletion tests/Unit/ApiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -554,12 +554,58 @@ public function test_get_product_facebook_ids_creates_get_ids_request() {
};
add_filter( 'pre_http_request', $response, 10, 3 );

$response = $this->api->get_product_facebook_ids( $facebook_product_catalog_id, $facebook_product_retailer_id );
$use_filter_endpoint = false;
$response = $this->api->get_product_facebook_ids( $facebook_product_catalog_id, $facebook_product_retailer_id, $use_filter_endpoint );

$this->assertEquals( '8672727132741181', $response->id );
$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 );

$use_filter_endpoint = true;
$response = $this->api->get_product_facebook_ids( $facebook_product_catalog_id, $facebook_product_retailer_id, $use_filter_endpoint );

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

/**
* Tests delete product prepares a request to Facebook.
*
Expand Down

0 comments on commit ea5224e

Please sign in to comment.