Multiple Domain plugin for WordPress

For a few projects in the past, I had to find a way to make WordPress work with more than one domain. There are a couple plugins to do that, but they are outdated and/or don’t work well. So, I wrote this plugin.

Check this out: https://wordpress.org/plugins/multiple-domain/

Multiple Domain allows you having more than one domain in a single WordPress installation. This plugin doesn’t support more than one theme or advanced customizations for each domain. It’s only intended to enable constant navigation under many domains. For a more complex setup, there is WordPress Multisite (MU).

When there is more than one domain set in your host, all links and resources will point to the default domain. This is the default WordPress behavior. With Multiple Domain installed and properly configured, it’ll update all link on the fly. This way, the user navigation will be end-to-end under the same domain.

You can also set an optional base URL. If you want only a set of URL’s available under a given domain, you can use this restriction.

Photo credit: Roya Ann Miller

Solução : WordPress e imagens com acentuação no Safari

Já vi esse problema acontecer mais de uma vez e acredito que não tenha encontrado uma solução — ou até mesmo algum relato parecido — porque no inglês (idioma largamente usado com o WordPress) não existe acentuação. Mas nos países que falam Português (ou qualquer outro idioma que possua acentos), um usuário ou outro acaba usando acentuação em nomes de arquivo. Ao fazer o upload de um arquivo desses e usar uma função como a wp_get_attachment_image para exibir a imagem, ela não é carregada no Safari (ao menos no Mac OS X). Ainda não consegui descobrir o motivo exato, pois em outros navegadores funciona como esperado.

Enfim, a solução é bem simples e baseia-se em um filtro.

add_filter('wp_get_attachment_image_attributes', 'ck_image_attrs');

function ck_image_attrs($attrs)
{
  foreach ($attrs as $name => $value)
  {
    if ('src' != $name)
    {
      break;
    }
    $attrs[$name] = ck_fix_image_url($value);
  }
  return $attrs;
}

function ck_fix_image_url($url)
{
  $parts = parse_url($url);
  $path = explode('/', $parts['path']);
  $path = array_map('rawurlencode', $path);
  $path = implode('/', $path);
  return str_replace($parts['path'], $path, $url);
}

Separei a lógica na função ck_fix_image_url para que possa ser usada em conjunto com a wp_get_attachment_image_src, por exemplo.

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.

Displaying your latest Twitter entries

DISCLAIMER: The Twitter REST API v1 is no longer active.

Helping Carlos Eduardo from Webstandards blog, I’ve adjusted this coded posted at WPRecipes. We wanted to show the latest twitter entries in a WordPress blog.

You can show how many tweets you want with this updated code, instead of just the last one. Another improvement is the session-based cache to speed things up.

UPDATE: Due to charset compatibility I switched from regular expressions to json_decode function. It also makes the code smaller. Continue reading “Displaying your latest Twitter entries”