/** * Hooks on Period archiving. * Sums up Goal conversions stats, and processes overall conversion rate * * @param Piwik_Event_Notification $notification * @return void */ function archivePeriod($notification) { /** * @var Piwik_ArchiveProcessing */ $archiveProcessing = $notification->getNotificationObject(); if (!$archiveProcessing->shouldProcessReportsForPlugin($this->getPluginName())) { return; } /* * Archive Ecommerce Items */ if ($this->shouldArchiveEcommerceItems($archiveProcessing)) { $dataTableToSum = $this->dimensions; foreach ($this->dimensions as $recordName) { $dataTableToSum[] = self::getItemRecordNameAbandonedCart($recordName); } $archiveProcessing->archiveDataTable($dataTableToSum); } /* * Archive General Goal metrics */ $goalIdsToSum = Piwik_Tracker_GoalManager::getGoalIds($archiveProcessing->idsite); //Ecommerce $goalIdsToSum[] = Piwik_Tracker_GoalManager::IDGOAL_ORDER; $goalIdsToSum[] = Piwik_Tracker_GoalManager::IDGOAL_CART; //bug here if idgoal=1 // Overall goal metrics $goalIdsToSum[] = false; $fieldsToSum = array(); foreach ($goalIdsToSum as $goalId) { $metricsToSum = Piwik_Goals::getGoalColumns($goalId); unset($metricsToSum[array_search('conversion_rate', $metricsToSum)]); foreach ($metricsToSum as $metricName) { $fieldsToSum[] = self::getRecordName($metricName, $goalId); } } $records = $archiveProcessing->archiveNumericValuesSum($fieldsToSum); // also recording conversion_rate for each goal foreach ($goalIdsToSum as $goalId) { $nb_conversions = $records[self::getRecordName('nb_visits_converted', $goalId)]; $conversion_rate = $this->getConversionRate($nb_conversions, $archiveProcessing); $archiveProcessing->insertNumericRecord(self::getRecordName('conversion_rate', $goalId), $conversion_rate); // sum up the visits to conversion data table & the days to conversion data table $archiveProcessing->archiveDataTable(array(self::getRecordName(self::VISITS_UNTIL_RECORD_NAME, $goalId), self::getRecordName(self::DAYS_UNTIL_CONV_RECORD_NAME, $goalId))); } // sum up goal overview reports $archiveProcessing->archiveDataTable(array(self::getRecordName(self::VISITS_UNTIL_RECORD_NAME), self::getRecordName(self::DAYS_UNTIL_CONV_RECORD_NAME))); }
/** * Returns Goals data * * @param int $idSite * @param string $period * @param string $date * @param bool $segment * @param bool|int $idGoal * @param array $columns Array of metrics to fetch: nb_conversions, conversion_rate, revenue * @return Piwik_DataTable */ public function get($idSite, $period, $date, $segment = false, $idGoal = false, $columns = array()) { Piwik::checkUserHasViewAccess($idSite); $archive = Piwik_Archive::build($idSite, $period, $date, $segment); $columns = Piwik::getArrayFromApiParameter($columns); // Mapping string idGoal to internal ID $idGoal = self::convertSpecialGoalIds($idGoal); if (empty($columns)) { $columns = Piwik_Goals::getGoalColumns($idGoal); if ($idGoal == Piwik_Archive::LABEL_ECOMMERCE_ORDER) { $columns[] = 'avg_order_revenue'; } } if (in_array('avg_order_revenue', $columns) && $idGoal == Piwik_Archive::LABEL_ECOMMERCE_ORDER) { $columns[] = 'nb_conversions'; $columns[] = 'revenue'; $columns = array_values(array_unique($columns)); } $columnsToSelect = array(); foreach ($columns as &$columnName) { $columnsToSelect[] = Piwik_Goals::getRecordName($columnName, $idGoal); } $dataTable = $archive->getDataTableFromNumeric($columnsToSelect); // Rewrite column names as we expect them foreach ($columnsToSelect as $id => $oldName) { $dataTable->renameColumn($oldName, $columns[$id]); } if ($idGoal == Piwik_Archive::LABEL_ECOMMERCE_ORDER) { if ($dataTable instanceof Piwik_DataTable_Array) { foreach ($dataTable->getArray() as $row) { $this->enrichTable($row); } } else { $this->enrichTable($dataTable); } } return $dataTable; }