如何在使用PHP时使用Google Analytics数据API(GA4)的多个过滤器

6
这将是我的第一个问题,我会尽力遵守社区规则。我正在尝试使用PHP在Google Analytics Data API(GA4)中使用多个过滤器。我已经成功地能够使用一个过滤器并在自定义仪表板中显示它。
以下是获取以"value: /133"开头的URL数据的代码。我的问题是,如何创建一个过滤器来获取多个URL。例如,我想要以"/133","/88","/678"和"/67"开头的页面的数据怎么办?
$response = $client->runReport([
    'property' => 'properties/' . $property_id,
    'dateRanges' => [
        new DateRange([
            'start_date' => '2022-01-01',
            'end_date' => 'today',
        ]),
    ],
    'dimensions' => [
        new Dimension(['name' => 'pageTitle',]),
        new Dimension(['name' => 'fullPageUrl',]),
    ],
    'metrics' => [
        new Metric(['name' => 'screenPageViews',]),
        new Metric(['name' => 'activeUsers',]),
        new Metric(['name' => 'newUsers',]),
        new Metric(['name' => 'userEngagementDuration',]),
    ],
    'dimensionFilter' => new FilterExpression([
        'filter' => new Filter([
            'field_name' => 'pagePath',
            'string_filter' => new Filter\StringFilter([
                'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH,
                'value' => '/133',
            ])
        ]),
    ]),
]);
2个回答

11
如何构建FilterExpression的文档链接可以在这里找到:这里 下面是一个工作示例:
<?php
require 'vendor/autoload.php';

use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\Metric;
use Google\Analytics\Data\V1beta\Filter;
use Google\Analytics\Data\V1beta\FilterExpression;
use Google\Analytics\Data\V1beta\FilterExpressionList;

$property_id = 'XXXXXX';

$client = new BetaAnalyticsDataClient();

$response = $client->runReport([
    'property' => 'properties/' . $property_id,
    'dateRanges' => [
        new DateRange([
            'start_date' => '2022-01-01',
            'end_date' => 'today',
        ]),
    ],
    'dimensions' => [
        new Dimension(['name' => 'pageTitle',]),
        new Dimension(['name' => 'fullPageUrl',]),
    ],
    'metrics' => [
        new Metric(['name' => 'screenPageViews',]),
        new Metric(['name' => 'activeUsers',]),
        new Metric(['name' => 'newUsers',]),
        new Metric(['name' => 'userEngagementDuration',]),
    ],
    'dimensionFilter' => new FilterExpression([
        'or_group' => new FilterExpressionList([
            'expressions' => [
                new FilterExpression([
                    'filter' => new Filter([
                        'field_name' => 'pagePath',
                        'string_filter' => new Filter\StringFilter([
                            'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH,
                            'value' => '/133',
                        ])
                    ]),
                ]),
                new FilterExpression([
                    'filter' => new Filter([
                        'field_name' => 'pagePath',
                        'string_filter' => new Filter\StringFilter([
                            'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH,
                            'value' => '/88',
                        ])
                    ]),
                ]),
            ]
        ]),
    ]),
]);

感谢您尝试!但是,当我尝试使用您的示例时,我收到了一个错误。致命错误:未捕获异常:期望 Google\Analytics\Data\V1beta\FilterExpression。 - luciano
@luciano编辑了带有可运行示例的答案。 - dikesh
1
非常感谢!那个完美地解决了问题!起初我使用了一种丑陋的解决方案,为每个唯一的URL创建了一个整个代码的PHP循环。性能可以说是极差的。但是您的代码让它变得更好、更清晰,正如应该的那样。再次感谢@dikesh! - luciano
还有一件事。我该如何使用PHP为Filterexpression创建一个循环。值(/133和/88)是通过mysqli请求动态生成的。我尝试在“expressions =>”部分中创建while循环,以便使用这些值动态添加新的“new FilterExpression([ 'filter' => new Filter(['field_name' => 'pagePath', 'string_filter' => new Filter\StringFilter([ 'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH, 'value' => 'dynamic value', ])]),]),”,但是一直收到“Parse error: syntax error, unexpected token "while", expecting "]" ”的错误提示。 - luciano
您可以创建一个单独的 FilterExpression 对象数组,然后将该数组与 'expressions' => $filter_expressions 一起使用。 - dikesh
1
你又帮了我一次忙!使用数组方法解决问题非常好:) 谢谢! - luciano

0
我之前以为@Dikesh的解决方案会返回两个不同的计数结果。但事实证明,它与使用inListFilter的结果相同,它将这两个计数相加并返回一个总计。
  $dimensionFilter = new FilterExpression([
    'filter' => new Filter([
      'field_name' => 'pagePath',
      'in_list_filter' => new inListFilter([
        'values' => ['/form/test', '/form/contact']
      ])
    ])
  ]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接