首页 > 解决方案 > 在 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 个广告,以此类推?

提前致谢!

标签: phpgoogle-ads-api

解决方案


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()


推荐阅读