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

Přidat komentář