diff options
-rw-r--r-- | config/global.ini.php | 1 | ||||
-rw-r--r-- | core/Plugin.php | 13 | ||||
-rw-r--r-- | core/Plugin/Manager.php | 4 | ||||
-rw-r--r-- | core/Tracker/Visit.php | 25 | ||||
-rw-r--r-- | plugins/Actions/Tracker/ActionsRequestProcessor.php | 31 | ||||
-rw-r--r-- | plugins/Actions/config/config.php | 9 | ||||
-rw-r--r-- | plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php | 2 | ||||
-rw-r--r-- | plugins/Goals/Tracker/GoalsRequestProcessor.php | 2 | ||||
-rw-r--r-- | plugins/Heartbeat/Heartbeat.php | 19 | ||||
-rw-r--r-- | plugins/Heartbeat/Tracker/PingRequestProcessor.php | 37 | ||||
-rw-r--r-- | plugins/Heartbeat/config/config.php | 9 | ||||
-rw-r--r-- | plugins/Heartbeat/plugin.json | 3 |
12 files changed, 136 insertions, 19 deletions
diff --git a/config/global.ini.php b/config/global.ini.php index a6ba89234c..ba88a53e29 100644 --- a/config/global.ini.php +++ b/config/global.ini.php @@ -777,6 +777,7 @@ Plugins[] = TestRunner Plugins[] = BulkTracking Plugins[] = Resolution Plugins[] = DevicePlugins +Plugins[] = Heartbeat Plugins[] = Intl [PluginsInstalled] diff --git a/core/Plugin.php b/core/Plugin.php index 1cdbefdc7f..33bf3730e5 100644 --- a/core/Plugin.php +++ b/core/Plugin.php @@ -451,6 +451,19 @@ class Plugin } /** + * Override this method in your plugin class if you want your plugin to be loaded during tracking. + * + * Note: If you define your own dimension or handle a tracker event, your plugin will automatically + * be detected as a tracker plugin. + * + * @return bool + */ + public function isTrackerPlugin() + { + return false; + } + + /** * @param $directoryWithinPlugin * @param $expectedSubclass * @return array diff --git a/core/Plugin/Manager.php b/core/Plugin/Manager.php index ff4c3553dc..77b058b113 100644 --- a/core/Plugin/Manager.php +++ b/core/Plugin/Manager.php @@ -1102,6 +1102,10 @@ class Manager return true; } + if ($plugin->isTrackerPlugin()) { + return true; + } + return false; } diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php index 997fd4f805..123d3f931b 100644 --- a/core/Tracker/Visit.php +++ b/core/Tracker/Visit.php @@ -114,29 +114,16 @@ class Visit implements VisitInterface /** * Goals & Ecommerce conversions */ - $isManualGoalConversion = $requestIsEcommerce = false; - $action = null; - $goalManager = null; + /** @var Action $action */ + $action = $this->visitProperties->getRequestMetadata('Actions', 'action'); - if($this->isPingRequest()) { - // on a ping request that is received before the standard visit length, we just update the visit time w/o adding a new action - Common::printDebug("-> ping=1 request: we do not track a new action nor a new visit nor any goal."); + $goalManager = new GoalManager($this->request); + $isManualGoalConversion = $goalManager->isManualGoalConversion(); + $requestIsEcommerce = $goalManager->requestIsEcommerce; - $action = null; - $this->visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', false); - $this->visitProperties->setRequestMetadata('Goals', 'visitIsConverted', false); - } else { - - $goalManager = new GoalManager($this->request); - - $isManualGoalConversion = $goalManager->isManualGoalConversion(); - $requestIsEcommerce = $goalManager->requestIsEcommerce; + if (!empty($action)) { if (!$requestIsEcommerce && !$isManualGoalConversion) { - // normal page view, potentially triggering a URL matching goal - $action = Action::factory($this->request); - - $action->writeDebugInfo(); $someGoalsConverted = $goalManager->detectGoalsMatchingUrl($this->request->getIdSite(), $action); $this->visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', $someGoalsConverted); diff --git a/plugins/Actions/Tracker/ActionsRequestProcessor.php b/plugins/Actions/Tracker/ActionsRequestProcessor.php new file mode 100644 index 0000000000..5b19b0ac9f --- /dev/null +++ b/plugins/Actions/Tracker/ActionsRequestProcessor.php @@ -0,0 +1,31 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\Actions\Tracker; + +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; +use Piwik\Tracker\RequestProcessor; +use Piwik\Tracker\Visit\VisitProperties; + +/** + * TODO + * + * TODO: document request metadata here (ie, 'actions') + */ +class ActionsRequestProcessor extends RequestProcessor +{ + public function processRequestParams(VisitProperties $visitProperties, Request $request) + { + // normal page view, potentially triggering a URL matching goal + $action = Action::factory($request); + $action->writeDebugInfo(); + + $visitProperties->setRequestMetadata('Actions', 'action', $action); + } +}
\ No newline at end of file diff --git a/plugins/Actions/config/config.php b/plugins/Actions/config/config.php new file mode 100644 index 0000000000..293acee476 --- /dev/null +++ b/plugins/Actions/config/config.php @@ -0,0 +1,9 @@ +<?php + +return array( + + 'tracker.request.processors' => DI\add(array( + DI\get('Piwik\Plugins\Actions\Tracker\ActionsRequestProcessor'), + )), + +); diff --git a/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php b/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php index b5f0064728..41451a043e 100644 --- a/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php +++ b/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php @@ -29,6 +29,8 @@ class EcommerceRequestProcessor extends RequestProcessor if ($goalManager->isGoalAnOrder()) { $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', true); } + + $visitProperties->setRequestMetadata('Actions', 'action', null); // don't track actions when tracking ecommerce orders } } }
\ No newline at end of file diff --git a/plugins/Goals/Tracker/GoalsRequestProcessor.php b/plugins/Goals/Tracker/GoalsRequestProcessor.php index ac475e5733..0cadff1a21 100644 --- a/plugins/Goals/Tracker/GoalsRequestProcessor.php +++ b/plugins/Goals/Tracker/GoalsRequestProcessor.php @@ -32,6 +32,8 @@ class GoalsRequestProcessor extends RequestProcessor $visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', $someGoalsConverted); $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', $someGoalsConverted); + $visitProperties->setRequestMetadata('Actions', 'action', null); // don't track actions when doing manual goal conversions + // if we find a idgoal in the URL, but then the goal is not valid, this is most likely a fake request if (!$someGoalsConverted) { Common::printDebug('Invalid goal tracking request for goal id = ' . $goalManager->idGoal); diff --git a/plugins/Heartbeat/Heartbeat.php b/plugins/Heartbeat/Heartbeat.php new file mode 100644 index 0000000000..688ac72c65 --- /dev/null +++ b/plugins/Heartbeat/Heartbeat.php @@ -0,0 +1,19 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\Heartbeat; + +use Piwik\Plugin; + +class Heartbeat extends Plugin +{ + public function isTrackerPlugin() + { + return true; + } +} diff --git a/plugins/Heartbeat/Tracker/PingRequestProcessor.php b/plugins/Heartbeat/Tracker/PingRequestProcessor.php new file mode 100644 index 0000000000..44224ce0ab --- /dev/null +++ b/plugins/Heartbeat/Tracker/PingRequestProcessor.php @@ -0,0 +1,37 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ +namespace Piwik\Plugins\Heartbeat\Tracker; + +use Piwik\Common; +use Piwik\Tracker\Request; +use Piwik\Tracker\RequestProcessor; +use Piwik\Tracker\Visit\VisitProperties; + +/** + * TODO + */ +class PingRequestProcessor extends RequestProcessor +{ + public function processRequestParams(VisitProperties $visitProperties, Request $request) + { + if ($this->isPingRequest($request)) { + // on a ping request that is received before the standard visit length, we just update the visit time w/o adding a new action + Common::printDebug("-> ping=1 request: we do not track a new action nor a new visit nor any goal."); + + $visitProperties->setRequestMetadata('Actions', 'action', null); + + $visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', false); + $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', false); + } + } + + private function isPingRequest(Request $request) + { + return $request->getParam('ping') == 1; + } +}
\ No newline at end of file diff --git a/plugins/Heartbeat/config/config.php b/plugins/Heartbeat/config/config.php new file mode 100644 index 0000000000..6f7a1417ab --- /dev/null +++ b/plugins/Heartbeat/config/config.php @@ -0,0 +1,9 @@ +<?php + +return array( + + 'tracker.request.processors' => DI\add(array( + DI\get('Piwik\Plugins\Heartbeat\Tracker\PingRequestProcessor'), + )), + +); diff --git a/plugins/Heartbeat/plugin.json b/plugins/Heartbeat/plugin.json new file mode 100644 index 0000000000..3d028b75db --- /dev/null +++ b/plugins/Heartbeat/plugin.json @@ -0,0 +1,3 @@ +{ + "description": "Handles ping tracker requests." +}
\ No newline at end of file |