'string', 'pattern' => '^\d{4}-\d{2}-\d{2}$', 'required' => true, ); return array( 'prev_start' => $date, 'prev_end' => $date, ); } /** * {@inheritDoc} * * @param Profile $site Site. * @param array $params Parameters. * @return array */ public function run( Profile $site, array $params ) { $metrics = array_slice( $site->traffic_metrics, 0, Profile::MAX_TRAFFIC_METRICS ); if ( ! $metrics ) { return array( 'cur' => new \stdClass(), 'prev' => new \stdClass(), ); } $ga = $this->google->for_site( $site, Profile::SOURCE_ANALYTICS )->analytics(); $ttl = $this->ttl( $params['end'] ); $segment = $this->segment( $site, $params ); $seg = $segment ? SegmentFilter::ga( $segment ) : null; $totals = function ( $start, $end ) use ( $ga, $site, $metrics, $ttl, $seg ) { $body = array( 'dateRanges' => array( array( 'startDate' => $start, 'endDate' => $end, ), ), 'metrics' => array_map( static function ( $m ) { return array( 'name' => $m ); }, $metrics ), ); $filter = Filters::all( Profile::SCOPE_ORGANIC === $site->traffic_scope ? Filters::exact( 'sessionDefaultChannelGroup', 'Organic Search' ) : null, $seg ); if ( $filter ) { $body['dimensionFilter'] = $filter; } $rows = $ga->run_report( $site->ga_property, $body, $ttl ); $out = array(); foreach ( $metrics as $i => $metric ) { $out[ $metric ] = isset( $rows[0]['m'][ $i ] ) ? (float) $rows[0]['m'][ $i ] : 0.0; } return $out; }; return array( 'cur' => self::map( $totals( $params['start'], $params['end'] ) ), 'prev' => self::map( $totals( $params['prev_start'], $params['prev_end'] ) ), ); } }