Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
primogenial
/
wp-content
/
plugins
/
google-listings-and-ads
/
src
/
API
/
Google
:
AdsAssetGroup.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php declare( strict_types=1 ); namespace Automattic\WooCommerce\GoogleListingsAndAds\API\Google; use Automattic\WooCommerce\GoogleListingsAndAds\API\Google\Query\AdsAssetGroupQuery; use Automattic\WooCommerce\GoogleListingsAndAds\API\Google\Query\AdsListingGroupFilterQuery; use Automattic\WooCommerce\GoogleListingsAndAds\Google\Ads\GoogleAdsClient; use Automattic\WooCommerce\GoogleListingsAndAds\Options\OptionsAwareInterface; use Automattic\WooCommerce\GoogleListingsAndAds\Options\OptionsAwareTrait; use Google\Ads\GoogleAds\Util\V11\ResourceNames; use Google\Ads\GoogleAds\V11\Enums\AssetGroupStatusEnum\AssetGroupStatus; use Google\Ads\GoogleAds\V11\Enums\ListingGroupFilterTypeEnum\ListingGroupFilterType; use Google\Ads\GoogleAds\V11\Enums\ListingGroupFilterVerticalEnum\ListingGroupFilterVertical; use Google\Ads\GoogleAds\V11\Resources\AssetGroup; use Google\Ads\GoogleAds\V11\Resources\AssetGroupListingGroupFilter; use Google\Ads\GoogleAds\V11\Services\AssetGroupListingGroupFilterOperation; use Google\Ads\GoogleAds\V11\Services\AssetGroupOperation; use Google\Ads\GoogleAds\V11\Services\GoogleAdsRow; use Google\Ads\GoogleAds\V11\Services\MutateOperation; /** * Class AdsAssetGroup * * Used for the Performance Max Campaigns * https://developers.google.com/google-ads/api/docs/performance-max/asset-groups * * @since 1.12.2 * * @package Automattic\WooCommerce\GoogleListingsAndAds\API\Google */ class AdsAssetGroup implements OptionsAwareInterface { use OptionsAwareTrait; /** * Temporary ID to use within a batch job. * A negative number which is unique for all the created resources. * * @var int */ protected const TEMPORARY_ID = -3; /** * The Google Ads Client. * * @var GoogleAdsClient */ protected $client; /** * List of asset group resource names. * * @var string[] */ protected $asset_groups; /** * AdsAssetGroup constructor. * * @param GoogleAdsClient $client */ public function __construct( GoogleAdsClient $client ) { $this->client = $client; } /** * Returns a set of operations to create an asset group. * * @param string $campaign_resource_name * @param string $campaign_name * @return array */ public function create_operations( string $campaign_resource_name, string $campaign_name ): array { // Asset must be created before listing group. return [ $this->asset_group_create_operation( $campaign_resource_name, $campaign_name ), $this->listing_group_create_operation(), ]; } /** * Returns a set of operations to delete an asset group. * * @param string $campaign_resource_name * @return array */ public function delete_operations( string $campaign_resource_name ): array { $asset_group_operations = $this->asset_group_delete_operations( $campaign_resource_name ); $listing_group_operations = $this->listing_group_delete_operations(); // All assets must be deleted from the group before deleting the asset group. return array_merge( $listing_group_operations, $asset_group_operations ); } /** * Returns an asset group create operation. * * @param string $campaign_resource_name * @param string $campaign_name * * @return MutateOperation */ protected function asset_group_create_operation( string $campaign_resource_name, string $campaign_name ): MutateOperation { $asset_group = new AssetGroup( [ 'resource_name' => $this->temporary_resource_name(), 'name' => $campaign_name . ' Asset Group', 'campaign' => $campaign_resource_name, 'status' => AssetGroupStatus::ENABLED, ] ); $operation = ( new AssetGroupOperation() )->setCreate( $asset_group ); return ( new MutateOperation() )->setAssetGroupOperation( $operation ); } /** * Returns an asset group listing group filter create operation. * * @return MutateOperation */ protected function listing_group_create_operation(): MutateOperation { $listing_group = new AssetGroupListingGroupFilter( [ 'asset_group' => $this->temporary_resource_name(), 'type' => ListingGroupFilterType::UNIT_INCLUDED, 'vertical' => ListingGroupFilterVertical::SHOPPING, ] ); $operation = ( new AssetGroupListingGroupFilterOperation() )->setCreate( $listing_group ); return ( new MutateOperation() )->setAssetGroupListingGroupFilterOperation( $operation ); } /** * Returns an asset group delete operation. * * @param string $campaign_resource_name * * @return MutateOperation[] */ protected function asset_group_delete_operations( string $campaign_resource_name ): array { $operations = []; $this->asset_groups = []; $results = ( new AdsAssetGroupQuery() ) ->set_client( $this->client, $this->options->get_ads_id() ) ->where( 'asset_group.campaign', $campaign_resource_name ) ->get_results(); /** @var GoogleAdsRow $row */ foreach ( $results->iterateAllElements() as $row ) { $resource_name = $row->getAssetGroup()->getResourceName(); $this->asset_groups[] = $resource_name; $operation = ( new AssetGroupOperation() )->setRemove( $resource_name ); $operations[] = ( new MutateOperation() )->setAssetGroupOperation( $operation ); } return $operations; } /** * Returns an asset group listing group filter delete operation. * * @return MutateOperation[] */ protected function listing_group_delete_operations(): array { if ( empty( $this->asset_groups ) ) { return []; } $operations = []; $results = ( new AdsListingGroupFilterQuery() ) ->set_client( $this->client, $this->options->get_ads_id() ) ->where( 'asset_group_listing_group_filter.asset_group', $this->asset_groups, 'IN' ) ->get_results(); /** @var GoogleAdsRow $row */ foreach ( $results->iterateAllElements() as $row ) { $resource_name = $row->getAssetGroupListingGroupFilter()->getResourceName(); $operation = ( new AssetGroupListingGroupFilterOperation() )->setRemove( $resource_name ); $operations[] = ( new MutateOperation() )->setAssetGroupListingGroupFilterOperation( $operation ); } return $operations; } /** * Return a temporary resource name for the campaign. * * @return string */ protected function temporary_resource_name() { return ResourceNames::forAssetGroup( $this->options->get_ads_id(), self::TEMPORARY_ID ); } }