diff options
author | diosmosis <diosmosis@users.noreply.github.com> | 2019-05-10 11:50:56 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-10 11:50:56 +0300 |
commit | c6eb52339f3fc496ac43b55c4a0de8d161edbff4 (patch) | |
tree | c05d34d97ea14cdb454e5ca3ff961c9449e53095 /plugins | |
parent | a4c8dc92994ccfd5775d080a4f63cb095ab95e19 (diff) |
Overwrite direct entry referrer information if campaign referrer is found in later request. (#14273)
* Overwrite direct entry referrer information if campaign referrer is found in later request.
* Update for non-campaign referrers as well.
* test comment tweaks
* Add current tracking URL into site urls in case website has no main url.
* Fix a couple issues and start adding tests.
* More tests and a fix.
* Apply review feedback.
* Fix couple tests.
* Fix referrer tests.
* try to fix random failure
* Add note to README.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/Referrers/Columns/Base.php | 14 | ||||
-rw-r--r-- | plugins/Referrers/Columns/Campaign.php | 4 | ||||
-rw-r--r-- | plugins/Referrers/Columns/Keyword.php | 12 | ||||
-rw-r--r-- | plugins/Referrers/Columns/ReferrerName.php | 12 | ||||
-rw-r--r-- | plugins/Referrers/Columns/ReferrerType.php | 12 | ||||
-rw-r--r-- | plugins/Referrers/Columns/ReferrerUrl.php | 13 | ||||
-rw-r--r-- | plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php | 50 | ||||
-rw-r--r-- | plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php | 58 | ||||
-rw-r--r-- | plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php | 65 | ||||
-rw-r--r-- | plugins/SitesManager/SiteUrls.php | 60 |
10 files changed, 265 insertions, 35 deletions
diff --git a/plugins/Referrers/Columns/Base.php b/plugins/Referrers/Columns/Base.php index 0abe38c8fe..31f4562ad5 100644 --- a/plugins/Referrers/Columns/Base.php +++ b/plugins/Referrers/Columns/Base.php @@ -96,7 +96,7 @@ abstract class Base extends VisitDimension $referrerDetected = $this->detectReferrerCampaign($request, $visitor); if (!$referrerDetected) { - if ($this->detectReferrerDirectEntry() + if ($this->detectReferrerDirectEntry($request) || $this->detectReferrerSearchEngine() || $this->detectReferrerSocialNetwork() ) { @@ -111,6 +111,8 @@ abstract class Base extends VisitDimension $urlsByHost = $this->getCachedUrlsByHostAndIdSite(); $directEntry = new SiteUrls(); + $directEntry->addRequestUrlToSiteUrls($urlsByHost, $request); + $path = $directEntry->getPathMatchingUrl($this->referrerUrlParse, $urlsByHost); if (!empty($path) && $path !== '/') { $this->nameReferrerAnalyzed .= rtrim($path, '/'); @@ -337,7 +339,7 @@ abstract class Base extends VisitDimension * it is considered a direct entry * @return bool */ - protected function detectReferrerDirectEntry() + protected function detectReferrerDirectEntry(Request $request) { if (empty($this->referrerHost)) { return false; @@ -346,6 +348,8 @@ abstract class Base extends VisitDimension $urlsByHost = $this->getCachedUrlsByHostAndIdSite(); $directEntry = new SiteUrls(); + $directEntry->addRequestUrlToSiteUrls($urlsByHost, $request); + $matchingSites = $directEntry->getIdSitesMatchingUrl($this->referrerUrlParse, $urlsByHost); if (isset($matchingSites) && is_array($matchingSites) && in_array($this->idsite, $matchingSites)) { @@ -602,4 +606,10 @@ abstract class Base extends VisitDimension { return Common::mb_substr($refererKeyword, 0, 255); } + + protected function isCurrentReferrerDirectEntry(Visitor $visitor) + { + $referrerType = $visitor->getVisitorColumn('referer_type'); + return $referrerType == Common::REFERRER_TYPE_DIRECT_ENTRY; + } } diff --git a/plugins/Referrers/Columns/Campaign.php b/plugins/Referrers/Columns/Campaign.php index 158876a7ef..30c7cc609a 100644 --- a/plugins/Referrers/Columns/Campaign.php +++ b/plugins/Referrers/Columns/Campaign.php @@ -48,8 +48,12 @@ class Campaign extends Base $information = $this->getReferrerInformationFromRequest($request, $visitor); + // we force a new visit if the referrer is a campaign and it's different than the currently recorded referrer. + // if the current referrer is 'direct entry', however, we assume the referrer information was sent in a later request, and + // we just update the existing referrer information instead of creating a visit. if ($information['referer_type'] == Common::REFERRER_TYPE_CAMPAIGN && $this->isReferrerInformationNew($visitor, $information) + && !$this->isCurrentReferrerDirectEntry($visitor) ) { Common::printDebug("Existing visit detected, but creating new visit because campaign information is different than last action."); diff --git a/plugins/Referrers/Columns/Keyword.php b/plugins/Referrers/Columns/Keyword.php index 777965023a..523f0d16b1 100644 --- a/plugins/Referrers/Columns/Keyword.php +++ b/plugins/Referrers/Columns/Keyword.php @@ -36,6 +36,18 @@ class Keyword extends Base return $information['referer_keyword']; } + public function onExistingVisit(Request $request, Visitor $visitor, $action) + { + $information = $this->getReferrerInformationFromRequest($request, $visitor); + if ($this->isCurrentReferrerDirectEntry($visitor) + && $information['referer_type'] != Common::REFERRER_TYPE_DIRECT_ENTRY + ) { + return $information['referer_keyword']; + } + + return false; + } + /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Referrers/Columns/ReferrerName.php b/plugins/Referrers/Columns/ReferrerName.php index 3420c36ea8..fbf38804b2 100644 --- a/plugins/Referrers/Columns/ReferrerName.php +++ b/plugins/Referrers/Columns/ReferrerName.php @@ -37,6 +37,18 @@ class ReferrerName extends Base return $information['referer_name']; } + public function onExistingVisit(Request $request, Visitor $visitor, $action) + { + $information = $this->getReferrerInformationFromRequest($request, $visitor); + if ($this->isCurrentReferrerDirectEntry($visitor) + && $information['referer_type'] != Common::REFERRER_TYPE_DIRECT_ENTRY + ) { + return $information['referer_name']; + } + + return false; + } + /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Referrers/Columns/ReferrerType.php b/plugins/Referrers/Columns/ReferrerType.php index e7a237ee82..1156a44d5c 100644 --- a/plugins/Referrers/Columns/ReferrerType.php +++ b/plugins/Referrers/Columns/ReferrerType.php @@ -55,6 +55,18 @@ class ReferrerType extends Base return $information['referer_type']; } + public function onExistingVisit(Request $request, Visitor $visitor, $action) + { + $information = $this->getReferrerInformationFromRequest($request, $visitor); + if ($this->isCurrentReferrerDirectEntry($visitor) + && $information['referer_type'] != Common::REFERRER_TYPE_DIRECT_ENTRY + ) { + return $information['referer_type']; + } + + return false; + } + /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Referrers/Columns/ReferrerUrl.php b/plugins/Referrers/Columns/ReferrerUrl.php index 2e7aa0ba63..738ba3d868 100644 --- a/plugins/Referrers/Columns/ReferrerUrl.php +++ b/plugins/Referrers/Columns/ReferrerUrl.php @@ -8,6 +8,7 @@ */ namespace Piwik\Plugins\Referrers\Columns; +use Piwik\Common; use Piwik\Tracker\Request; use Piwik\Tracker\Visitor; use Piwik\Tracker\Action; @@ -35,4 +36,16 @@ class ReferrerUrl extends Base return $information['referer_url']; } + + public function onExistingVisit(Request $request, Visitor $visitor, $action) + { + $information = $this->getReferrerInformationFromRequest($request, $visitor); + if ($this->isCurrentReferrerDirectEntry($visitor) + && $information['referer_type'] != Common::REFERRER_TYPE_DIRECT_ENTRY + ) { + return $information['referer_url']; + } + + return false; + } } diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php index 1e7e4af8cb..8bb3685b8f 100644 --- a/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php +++ b/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php @@ -8,6 +8,7 @@ namespace Piwik\Plugins\Referrers\tests\Integration\Columns; +use Piwik\Common; use Piwik\Plugins\Referrers\Columns\Keyword; use Piwik\Tests\Framework\Fixture; use Piwik\Tests\Framework\TestCase\IntegrationTestCase; @@ -29,6 +30,7 @@ class ReferrerKeywordTest extends IntegrationTestCase private $keyword; private $idSite1 = 1; private $idSite2 = 2; + private $idSite3 = 3; public function setUp() { @@ -38,7 +40,8 @@ class ReferrerKeywordTest extends IntegrationTestCase $ecommerce = false; Fixture::createWebsite($date, $ecommerce, $name = 'test1', $url = 'http://piwik.org/'); - Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.xyz/'); + Fixture::createWebsite($date, $ecommerce, $name = 'test2', $url = 'http://piwik.xyz/'); + Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = null); $this->keyword = new Keyword(); } @@ -84,9 +87,54 @@ class ReferrerKeywordTest extends IntegrationTestCase // search engine should have keyword the search term array('piwik', $this->idSite2, $url, 'http://google.com/search?q=piwik'), + + // site w/o url + array($noReferrerKeyword, $this->idSite3, $url, $directReferrer . '/'), ); } + /** + * @dataProvider getTestDataForOnExistingVisit + */ + public function test_onExistingVisit_shouldSometimesOverwriteReferrerInfo($expectedKeyword, $idSite, $url, $referrerUrl, $existingType) + { + $request = $this->getRequest(array('idsite' => $idSite, 'url' => $url, 'urlref' => $referrerUrl)); + $visitor = $this->getNewVisitor(); + $visitor->setVisitorColumn('referer_type', $existingType); + $keyword = $this->keyword->onExistingVisit($request, $visitor, $action = null); + + $this->assertSame($expectedKeyword, $keyword); + } + + public function getTestDataForOnExistingVisit() + { + return [ + // direct entry => campaign + ['campaignkey1', $this->idSite2, 'http://piwik.xyz/abc?pk_campaign=testfoobar&pk_keyword=campaignkey1', 'http://piwik.org', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // direct entry => website + ['piwik2', $this->idSite2, 'http://piwik.xyz/abc', 'http://google.com/search?q=piwik2', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // direct entry => direct entry + [false, $this->idSite2, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // website => direct entry + [false, $this->idSite2, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE], + + // campaign => direct entry + [false, $this->idSite2, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_CAMPAIGN], + + // direct entry => website (site w/o url) + ['piwik3', $this->idSite3, 'http://piwik.xyz/abc', 'http://google.com/search?q=piwik3', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // direct entry => direct entry (site w/o url) + [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // website => direct entry (site w/o url) + [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE], + ]; + } + private function getRequest($params) { return new Request($params); diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php index cd1610a178..d2d638d980 100644 --- a/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php +++ b/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php @@ -8,6 +8,7 @@ namespace Piwik\Plugins\Referrers\tests\Integration\Columns; +use Piwik\Common; use Piwik\Plugins\Referrers\Columns\ReferrerName; use Piwik\Plugins\Referrers\Columns\ReferrerType; use Piwik\Tests\Framework\Fixture; @@ -32,6 +33,7 @@ class ReferrerNameTest extends IntegrationTestCase private $idSite1 = 1; private $idSite2 = 2; private $idSite3 = 3; + private $idSite4 = 4; public function setUp() { @@ -45,6 +47,7 @@ class ReferrerNameTest extends IntegrationTestCase 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.xyz/'); + Fixture::createWebsite($date, $ecommerce, $name = 'test4', $url = null); $this->referrerName = new ReferrerName(); } @@ -77,21 +80,21 @@ class ReferrerNameTest extends IntegrationTestCase return array( // domain matches but path does not match for idsite1 - array('piwik.org', $this->idSite1, $url, $referrer), - array('piwik.org', $this->idSite1, $url, $referrer . '/'), + array(null, $this->idSite1, $url, $referrer), + array(null, $this->idSite1, $url, $referrer . '/'), // idSite2 matches any piwik.org path so this is a direct entry for it array($directEntryReferrerName, $this->idSite2, $url, $referrer), array($directEntryReferrerName, $this->idSite2, $url, $referrer . '/'), // idSite3 has different domain so it is coming from different website - array('piwik.org', $this->idSite3, $url, $referrer), - array('piwik.org', $this->idSite3, $url, $referrer . '/'), + array(null, $this->idSite3, $url, $referrer), + array(null, $this->idSite3, $url, $referrer . '/'), array($directEntryReferrerName, $this->idSite1, $url, $referrer . '/foo/bar/baz'), array($directEntryReferrerName, $this->idSite1, $url, $referrer . '/foo/bar/baz/'), array($directEntryReferrerName, $this->idSite1, $url, $referrer . '/foo/bar/baz?x=5'), array($directEntryReferrerName, $this->idSite1, $url, $referrer . '/fOo/BaR/baz?x=5'), // /not/xyz belongs to different website - array('piwik.org', $this->idSite1, $url, $referrer . '/not/xyz'), + array(null, $this->idSite1, $url, $referrer . '/not/xyz'), array($directEntryReferrerName, $this->idSite2, $url, $referrer . '/not/xyz'), // /foo/bar/baz belongs to different website @@ -113,9 +116,54 @@ class ReferrerNameTest extends IntegrationTestCase // testing case where domain of referrer is not known to any site but neither is the URL, url != urlref array('example.com', $this->idSite3, 'http://example.org', 'http://example.com/bar'), + + // site w/o url + array($directEntryReferrerName, $this->idSite4, $url, $referrer . '/'), ); } + /** + * @dataProvider getTestDataForOnExistingVisit + */ + public function test_onExistingVisit_shouldSometimesOverwriteReferrerInfo($expectedName, $idSite, $url, $referrerUrl, $existingType) + { + $request = $this->getRequest(array('idsite' => $idSite, 'url' => $url, 'urlref' => $referrerUrl)); + $visitor = $this->getNewVisitor(); + $visitor->setVisitorColumn('referer_type', $existingType); + $name = $this->referrerName->onExistingVisit($request, $visitor, $action = null); + + $this->assertSame($expectedName, $name); + } + + public function getTestDataForOnExistingVisit() + { + return [ + // direct entry => campaign + ['testfoobar', $this->idSite3, 'http://piwik.xyz/abc?pk_campaign=testfoobar', 'http://piwik.org', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // direct entry => website + ['piwik.org', $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.org', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // direct entry => direct entry + [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // website => direct entry + [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE], + + // campaign => direct entry + [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_CAMPAIGN], + + // direct entry => website (site w/o url) + ['piwik.org', $this->idSite4, 'http://piwik.xyz/abc', 'http://piwik.org/', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // direct entry => direct entry (site w/o url) + [false, $this->idSite4, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // website => direct entry (site w/o url) + [false, $this->idSite4, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE], + ]; + } + private function getRequest($params) { return new Request($params); diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php index 207736934e..fb9323754d 100644 --- a/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php +++ b/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php @@ -33,6 +33,7 @@ class ReferrerTypeTest extends IntegrationTestCase private $idSite2 = 2; private $idSite3 = 3; private $idSite4 = 4; + private $idSite5 = 5; public function setUp() { @@ -47,6 +48,7 @@ class ReferrerTypeTest extends IntegrationTestCase Fixture::createWebsite($date, $ecommerce, $name = 'test2', $url = 'http://piwik.org/'); Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.xyz/'); Fixture::createWebsite($date, $ecommerce, $name = 'test4', $url = 'http://google.com/subdir/', 1, null, null, null, null, $excludeUnknownUrls = 1); + Fixture::createWebsite($date, $ecommerce, $name = 'test5', $url = null); $this->referrerType = new ReferrerType(); } @@ -78,20 +80,20 @@ class ReferrerTypeTest extends IntegrationTestCase // $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 . '/'), + array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite1, $url, $referrer), + array(Common::REFERRER_TYPE_DIRECT_ENTRY, $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->idSite3, $url, $referrer), + array(Common::REFERRER_TYPE_DIRECT_ENTRY, $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->idSite1, $url, $referrer . '/not/xyz'), array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite2, $url, $referrer . '/not/xyz'), // /foo/bar/baz belongs to different website @@ -120,18 +122,63 @@ class ReferrerTypeTest extends IntegrationTestCase ####### testing specific case: ## - ignore unknown urls is activated for idSite4 - // referrer comes from another subdir, but same host => external website - array(Common::REFERRER_TYPE_WEBSITE, $this->idSite4, 'http://google.com/subdir/site', 'http://google.com/base'), + // referrer comes from another subdir, but same host => direct entry + array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite4, 'http://google.com/subdir/site', 'http://google.com/base'), // referrer comes from same subdir and host => direct entry array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite4, 'http://google.com/subdir/page', 'http://google.com/subdir/x'), array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite4, 'http://google.com/subdir/', 'http://google.com/subdir/?q=test'), // referrer comes from another subdir, but same host, query matches search engine definition => search engine - array(Common::REFERRER_TYPE_SEARCH_ENGINE, $this->idSite4, 'http://google.com/subdir/index.html', 'http://google.com/search?q=test'), + array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite4, 'http://google.com/subdir/index.html', 'http://google.com/search?q=test'), // referrer comes from search engine not matching site - array(Common::REFERRER_TYPE_SEARCH_ENGINE, $this->idSite4, 'http://google.com/subdir/index.html', 'http://google.fr/search?q=test') + array(Common::REFERRER_TYPE_SEARCH_ENGINE, $this->idSite4, 'http://google.com/subdir/index.html', 'http://google.fr/search?q=test'), + + // site w/o url + array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite5, $url, $referrer . '/'), ); } + /** + * @dataProvider getTestDataForOnExistingVisit + */ + public function test_onExistingVisit_shouldSometimesOverwriteReferrerInfo($expectedType, $idSite, $url, $referrerUrl, $existingType) + { + $request = $this->getRequest(array('idsite' => $idSite, 'url' => $url, 'urlref' => $referrerUrl)); + $visitor = $this->getNewVisitor(); + $visitor->setVisitorColumn('referer_type', $existingType); + $type = $this->referrerType->onExistingVisit($request, $visitor, $action = null); + + $this->assertSame($expectedType, $type); + } + + public function getTestDataForOnExistingVisit() + { + return [ + // direct entry => campaign + [Common::REFERRER_TYPE_CAMPAIGN, $this->idSite3, 'http://piwik.xyz/abc?pk_campaign=testfoobar', 'http://piwik.org', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // direct entry => website + [Common::REFERRER_TYPE_WEBSITE, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.org', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // direct entry => direct entry + [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // website => direct entry + [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE], + + // campaign => direct entry + [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_CAMPAIGN], + + // direct entry => website (site w/o url) + [Common::REFERRER_TYPE_WEBSITE, $this->idSite5, 'http://piwik.xyz/abc', 'http://piwik.org/', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // direct entry => direct entry (site w/o url) + [false, $this->idSite5, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY], + + // website => direct entry (site w/o url) + [false, $this->idSite5, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE], + ]; + } + private function getRequest($params) { return new Request($params); diff --git a/plugins/SitesManager/SiteUrls.php b/plugins/SitesManager/SiteUrls.php index 33e2e4844a..54153d42e0 100644 --- a/plugins/SitesManager/SiteUrls.php +++ b/plugins/SitesManager/SiteUrls.php @@ -10,6 +10,8 @@ namespace Piwik\Plugins\SitesManager; use Piwik\Cache; use Piwik\Common; +use Piwik\Tracker\Request; +use Piwik\Tracker\Visitor; class SiteUrls { @@ -51,35 +53,49 @@ class SiteUrls foreach ($siteUrls as $idSite => $urls) { $idSite = (int) $idSite; foreach ($urls as $url) { - $urlParsed = @parse_url($url); + $this->addUrlByHost($allUrls, $idSite, $url); + } + } - if ($urlParsed === false || !isset($urlParsed['host'])) { - continue; - } + $this->sortUrlsByHost($allUrls); - $host = $this->toCanonicalHost($urlParsed['host']); - $path = $this->getCanonicalPathFromParsedUrl($urlParsed); + return $allUrls; + } - if (!isset($allUrls[$host])) { - $allUrls[$host] = array(); - } + private function addUrlByHost(&$allUrls, $idSite, $url, $addPath = true) + { + $urlParsed = @parse_url($url); - if (!isset($allUrls[$host][$path])) { - $allUrls[$host][$path] = array(); - } + if ($urlParsed === false || !isset($urlParsed['host'])) { + return; + } - if (!in_array($idSite, $allUrls[$host][$path])) { - $allUrls[$host][$path][] = $idSite; - } - } + $host = $this->toCanonicalHost($urlParsed['host']); + $path = $this->getCanonicalPathFromParsedUrl($urlParsed); + + if (!isset($allUrls[$host])) { + $allUrls[$host] = array(); + } + + if (!$addPath) { + $path = '/'; + } + + if (!isset($allUrls[$host][$path])) { + $allUrls[$host][$path] = array(); } + if (!in_array($idSite, $allUrls[$host][$path])) { + $allUrls[$host][$path][] = $idSite; + } + } + + private function sortUrlsByHost(&$allUrls) + { foreach ($allUrls as $host => $paths) { uksort($paths, array($this, 'sortByPathDepth')); $allUrls[$host] = $paths; } - - return $allUrls; } public function getIdSitesMatchingUrl($parsedUrl, $urlsGroupedByHost) @@ -172,6 +188,14 @@ class SiteUrls return Cache::getLazyCache(); } + public function addRequestUrlToSiteUrls(&$allUrls, Request $request) + { + $idSite = $request->getIdSite(); + $url = $request->getParam('url'); + + $this->addUrlByHost($allUrls, $idSite, $url, $addPath = false); + } + private function sortByPathDepth($pathA, $pathB) { // list first the paths with most '/' , and list path = '/' last |