Regex em JavaScript para remover tags
Expressão regular em JavaScript para remover as tags de um texto:
text = text.replace(/<[^>]*>/g, "");
Onde text é o texto formatado com as tags.
Desenvolvedor Web
Marcelo Mesquita@msofficeus pretende continuar utilizando o Word para formatar HTML nos emails no Outlook 2010. Saiba mais em http://fixoutlook.org
Expressão regular em JavaScript para remover as tags de um texto:
text = text.replace(/<[^>]*>/g, "");
Onde text é o texto formatado com as tags.
Estive trabalhando no projeto Cultura Digital e não tem sido uma tarefa fácil. Grande parte da dificuldade que estamos tendo é atribuída ao BuddyPress. Ele não parece ter sido desenvolvido para o WordPress, suas tabelas e códigos (tanto interface quanto programação) não seguem um padrão semelhante ao do WordPress (”Code is Poetry”).
Me espantei na primeira vez que resolvi analisar a estrutura de dados do BuddyPress; vinte e uma tabelas novas criadas! A instalação original do WP utiliza apenas dez tabelas, a do WPMU necessita de dezesete, por que diabos o BP precisaria de vinte e uma só pra ele, resultando em trinta e oito no total (BP + WPMU).
Após gerar o modelo de dados do BP pude ter uma visão mais ampla da bobagem que haviam feito:
Nomes como ‘wp_bp_acivity_user_activity’, ‘wp_bp_acivity_user_activity_cached’, ‘bp_messages_messages’ ou ‘bp_messages_threads’ já eram em si um quebra-cabeça a ser decifrado.
Ao começar a trabalhar com as tabelas não pude deixar de notar a quantidade de campos ‘user_id’ espalhados por tabelas, de alguma forma, conectadas. O caso mais claro foi o das tabelas ‘bp_activity_user_activity’ e ‘bp_activity_user_activity_cached’ que já são ligados através do campo ‘item_id’ mas ambas possuem os campo ‘user_id’.
Outro caso que me fez perder alguns cabelos foi o da tabela ‘bp_messages_threads’ que apenas mantém a ligação das mensagens que são respostas a outras mensagens. Isso poderia ser feito simplesmente criando um auto-relacionamento na tabela ‘bp_messages_messages’.
Acredito que o pior de tudo foi descobrir que algumas tabelas criadas pelo BuddyPress nem precisavam existir, pois serviam para armazenar informações que podiam ser armazenadas nas tabelas do WordPress.
Destaco o conjunto de tabelas ‘bp_xprofile_fields’ e ‘bp_xprofile_data’ que server para adicionar novos campos ao perfil do usuário. Para passar uma idéia, uma única tabela do WordPress substitui essas duas do BuddyPress, o plugin Register Plus é um exemplo de como isso pode ser feito. O único motivo, que vejo para que o BuddyPress tenha feito essa separação, seria para obter ganhos em performance, mas o fato de existir um campo para cada dado me fez pensar que a performance estaria equilibrada já que na tabela ‘usermeta’ esses dados poderiam estar em forma de array e, assim, ocupariam um campo apenas.
Também não gostei da forma como o BuddyPress trata as atividades. Apesar das atividades do site serem o conjunto das atividades de cada usuário, os dados ficam duplicados em diferentes tabelas. Por exemplo: Ao alterar meu perfil uma nova atividade é cadastrada na tabela ‘bp_activity_user_activity’ e depois a mesma informação é cadastrada na tabela ‘bp_activity_sitewide’.
A codificação também ficou a desejar.
Diferente do WordPress onde as ‘template tags’ (funções que auxiliam a montagem do tema) praticamente não interferem na forma como o html é montado, no BuddyPress algumas ‘template tags’ carregam muito lixo e apresentam um visual pré-definido. Isso dificulta a personalização do tema pois força a alteração dos arquivos do BuddyPress para atingir um resultado esperado.
Por exemplo: a função que carrega os dados do perfil (xprofile_get_profile) monta uma tabela zebrada (uma linha clara outra escura), apenas com os dados informados e adiciona link a cada item. Mas a zebra que o BP monta é baseada nos dados que estão no banco, então se eu tiver deixado algum campo vazio a tabela acaba pulando uma cor deixando duas linhas claras e uma escura ou algo parecido. Se eu quiser corrigir essa zebra ou retirar os links dos dados eu precisarei criar uma função do zero para não ter que ‘hackear’ o BP.
Os temas são muito dependentes de funções definidas nos plugins. Essa questão é mais ou menos a mesma citada no item acima, imagine tentar criar uma nova função apenas para recuperar os membros ou pense na dor de cabeça que é ficar alternando entre plugins e tema para entender como tal trecho de código é montado.
O BuddyPress tem muito a evoluir antes de se tornar um sistema confiável, acredito que o principal é voltar os esforços para deixá-lo mais compatível com o seu hospedeiro, o WordPress. Assim poderá haver uma maior compatibilidade entre os plugins e temas, além de diminuir a curva de aprendizado para os desenvolvedores que já trabalham com o WordPress, o que, na minha opinião, poderá resultar em um impulso na comunidade BuddyPress.
Estou disponibilizando agora o modelo de banco do bp 1.0, assim como o modelo do WP e o modelo do WPMU, esse não é uma representação fiel do banco e sim uma visualização simplificada para consulta. Devido a quantidade de tabelas existentes no BuddyPress, mantive apenas a tabela ‘users’ do WPMU, pois é a nela que se concentram a maioria dos relacionamentos do BP. Além disso também fiquei por fazer alguns relacionamentos que estavam confusos e ambiguos.
No arquivo estão o xml para edição no DBDesigner e uma imagem no formato png, conforme a apresentada abaixo.
Pra quem acompanha o blog… semana passada eu fiquei sumido pois estava de mudança, ainda não me organizei completamente mas acho que já voltarei a escrever essa semana esse ano. =P
Após criar um widget o próximo passo é adicionar algumas opções a ele, tornando-o mais flexível para o usuário final. Utilizando como exemplo o plugin de posts mais quentes, digamos que você tenha definido a quantidade de cinco posts para serem apresentados mas um usuário queira mostrar apenas três. Para essas situações utilizamos a seguinte função:
register_widget_control('Nome do Widget', 'sua_funcao_de_configuracao', 'largura', 'altura')

Formulário de configuração do Widget
Essa função permite configurar as opções de seu widget onde ‘Nome do Widget’ é o nome do widget que deseja configurar (o mesmo que informou em ‘register_sidebar_widget’), ’sua_funcao_de_configuracao’ é a função que deve ser chamada para configurar o plugin e ‘largura’ e ‘altura’ são opcionais e se referem ao tamanho do formulário de configuração.
A sua função de configuração deve possuir um formulário com os campos de configuração e uma rotina para salvar esses dados no banco. O seu formulário não deve conter as tags ‘form’ nem ’submit’, pois eles são acrescentados automáticamente pelo WordPress de forma a englobar todos os widgets.
Vamos ver uma forma fácil de implementar essa configuração:
function configurar_posts_mais_quentes()
{
// Inicializa as variáveis necessárias
$options = array();
// Salvando as opções
if($_POST['salvar_posts_mais_quentes'])
{
$opcoes['quantidade'] = (int) $_POST['quantidade_de_posts_mais_quentes'];
// Valor padrão, caso nada tenha sido informado
if(empty($opcoes['quantidade'])) $opcoes['quantidade'] = 5;
update_option('posts_mais_quentes', $opcoes);
}
// Carregar as opções desse widget
$opcoes = get_option('posts_mais_quentes');
// Formulário
?>
<input type="hidden" name="salvar_posts_mais_quentes" value="1" />
<p>
<label for="quantidade_de_posts_mais_quentes">Quantidade:</label>
<input type="text" name="quantidade_de_posts_mais_quentes" maxlength="2" value="<?php print $opcoes['quantidade']; ?>" class="widefat" />
</p>
<?php
}
Explicando… começando na linha 18 ($opcoes = get_option(’posts_mais_quentes’)) carrega as opções desse widget do banco. Notem que usei a tabela ‘options’ do banco do WordPress para salvar as opções do plugins, como foi explicado no post plugins e banco de dados.
Agora vamos para o início do formulário na linha 22, onde adiciono um campo oculto (<input type=”hidden” name=”salvar_posts_mais_quentes” value=”1″ />) apenas para ter controle quando o formulário for enviado. Também adicionei um campo de texto na linha 26 (<input type=”text” name=”quantidade_de_posts_mais_quentes” maxlength=”2″ value=”<?php print $opcoes['quantidade']; ?>” class=”widefat” />) para que o usuário possa informar a quantidade de posts que devem aparecer em seu widget.
Voltando para a linha 7, analizo se o formulário foi enviado, checando se o campo oculto foi informado, então valido o dado recebido do formulário ($opcoes['quantidade'] = (int) $_POST['quantidade_de_posts_mais_quentes']) e, finalmente, salvo as informações no banco (update_option(’posts_mais_quentes’, $opcoes)). Notem também que as informações desse widget foram salvas como array, assim é possível armazenar todas as configurações em um único local, poupando quantidade de acesso ao banco e organizando os dados.
Tentei montar esse formulário da forma mais simples possível, além disso coloquei alguns comentários para facilitar o entendimento.
Mas não é só isso, depois de salvar as configurações desse widget ainda falta carregá-las na hora de montar o widget:
function posts_mais_quentes($args)
{
global $wpdb;
// Carregar as opções desse widget
$opcoes = get_option('posts_mais_quentes');
// Recuperando os posts
$hot_posts = $wpdb->get_results("SELECT ID, post_title, comment_count FROM {$wpdb->posts} ORDER BY comment_count DESC LIMIT {$opcoes['quantidade']}");
// Usando o modelo de widgets do tema
print $args['before_widget'];
print $args['before_title'] . "Mais Quentes" . $args['after_title'];
print "<ul>";
// Listando os posts mais quentes
foreach($hot_posts as $hot_post)
print "<li><a href='" . get_permalink($hot_post->ID) . "'>{$hot_post->post_title} ({$hot_post->comment_count})</a></li>";
print "</ul>";
print $args['after_widget'];
}
Essa função é a mesma do post anterior com duas pequenas alterações. Uma na linha 6, onde carrego as configurações salvas e na linha 9 onde uso a quantidade de posts informadas pelo usuário para limitar a consulta (LIMIT {$opcoes['quantidade']}).
É isso… crie novas possibilidades para seus widgets, os usuários finais possuem sempre gostos diversos, simplifique a vida deles. Abaixo coloco o código completo desse estudo com uma opção a mais para a escolha do título do widget.
<?php
/*
Plugin Name: Posts mais quentes
Description: Lista posts mais comentados
Version: 0.2
Author: Marcelo Mesquita
Author URI: http://www.marcelomesquita.com/
*/
// Posts Mais Quentes
function posts_mais_quentes($args)
{
global $wpdb;
// Carregar as opções desse widget
$opcoes = get_option('posts_mais_quentes');
// Valor padrão, caso nada tenha sido informado
if(empty($opcoes['quantidade'])) $opcoes['quantidade'] = "5";
// Recuperando os posts
$hot_posts = $wpdb->get_results("SELECT ID, post_title, comment_count FROM {$wpdb->posts} ORDER BY comment_count DESC LIMIT {$opcoes['quantidade']}");
// Usando o modelo de widgets do tema
print $args['before_widget'];
print $args['before_title'] . $opcoes['titulo'] . $args['after_title'];
print "<ul>";
// Listando os posts mais quentes
foreach($hot_posts as $hot_post)
print "<li><a href='" . get_permalink($hot_post->ID) . "'>{$hot_post->post_title} ({$hot_post->comment_count})</a></li>";
print "</ul>";
print $args['after_widget'];
}
// Configurações dos Posts Mais Quentes
function configurar_posts_mais_quentes()
{
// Inicializa as variáveis necessárias
$opcoes = array();
// Salvando as opções
if($_POST['salvar_posts_mais_quentes'])
{
$opcoes['titulo'] = $_POST['titulo_dos_posts_mais_quentes'];
$opcoes['quantidade'] = (int) $_POST['quantidade_de_posts_mais_quentes'];
// Valor padrão, caso nada tenha sido informado
if(empty($opcoes['quantidade'])) $opcoes['quantidade'] = "5";
update_option('posts_mais_quentes', $opcoes);
}
// Carregar as opções desse widget
$opcoes = get_option('posts_mais_quentes');
// Formulário
?>
<input type="hidden" name="salvar_posts_mais_quentes" value="1" />
<p>
<label for="titulo_dos_posts_mais_quentes">Título:</label>
<input type="text" name="titulo_dos_posts_mais_quentes" maxlength="26" value="<?php print $opcoes['titulo']; ?>" class="widefat" />
<label for="quantidade_de_posts_mais_quentes">Quantidade:</label>
<input type="text" name="quantidade_de_posts_mais_quentes" maxlength="2" value="<?php print $opcoes['quantidade']; ?>" class="widefat" />
</p>
<?php
}
// Ativar o widget
function posts_mais_quentes_widgets()
{
// Adicionar o widget
register_sidebar_widget('Posts Mais Quentes', 'posts_mais_quentes');
// Adicionar o controle ao widget
register_widget_control('Posts Mais Quentes', 'configurar_posts_mais_quentes');
}
// Carregar o widget
add_action('widgets_init', 'posts_mais_quentes_widgets');
?>
Boa sorte!