【问题标题】:Pagination with google ads api in php在 php 中使用谷歌广告 api 进行分页
【发布时间】:2020-12-15 17:24:32
【问题描述】:

我正在尝试使用 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个广告,以此类推?

提前致谢!

【问题讨论】:

    标签: php google-ads-api


    【解决方案1】:

    要实现分页,您可以稍微改变显示。

    比如说,如果你想每页显示 10 条记录,那么对于第 2 页,它将是 记录 11 到 20。

    所以,要显示第 2 页,您可以修改部分:

    foreach ($stream->iterateAllElements() as $googleAdsRow) {
                dump($googleAdsRow->serializeToJsonString());
                /** @var GoogleAdsRow $googleAdsRow */
                $ads[] = json_decode($googleAdsRow->serializeToJsonString(), true);
            }
    

    $index=0;
    foreach ($stream->iterateAllElements() as $googleAdsRow) {
    $index++;
    if ($index >=11 && $index <=20) {
                dump($googleAdsRow->serializeToJsonString());
                /** @var GoogleAdsRow $googleAdsRow */
                $ads[] = json_decode($googleAdsRow->serializeToJsonString(), true);
    }
            }
    

    请查看以上方法是否有效,如果有效,您可以修改代码以按照页码显示数据

    【讨论】:

    • 它不起作用,你可以在这里看到developers.google.com/google-ads/api/docs/query/…你只能限制一个数字,它不是用于分页的。
    • 1个参数的limit和2个参数的limit(用逗号隔开)都是标准的SQL查询。我认为谷歌应该支持两者,
    • LOL,但目前他们不支持这个,所以不要混淆!
    • 是的:_`查询错误:意外输入`
    • 谢谢,我会修改我的答案
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这里是如何在 Python 中完成的 -

      import sys
      from google.ads.googleads.client import GoogleAdsClient
      from google.ads.googleads.errors import GoogleAdsException
      
      client = GoogleAdsClient.load_from_storage()
      ga_service = client.get_service("GoogleAdsService")
      search_request = client.get_type("SearchGoogleAdsRequest")
      
      
      try:
          
          search_request.query = QUERY_STRING
          search_request.customer_id = CUSOMER_ID
          search_request.page_size = PAGE_SIZE
          
          df = pd.DataFrame()
          
          while True:
              response = ga_service.search(search_request)
              dictobj = MessageToDict(response._pb)
              df = df.append(pd.json_normalize(dictobj,record_path=['results']))
              
              
              if response.next_page_token == '':
                  break
              else:
                  search_request.page_token = response.next_page_token
                  
          
          
      except GoogleAdsException as ex:
          print(ex)
      

      【讨论】:

      • 虽然您的回答可能会解决问题,但 including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。您可以编辑您的答案以添加解释并指出适用的限制和假设。 - From Review
      猜你喜欢
      • 2022-08-20
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2022-10-18
      • 2016-03-29
      • 1970-01-01
      相关资源
      最近更新 更多