Procurar

Categorias

Posts recentes

Arquivo

Blog feeds

Bookmarks


Mostrando os posts do seu blog em seu website
segunda, 1 de janeiro de 2007

Tem tempo que não escrevo nada por aqui… Bem, fim de ano é sempre uma confusão, né? Mas para coroar um ano produtivo estou aqui, escrevendo em pleno 31 de dezembro!

Desde que comecei a blogar (já descobri que trata-se de um vício), tinha vontade de mostrar links para os últimos posts do blog no meu site. Procurei no forum do blogsome e pela rede, mas não achei nada interessante (sei que deve haver algo). Enfim, resolvi fazer meu próprio script, mas como acessar os dados num banco de dados que não me dá acesso? Quando achei a solução me senti até um pouco burro. Claro, os feeds RSS. Lá está o conteúdo que eu queria e bem acessível (sem comentários). Vamos por partes, como faria Jack.

O script deve mostrar uma relação de links como no próprio blog, mas há certas funcionalidades no blog que devem ser reproduzidas aqui:

  • Definir um tamanho máximo para o título, sem dividir palavras.
  • Definir um número máximo de links na lista.
  • Definir se o link abre na mesma ou em outra janela.
  • Poder apresentar essa lista de links de várias formas.
  • Poder definir a codificação do resultado (ISO, UTF, etc.).
  • Poder usar em qualquer blog WordPress (e outros?)

Tudo isso vai ser definido através de valores enviados via POST/GET (para usar com ajax) ou em variáveis declaradas antes de incluir o arquivo (para sistemas em PHP). No trecho abaixo vamos procurar por esses valores nos dois caminhos citados acima: em variáveis nomeadas e em $_REQUEST (POST + GET + COOKIE):

/* variáveis de configuração */

// codificação - padrão: ‘ISO-8859-1′
$charset = !empty($charset) ? $charset :
(empty($_REQUEST[’charset’]) ? ‘ISO-8859-1′ : $_REQUEST[’charset’]);

// target para os links - padrão: ‘_self’
$target = !empty($target) ? $target :
(empty($_REQUEST[’target’]) ? ‘_self’ : $_REQUEST[’target’]);

// tag de abertura - padrão: ‘’
$oarround = !empty($around) ? ‘<’.$around.’>’ :
(empty($_REQUEST[’arround’]) ? ‘’ : ‘<’.$_REQUEST[’arround’].’>’);

// tag de fechamento - padrão: ‘’
$carround = !empty($around) ? ‘</’.$around.’>’ :
(empty($_REQUEST[’arround’]) ? ‘’ : ‘</’.$_REQUEST[’arround’].’>’);

// limite de links na lista - padrão: 0 (sem limite)
$limit = !empty($limit) ? $limit :
(empty($_REQUEST[’limit’]) ? 0 : (int)$_REQUEST[’limit’]);

// limite de caracteres no link - padrão: 0 (sem limite)
$maxchars = !empty($maxchars) ? $maxchars :
(empty($_REQUEST[’maxchars’]) ? 0 : (int)$_REQUEST[’maxchars’]);

// URL do blog - obrigatório
$wp_url = !empty($blog) ? $blog :
(empty($_REQUEST[’blog’]) ? false : $_REQUEST[’blog’]);

O sistema vai trabalhar com o feed, portanto precisamos transformar a URL do blog de forma que aponte para o XML que contém o RSS. No WordPress, basta acrescentar a string ‘/feed/’ no final da URL. ‘http://seublog.wordpress.com’ vira ‘http://seublog.wordpress.com/feed/’ e pronto, temos todo o conteúdo em RSS.
Talvez esse sistema possa ser usado com outros servidores de weblogs apenas mudando o trecho abaixo…

// Se a URL enviada aponta para um XML,
// deixaremos ela como está, senão colocamos o ‘/feed/’.
// Se a URL enviada já é do feed, não haverá erro.
if($wp_url && preg_match("/^[^\n]+$/",$wp_url) && !preg_match("/\.xml$/",$wp_url))
$wp_url = preg_replace("/(\/feed)?\/*$/", "", $wp_url)."/feed/";

Faremos agora uma funçãozinha para reduzir os títulos dos posts, como acontece no WordPress, para manter um padrão de tamanho na lista de links. O caso é que não basta usar substr(). Não queremos cortar palavras….

// Recebe uma string e um inteiro representando
// o limite máximo de caracteres na string de retorno.
// Se a string de entrada excede o limite, palavras
// são retiradas do final até que ela atinja o tamanho
// esperado. Então ela é retornada, seguida de ‘…’
function truncate($str, $lim) {
$ret = "";
$arr = preg_split("/\s+/",$str);
 foreach($arr as $word) {
 $old = trim($ret);
 $ret .= " $word";
  if($lim > 0 && strlen(trim($ret)) >= $lim) return "$old…";
 }
return $str;
}

Precisamos agora de um sisteminha para ler o conteúdo que está em um arquivo XML e interpretá-lo. Essa será a função principal e já temos tudo que iremos precisar para que ela funcione.

Sempre que preciso ler um XML acabo baixando um script pronto e usando sem entender direito como ele trabalha… mas dessa vez fiz diferente. Incrível a economia de código que esse pequeno esforço proporcionou. Bem, segue a função, toda comentada:

// retorna uma string contendo uma lista de links para
// os posts recentes do blog indicado
function getBlog($xml = false) {
// traz as var. de configuração
global $charset, $target, $oarround,
       $carround, $limit, $maxchars;
// $xml pode ser uma URL ou um XML completo
$data = (preg_match("/<\?xml/",$xml) || !$xml) ?
          $xml : join('’,file($xml));
  if(!$data) return ‘Erro na leitura do XML’;
// eliminando espaços entre tags ou
// em tags com conteúdos vazios
$data = preg_replace("/>[\s\r\n\t]*</", "><", $data, -1);
$items = ""; // string de retorno
$vals = array(); // vai receber o conteúdo do XML
// vai receber as referências para usar $vals
$index = array();
// cria o parser na codificação definida
$parser = xml_parser_create($charset);
// evita problemas…
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $charset);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
// transfere o conteúdo para o array $vals, colocando
// uma referência dos índices em $index
if(!@xml_parse_into_struct($parser, $data, &$vals, &$index))
return "Erro na estrutura do XML";
xml_parser_free($parser);
// for a partir de 1, para excluir o título do blog.
// A 1ª ocorrência de uma tag TITLE é como filha de
// CHANNEL, mas só nos interessa TITLE se for filha
// de ITEM. Como CHANNEL só pode ter uma tag TITLE,
// o método de começar o loop do 1 funcionou bem.
for($i = 1; $i < count($index[’TITLE’]); $i++) {
// título
$f_title = $vals[$index[’TITLE’][$i]][’value’];
// título reduzido
$f_trunc = truncate($f_title, $maxchars);
// URL do link
$f_link = $vals[$index[’LINK’][$i]][’value’];
// alimenta $items com um link completo
$items .= $oarround.’<a href="’.$f_link.’" target="’.
          $target.’" title="’.$f_title.’">’.$f_trunc.
          ’</a>’.$carround.’ ‘;
  // interrompe se o limite foi atingido
  if($limit > 0 && $i >= $limit) break;
}
return $items;
}

Restou apenas executar isso tudo. É, essa função não vai ser chamada de algum lugar, o script deve se executar ao ser incluído ou chamado via XMLHttpRequest.

print $wp_url ? getBlog($wp_url) :
                "Informe a URL do blog";

Agora basta juntar isso tudo e está feito! eu chamei de wp-posts.php, mas você pode chamá-lo como quiser.

Veja dois exemplos de como usar o sistema:

// Javascript - assumindo que $(’recentposts’) aponta
// para um <UL> e que ajax é nosso objeto Ajax
function getPosts() {
$(’recentposts’).innerHTML = ‘<li>Carregando…</li>’;
var ajx = new ajax();
ajx.sendLoad("../php/wp-posts.php?blog=blog.xml&arround=li&maxchars=20&charset=UTF-8&limit=12", null,
//ajx.sendLoad("http://site.com/wp-posts.php?"+
                "blog=http://blog.blogsome.com"+
                "&arround=li"+
                "&maxchars=20"+
                "&charset=UTF-8",
                function(txt) {
                $(’recentposts’).innerHTML = txt;
                });
}

<?php
// PHP
$blog = ‘http://blog.blogsome.com/’;
$maxchars = 20;
$limit = 6;
$around = ‘li’;
include "wp-posts.php";
?>

0 Comentários »

Feeds para os comentários nesse post:
TrackBack: http://cauguanabara.blogsome.com/2007/01/01/mostrando-os-posts-do-seu-blog-em-seu-website/trackback/

Nenhum comentário

Say something! »















Por favor digite o texto da imagem acima.

lamp! Mapa do site
Mostrando os posts do seu blog em seu website