Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthieu Aubry <matt@piwik.org>2015-12-04 08:36:20 +0300
committerMatthieu Aubry <matt@piwik.org>2015-12-04 08:36:20 +0300
commit05852332f2a693b0cc313152fcb742fc063aa995 (patch)
tree13cc3bf7a46ba342d1171221a9dfc76cce0dd049 /plugins/Referrers
parent24839681ebba4d8cd021009b7261f459b91cca87 (diff)
parentea0ee79d05e7d27df4c360e5a28bcfa2834ab183 (diff)
Merge pull request #9320 from piwik/website_path
Added support to specify a path in a website URL and Piwik will consider the path during tracking
Diffstat (limited to 'plugins/Referrers')
-rw-r--r--plugins/Referrers/Columns/Base.php34
-rw-r--r--plugins/Referrers/Columns/Campaign.php2
-rw-r--r--plugins/Referrers/Referrers.php10
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php127
4 files changed, 163 insertions, 10 deletions
diff --git a/plugins/Referrers/Columns/Base.php b/plugins/Referrers/Columns/Base.php
index 900c7bba63..a7e7eaf1e3 100644
--- a/plugins/Referrers/Columns/Base.php
+++ b/plugins/Referrers/Columns/Base.php
@@ -12,6 +12,8 @@ use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugins\Referrers\SearchEngine AS SearchEngineDetection;
+use Piwik\Plugins\SitesManager\SiteUrls;
+use Piwik\Tracker\Cache;
use Piwik\Tracker\PageUrl;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visit;
@@ -251,20 +253,34 @@ abstract class Base extends VisitDimension
*/
protected function detectReferrerDirectEntry()
{
- if (!empty($this->referrerHost)) {
- // is the referrer host the current host?
- if (isset($this->currentUrlParse['host'])) {
- $currentHost = Common::mb_strtolower($this->currentUrlParse['host'], 'UTF-8');
- if ($currentHost == Common::mb_strtolower($this->referrerHost, 'UTF-8')) {
- $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY;
- return true;
- }
+ if (empty($this->referrerHost)) {
+ return false;
+ }
+
+ $cache = Cache::getCacheGeneral();
+
+ if (!empty($cache['allUrlsByHostAndIdSite'])) {
+ $directEntry = new SiteUrls();
+ $matchingSites = $directEntry->getIdSitesMatchingUrl($this->referrerUrlParse, $cache['allUrlsByHostAndIdSite']);
+
+ if (isset($matchingSites) && is_array($matchingSites) && in_array($this->idsite, $matchingSites)) {
+ $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY;
+ return true;
+ } elseif (isset($matchingSites)) {
+ return false;
}
- if (Visit::isHostKnownAliasHost($this->referrerHost, $this->idsite)) {
+ }
+
+ // fallback logic if the referrer domain is not known to any site to not break BC
+ if (isset($this->currentUrlParse['host'])) {
+ // this might be actually buggy if first thing tracked is eg an outlink and referrer is from that site
+ $currentHost = Common::mb_strtolower($this->currentUrlParse['host']);
+ if ($currentHost == Common::mb_strtolower($this->referrerHost)) {
$this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY;
return true;
}
}
+
return false;
}
diff --git a/plugins/Referrers/Columns/Campaign.php b/plugins/Referrers/Columns/Campaign.php
index ff2d5c2401..c29b622336 100644
--- a/plugins/Referrers/Columns/Campaign.php
+++ b/plugins/Referrers/Columns/Campaign.php
@@ -37,7 +37,7 @@ class Campaign extends Base
/**
* If we should create a new visit when the campaign changes, check if the campaign info changed and if so
- * force the tracker to create a new visit.
+ * force the tracker to create a new visit.i
*
* @param Request $request
* @param Visitor $visitor
diff --git a/plugins/Referrers/Referrers.php b/plugins/Referrers/Referrers.php
index ce8667929b..d262c79224 100644
--- a/plugins/Referrers/Referrers.php
+++ b/plugins/Referrers/Referrers.php
@@ -12,6 +12,7 @@ use Piwik\ArchiveProcessor;
use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
+use Piwik\Plugins\SitesManager\SiteUrls;
/**
* @see plugins/Referrers/functions.php
@@ -31,9 +32,18 @@ class Referrers extends \Piwik\Plugin
'Insights.addReportToOverview' => 'addReportToInsightsOverview',
'Live.getAllVisitorDetails' => 'extendVisitorDetails',
'Request.getRenamedModuleAndAction' => 'renameDeprecatedModuleAndAction',
+ 'Tracker.setTrackerCacheGeneral' => 'setTrackerCacheGeneral'
);
}
+ public function setTrackerCacheGeneral(&$cacheContent)
+ {
+ $siteUrls = new SiteUrls();
+ $urls = $siteUrls->getAllCachedSiteUrls();
+
+ return $cacheContent['allUrlsByHostAndIdSite'] = $siteUrls->groupUrlsByHost($urls);
+ }
+
public function renameDeprecatedModuleAndAction(&$module, &$action)
{
if($module == 'Referers') {
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
new file mode 100644
index 0000000000..0d5e0a68ca
--- /dev/null
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
@@ -0,0 +1,127 @@
+<?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\Referrers\tests\Integration\Columns;
+
+use Piwik\Common;
+use Piwik\Plugins\Referrers\Columns\ReferrerType;
+use Piwik\Tests\Framework\Fixture;
+use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
+use Piwik\Tracker\Cache;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visit\VisitProperties;
+use Piwik\Tracker\Visitor;
+
+/**
+ * @group Referrers
+ * @group ReferrerTypeTest
+ * @group Plugins
+ */
+class ReferrerTypeTest extends IntegrationTestCase
+{
+ /**
+ * @var ReferrerType
+ */
+ private $referrerType;
+ private $idSite1 = 1;
+ private $idSite2 = 2;
+ private $idSite3 = 3;
+
+ public function setUp()
+ {
+ parent::setUp();
+
+ Cache::clearCacheGeneral();
+
+ $date = '2012-01-01 00:00:00';
+ $ecommerce = false;
+
+ Fixture::createWebsite($date, $ecommerce, $name = 'test1', $url = 'http://piwik.org/foo/bar');
+ Fixture::createWebsite($date, $ecommerce, $name = 'test2', $url = 'http://piwik.org/');
+ Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.pro/');
+
+ $this->referrerType = new ReferrerType();
+ }
+
+ public function tearDown()
+ {
+ // clean up your test here if needed
+ Cache::clearCacheGeneral();
+
+ parent::tearDown();
+ }
+
+ /**
+ * @dataProvider getReferrerUrls
+ */
+ public function test_onNewVisit_shouldDetectCorrectReferrerType($expectedType, $idSite, $url, $referrerUrl)
+ {
+ $request = $this->getRequest(array('idsite' => $idSite, 'url' => $url, 'urlref' => $referrerUrl));
+ $type = $this->referrerType->onNewVisit($request, $this->getNewVisitor(), $action = null);
+
+ $this->assertSame($expectedType, $type);
+ }
+
+ public function getReferrerUrls()
+ {
+ $url = 'http://piwik.org/foo/bar';
+ $referrer = 'http://piwik.org';
+
+ // $expectedType, $idSite, $url, $referrerUrl
+ return array(
+ // domain matches but path does not match for idsite1
+ array(Common::REFERRER_TYPE_WEBSITE, $this->idSite1, $url, $referrer),
+ array(Common::REFERRER_TYPE_WEBSITE, $this->idSite1, $url, $referrer . '/'),
+ // idSite2 matches any piwik.org path so this is a direct entry for it
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite2, $url, $referrer),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite2, $url, $referrer . '/'),
+ // idSite3 has different domain so it is coming from different website
+ array(Common::REFERRER_TYPE_WEBSITE, $this->idSite3, $url, $referrer),
+ array(Common::REFERRER_TYPE_WEBSITE, $this->idSite3, $url, $referrer . '/'),
+
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite1, $url, $referrer . '/foo/bar/baz'),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite1, $url, $referrer . '/foo/bar/baz/'),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite1, $url, $referrer . '/foo/bar/baz?x=5'),
+ // /not/xyz belongs to different website
+ array(Common::REFERRER_TYPE_WEBSITE, $this->idSite1, $url, $referrer . '/not/xyz'),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite2, $url, $referrer . '/not/xyz'),
+
+ // /foo/bar/baz belongs to different website
+ array(Common::REFERRER_TYPE_WEBSITE, $this->idSite2, $url, $referrer . '/foo/bar/baz'),
+
+ // website as it is from different domain anyway
+ array(Common::REFERRER_TYPE_WEBSITE, $this->idSite3, $url, $referrer . '/foo/bar/baz'),
+
+ // should detect campaign independent of domain / path
+ array(Common::REFERRER_TYPE_CAMPAIGN, $this->idSite1, $url . '?pk_campaign=test', $referrer),
+ array(Common::REFERRER_TYPE_CAMPAIGN, $this->idSite2, $url . '?pk_campaign=test', $referrer),
+ array(Common::REFERRER_TYPE_CAMPAIGN, $this->idSite3, $url . '?pk_campaign=test', $referrer),
+
+ array(Common::REFERRER_TYPE_SEARCH_ENGINE, $this->idSite3, $url, 'http://google.com/search?q=piwik'),
+
+ // testing case for backwards compatibility where url has same domain as urlref but the domain is not known to any website
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite3, 'http://example.com/foo', 'http://example.com/bar'),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite3, 'http://example.com/foo', 'http://example.com'),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite3, 'http://example.com', 'http://example.com/bar'),
+
+ // testing case where domain of referrer is not known to any site but neither is the URL, url != urlref
+ array(Common::REFERRER_TYPE_WEBSITE, $this->idSite3, 'http://example.org', 'http://example.com/bar'),
+ );
+ }
+
+ private function getRequest($params)
+ {
+ return new Request($params);
+ }
+
+ private function getNewVisitor()
+ {
+ return new Visitor(new VisitProperties());
+ }
+
+}