php - 在 php 中使用谷歌广告 api 进行分页
问题描述
我正在尝试在 php 页面底部使用 google-ads-php 进行分页,所以我浏览了我的广告,例如PREVIOUS 1,2,3 NEXT 所以这是我的代码:
public function runExample(GoogleAdsClient $googleAdsClient, int $customerId)
{
$googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient();
// Creates a query that retrieves all ads.
$query = "SELECT campaign.name, ad_group.name, "
. "ad_group_ad.ad.responsive_display_ad.marketing_images, "
. "ad_group_ad.ad.app_ad.images, ad_group_ad.ad.app_ad.youtube_videos, "
. "ad_group_ad.ad.responsive_display_ad.youtube_videos, ad_group_ad.ad.local_ad.videos, "
. "ad_group_ad.ad.video_responsive_ad.videos, ad_group_ad.ad.video_ad.media_file, "
. "ad_group_ad.ad.app_engagement_ad.images, ad_group_ad.ad.app_engagement_ad.videos, "
. "ad_group_ad.ad.display_upload_ad.media_bundle, ad_group_ad.ad.gmail_ad.product_images, "
. "ad_group_ad.ad.gmail_ad.product_videos, ad_group_ad.ad.gmail_ad.teaser.logo_image, "
. "ad_group_ad.ad.image_ad.image_url, ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image, "
. "ad_group_ad.ad.local_ad.marketing_images, ad_group_ad.ad.responsive_display_ad.logo_images, "
. "ad_group_ad.ad.responsive_display_ad.square_logo_images, "
. "ad_group_ad.ad.responsive_display_ad.square_marketing_images, "
. "ad_group_ad.ad.responsive_display_ad.youtube_videos, "
. "metrics.impressions, campaign.campaign_budget, campaign.status, "
. "campaign.start_date, campaign.end_date, metrics.all_conversions, "
. "metrics.average_cost, ad_group_ad.ad.type, ad_group_ad.ad.id, "
. "campaign.campaign_budget, metrics.cost_micros, ad_group_ad.status, metrics.impressions "
. "FROM ad_group_ad "
. "WHERE segments.date >= '{$this->from}' AND segments.date <= '{$this->to}' "
. "ORDER BY campaign.name ASC";
// Issues a search stream request.
/** @var GoogleAdsServerStreamDecorator $stream */
$stream = $googleAdsServiceClient->search($customerId, $query, ['pageSize' => 10]);
$ads = [];
foreach ($stream->iterateAllElements() as $googleAdsRow) {
dump($googleAdsRow->serializeToJsonString());
/** @var GoogleAdsRow $googleAdsRow */
$ads[] = json_decode($googleAdsRow->serializeToJsonString(), true);
}
如您所见,pageSize
设置为 10,所以它将是 23 页,因为我有 230 个广告。
我该如何进行分页,现在 $stream 在一个响应中返回所有广告。如何只返回 10 个广告,然后当用户点击第二页按钮时,它会返回接下来的 10 个广告,以此类推?
提前致谢!
解决方案
Google Ads API 提供了本机分页,目前还没有很好的文档记录。但是,您只能按“下一个”和“上一个”页面进行分页。这是一个关于关键字的工作示例,因为这是大多数人可能会遇到的用例。
$googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient();
$query =
'SELECT ad_group.id, '
. 'ad_group_criterion.type, '
. 'ad_group_criterion.criterion_id, '
. 'ad_group_criterion.keyword.text, '
. 'ad_group_criterion.keyword.match_type '
. 'FROM ad_group_criterion '
. 'WHERE ad_group_criterion.type = KEYWORD';
// Get the stream
$stream = $googleAdsServiceClient->search($customerId, $query, ['pageSize' => 1000]);
// Get the first page
$page = $stream->getPage();
foreach ($page->getIterator() as $googleAdsRow) {
// Iterating over the first page of 1000 keywords.
}
// Get the next page token
$nextPageToken = $page->getNextPageToken();
// Get the second page
$page = $stream->getPage();
$stream = $googleAdsServiceClient->search($customerId, $query, ['pageSize' => 1000, 'pageToken' => $nextPageToken]);
foreach ($page->getIterator() as $googleAdsRow) {
// Iterating over the second page of 1000 keywords.
}
请注意,您必须使用search()而不是searchStream()和实际页面的迭代器,而不是iterateAllElements()
推荐阅读
- java - GeoCoder 将值之一返回为 null
- optimization - a,b,c,d,e 的最佳值基于传递给具有已知基本真值的函数的数据
- mysql - mysql根据预期库存返回数据
- java - Spring JDBC 中的错误 Sql 语法异常
- sql - 是否可以将 SSIS 包中使用的文件记录到自定义执行表中?
- javascript - 强制外部链接(来自我的网站)在该设备的默认浏览器中的新选项卡中打开?
- python-3.x - lru_cache 为所有类实例保存
- elasticsearch - Elasticsearch 在脚本字段中访问 params['_source'] 时返回 null_pointer_exception
- php - MySqlBuilder::defaultStringLength()
- rpm - 从 RPM DB、BerkeleyDB 获取已安装的软件包