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ů.
