Ordenando posts por page view no WordPress

O WordPress não salva as visualizações (page views) dos posts no banco de dados ou qualquer outra forma, então não há como ordenar os posts pelo número de page views. Mas se você use o Google Analytics para mensurar as estatísticas de acesso do seu blog/site, é possível fazer uma integração simples que permite a ordenação, ou qualquer outra manipulação dos posts que você queira fazer, baseada em page views.

Antes de mais nada, para facilitar a integração, estamos usando algumas classes do Zend Framework. Você pode baixar os arquivos necessários no site oficial do framework: http://framework.zend.com/download/gdata.

Enfim, vamos ao código!

Ah! Importante: estou considerando que tudo isso acontece dentro do functions.php do seu tema, se você usar outro arquivo (um plugin, por exemplo), fique atento às bibliotecas externas — Zend — e caminhos, ok?

Para não sobrecarregar o servidor com chamadas constantes para os serviços do Google e nem depender de algum tipo de gatilho manual, incluí a função que carrega os dados de visualização em uma tarefa do WP Cron.

add_action('ck_ga_hourly', 'ck_ga_pageviews');

function ck_ga_cron()
{
  if ( ! wp_next_scheduled('ck_ga_hourly'))
  {
    wp_schedule_event(time(), 'hourly', 'ck_ga_hourly');
  }
}

add_action('wp', 'chefs_ga_cron');

No trecho abaixo é que, realmente, a mágica acontece. Ah! Um detalhe importante, estou considerando que você fez o download da Google’s Data API do site do Zend Framework e incluiu o conteúdo da pasta library no diretório do seu tema.

Você verá que é necessário configurar 4 variáveis importantes: o e-mail da sua conta no Google Analytics, a senha da sua conta, o nome da sua aplicação (de acordo com a documentação do Google, deve seguir o seguinte padrão companyName-applicationName-versionID) e, finalmente, o ID do perfil do Analytics (você consegue esse dado nas Configurações do Perfil, dentro do GA).

function ck_ga_pageviews()
{
  $path = dirname(__FILE__);
  set_include_path(get_include_path().PATH_SEPARATOR.$path);

  require_once 'Zend/Loader.php';
  Zend_Loader::loadClass('Zend_Gdata');
  Zend_Loader::loadClass('Zend_Gdata_Analytics');
  Zend_Loader::loadClass('Zend_Gdata_Query');
  Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

  try
  {
    $email = ''; // E-mail da sua conta no GA
    $password = ''; // Senha da sua conta no GA
    $service_name = Zend_Gdata_Analytics::AUTH_SERVICE_NAME;
    $application = 'minha-app-v1_0'; // Nome da sua aplicação
    $profile = '12345678'; // ID do perfil no GA

    $client = Zend_Gdata_ClientLogin::getHttpClient(
        $email, 
        $password, 
        $service_name, 
        null, 
        $application);
    $service = new Zend_Gdata_Analytics($client);

    // No loop abaixo estamos usando os parâmetros padrão da função
    // get_posts do WordPress, mas você pode definir um outro tipo
    // de post específico, ou status, ou qualquer outro critério.
    // Dê uma olhada na documentação do WordPress e veja todas os
    // parâmetros possíveis.
    foreach (get_posts() as $post)
    {
      $path = parse_url(get_permalink($post->ID), PHP_URL_PATH);
      $query = $service->newDataQuery()
          ->setProfileId($profile)
          ->addMetric(Zend_Gdata_Analytics_DataQuery::METRIC_PAGEVIEWS)
          ->setFilter(Zend_Gdata_Analytics_DataQuery::DIMENSION_PAGE_PATH.'=='.$path)
          ->setStartDate('2010-01-01') // Apenas uma data no passado
          ->setEndDate(date('Y-m-d'))
          ->setMaxResults(1);

      $result = $service->getDataFeed($query);
      if (count($result) > 0)
      {
        $row = $result->current();
        $pageviews = $row->getValue(Zend_Gdata_Analytics_DataQuery::METRIC_PAGEVIEWS);
        update_post_meta($post->ID, '_pageviews', $pageviews);
      }
      else if ( ! get_post_meta($post->ID, '_pageviews', true))
      {
        update_post_meta($post->ID, '_pageviews', 0);
      }
    }
  } catch (Exception $e) {
    // Nada de importante para se fazer...
  }
}

Links úteis:

Qualquer dúvida ou problema, use os comentários.

Advertisements