Zobrazení nejčtenějších článků ve WordPressu přes API Google Analytics
Již několik let spravuji portály mediální společnosti Media Networks ceska-justice.cz, zdravotnickydenik.cz a ekonomickydenik.cz,
Návštěvnost na těchto webech během posledního roku díky spolupráci se Seznam.cz výrazně vzrostla, a to ve špičkách až na 250 000 unikátních návštěvníků denně na některém z webů. To znamenalo kromě migrace na kvalitní a optimalizovaný server i optimalizaci některých funckionalit na webech.
Jednou z malých, ale užitečných funkcionalit na webu, je zobrazení nejčtenějších článků v sidebaru. Na to běžně ve WordPressu používám plugin WordPress Popular Posts, který funguje výborně i na velkých webech. Některé z databázových dotazů v pluginu ale nejsou optimalizované, a při takovém počtu návštěv jako je na webech Media Networks trvaly dotazy do databáze i několik desítek sekund.
Bylo by samozřejmě možné dotazy v pluginu optimalizovat, ale rozhodl jsem se pro elegantnější řešení, a to načítání nejčtenějších článků ve WordPressu přes API Google Analytics.
Google Analytics má Reporting API, které umožňuje dynamicky načítat data z Google analytics přes API. Má také PHP knihovnu a podrobný popis na její základní instalaci.
Na kód, který zařídí propojení WordPress a Google Analytics se můžete podívat níže.
<?php namespace Media_Networks_Google_Api; use Media_Networks_Google_Api\Core\Component; class Api extends Component { public function setup() { if ( ! isset($_GET['save-ga'])) { return; } $this->saveGaData(); } /** * Save Googla Analytics most viewed pages to an option * @throws \Google_Exception */ public function saveGaData() { // Initialize the Analytics object $analytics = $this->initializeAnalytics(); // Get the report /** @var \Google_Service_AnalyticsReporting_GetReportsResponse $response */ $response = $this->getReport($analytics); // Save the data if ($response && ! empty($response->getReports())) { $this->saveData($response); } } /** * Save the data * * @param \Google_Service_AnalyticsReporting_GetReportsResponse $response */ public function saveData(\Google_Service_AnalyticsReporting_GetReportsResponse $response) { $most_viewed = []; foreach ($response->getReports()[0]->getData()->getRows() as $row) { /** @var $row \Google_Service_AnalyticsReporting_ReportRow */ // We have only one dimension $url = $row->getDimensions()[0]; if ($url == '/') { continue; } $urls = explode('/', $url); $slug = end($urls) == '' ? $urls[sizeof($urls) - 2] : end($urls); $p = get_page_by_path($slug, 'OBJECT', 'post'); if ($p) { $most_viewed[] = $p->ID; } } update_option('mn_most_viewed', $most_viewed); die(var_dump($most_viewed)); } /** * @return \Google_Service_AnalyticsReporting * @throws \Google_Exception */ public function initializeAnalytics() { $key_file = $this->plugin->get_asset_path('credentials.json'); $client = new \Google_Client(); $client->setApplicationName("Analytics Reporting"); $client->setAuthConfig($key_file); $client->setScopes(['https://www.googleapis.com/auth/analytics.readonly']); return new \Google_Service_AnalyticsReporting($client); } /** * Queries the Analytics Reporting API V4. * * @param \Google_Service_AnalyticsReporting service An authorized Analytics Reporting API V4 service object. * * @return \Google_Service_AnalyticsReporting_GetReportsResponse` */ public function getReport($analytics) { // Create the DateRange object. $dateRange = new \Google_Service_AnalyticsReporting_DateRange(); $dateRange->setStartDate("7daysAgo"); $dateRange->setEndDate("today"); // Create the Metrics object. $sessions = new \Google_Service_AnalyticsReporting_Metric(); $sessions->setExpression("ga:pageviews"); $sessions->setAlias("views"); $dimension = new \Google_Service_AnalyticsReporting_Dimension(); $dimension->setName('ga:PagePath'); $orderby = new \Google_Service_AnalyticsReporting_OrderBy(); $orderby->setFieldName('ga:pageviews'); $orderby->setOrderType('VALUE'); $orderby->setSortOrder("DESCENDING"); // Create the ReportRequest object. $request = new \Google_Service_AnalyticsReporting_ReportRequest(); $request->setViewId('999888777'); $request->setDateRanges($dateRange); $request->setDimensions([$dimension]); $request->setMetrics(array($sessions)); $request->setOrderBys(array($orderby)); $body = new \Google_Service_AnalyticsReporting_GetReportsRequest(); $body->setReportRequests(array($request)); return $analytics->reports->batchGet($body); } }
Pokud budete mít zájem o integraci Google Analytics a WordPress přes API, nebo API integraci jiných služeb a WordPressu, neváhejte se na mě obrátit
Václav Greif se programování pro Wordpress věnuje více než 16 let. Za tu dobu nasbíral mnoho zkušeností s tvorbou pluginů pro Wordpress, úpravou šablon a programováním komplexních funkcionalit. Věnuje se programování pro Wordpress a školení programátorů.