Melhorando o formulário de cadastro do WordPress

Existem uma série de plugins que gerenciam para você o cadastro de usuários no WordPress adicionando ou retirando campos, entretanto diversas vezes os achei muito limitados e até difíceis de gerenciar pelo usuário comum.

O problema que eu vejo em se utilizar plugins que são feitos por terceiros é que você sempre fica à mercê das atualizações promovidas pelo desenvolvedor ou a própria descontinuação do projeto. Então, exceto pelos plugins que são de desenvolvedores ou empresas conhecidas, eu prefiro sempre que possível fazer a minha implementação.

Neste exemplo não construirei um plugin, mas indico como fazer o uso das funções do WordPress para gerenciar o cadastro de usuários.

Primeiramente devemos relacionar o que queremos em nosso formulário.

  • Nome
  • Email
  • Twitter
  • Telefone
  • Endereço
  • Bairro
  • Cidade
  • Estado
  • CEP

A seguir, baseado no formulário de cadastro que o WP disponibiliza vamos personalizar o nosso. Iniciaremos excluindo alguns campos que não são necessários.

add_filter('user_contactmethods','add_contactmethod',10,1);

function add_contactmethod( $contactmethods ) {
  $contactmethods['user_twitter'] = 'Twitter';
  $contactmethods['user_telephone'] = 'Telefone';

  unset($contactmethods['aim']);
  unset($contactmethods['jabber']);
  unset($contactmethods['yim']);

  return $contactmethods;
}

A variável $contactmethods contempla todas os campos referentes às informações de contato. Poderíamos já incluir nesta função todos os campos que queremos como o de endereço e bairro, mas ficaria confuso misturar esse tipo de informação, então para esta situação, iremos criar uma seção exclusiva para estas informações extras. Em resumo, para adicionar campos utilize $contactmethods[‘nome_do_campo’] = ‘Label do Campo’ e para excluir um existente utilize a função do php unset($contactmethods[‘nome_do_campo’]).

Então já temos assim os campos Nome e email (padrão do WordPress) e agora acabamos de adicionar Twitter e Telefone. Vamos agora criar o formulário interno com os novos campos tanto para inserção quanto para atualização de cadastro.

add_action( 'show_user_profile', 'extra_info_profile_fields' );
add_action( 'edit_user_profile', 'extra_info_profile_fields' ); 

function extra_info_profile_fields($user) { ?>
<h3>Informações extras</h3>
  <table>
    <tr>
      <th><label for="user_address">Endereço</label></th>
      <td>
        <input type="text" name="user_address" id="user_address" value="<?php echo esc_attr( get_the_author_meta( 'user_address', $user->ID ) ); ?>" /><br />
        <span>Preencha o seu endereço.</span>
      </td>
    </tr>
    <tr>   
      <th><label for="user_district">Bairro</label></th>
      <td>
        <input type="text" name="user_district" id="user_district" value="<?php echo esc_attr( get_the_author_meta( 'user_district', $user->ID ) ); ?>" /><br />
        <span>Preencha com o seu bairro.</span>
      </td>
    </tr>
    <tr>
      <th><label for="user_city">Cidade</label></th>
      <td>
        <input type="text" name="user_city" id="user_city" value="<?php echo esc_attr( get_the_author_meta( 'user_city', $user->ID ) ); ?>" /><br />
        <span>Preencha com a sua cidade. </span>
      </td>
    </tr>
    <tr>
      <th><label for="user_state">Estado</label></th>
      <td>
       	<input type="text" name="user_state" id="user_state" value="<?php echo esc_attr( get_the_author_meta( 'user_state', $user->ID ) ); ?>" /><br />
        <span>Preencha com o seu estado. </span>
      </td>
    </tr>
    <tr>
      <th><label for="user_zipcode">CEP</label></th>
      <td>
        <input type="text" name="user_zipcode" id="user_zipcode" value="<?php echo esc_attr( get_the_author_meta( 'user_zipcode', $user->ID ) ); ?>" /><br />
        <span>Digite o seu CEP. </span>
      </td>
    </tr>
 </table>

<?php }
add_action( 'personal_options_update', 'save_extra_info_profile_fields' );
add_action( 'edit_user_profile_update', 'save_extra_info_profile_fields' ); 

function save_extra_info_profile_fields( $user_id ) {
  if ( !current_user_can( 'edit_user', $user_id ) ) {
    return false;
  } 
  update_usermeta( $user_id, 'user_address', $_POST['user_address'] );
  update_usermeta( $user_id, 'user_district', $_POST['user_district'] );
  update_usermeta( $user_id, 'user_city', $_POST['user_city'] );
  update_usermeta( $user_id, 'user_state', $_POST['user_state'] );
  update_usermeta( $user_id, 'user_zipcode', $_POST['user_zipcode'] );
}

A função criada abaixo faz uso da função do WordPress wp_insert_user, que serve exclusivamente para criar o cadastro do usuário, mas ela só responde pelos campos padrão e pelos campos criados por meio do hook user_contactmethods. E os outros campos? Caso a função seja concluída, ela nos retorna o ID do usuário cadastrado, pegamos esse ID e mandamos atualizar o cadastro. Para mais informações sobre esta função acesse http://codex.wordpress.org/Function_Reference/wp_insert_user e para a função de atualizar o cadastro http://codex.wordpress.org/Function_Reference/wp_update_user.

function criar_usuario($firstname, $lastname, $nickname, $user_nicename, $user_email, $display_name, $user_site, $user_blog, $user_twitter, $user_telephone, $user_login, $user_pass, $user_role="subscriber"){
    $user_data = array();
    $user_data["first_name"] = $firstname;
    $user_data["last_name"] = $lastname;
    $user_data["nickname"] = $nickname;
    $user_data["user_nicename"] = $user_nicename;
    $user_data["user_email"] = $user_email;
    $user_data["display_name"] = $display_name;
    $user_data["user_url"] = $user_site;
    $user_data["user_blog"] = $user_blog;
    $user_data["user_twitter"] = $user_twitter;
    $user_data["user_telephone"] = $user_telephone;
    $user_data["user_login"] = $user_login;
    $user_data["user_pass"] = $user_pass;
    $user_data["role"] = $user_role;

    return  wp_insert_user( $user_data );
    update_user();
}
function update_user($user_id, $address, $district, $city, $state, $zipcode){
  if(!is_wp_error($user_id)){
    update_user_meta( $user_id, 'user_address', $address);
    update_user_meta( $user_id, 'user_complement', $complement);
    update_user_meta( $user_id, 'user_district', $district);
    update_user_meta( $user_id, 'user_city', $city);
    update_user_meta( $user_id, 'user_state', $state);
    update_user_meta( $user_id, 'user_zipcode', $zipcode);
  }
}

Para efetivar o seu cadastro, basta criar o seu formulário e na página de processamento chamar as funções acima criadas com as suas respectivas variáveis preenchidas.

 

Plugins Sugeridos

Register Plus
http://wordpress.org/extend/plugins/register-plus/

Simplr Registration Form
http://wordpress.org/extend/plugins/simplr-registration-form/

Register Plus Redux
http://wordpress.org/extend/plugins/register-plus-redux/

Enviar email no formato HTML via WordPress

Para o envio de email o WordPress faz uso da função wp_mail() que disponibilizam os seguintes argumentos para serem trabalhados:

wp_mail( $destinatario, $assunto, $mensagem, $headers, $anexos );

Os dois últimos argumentos são opcionais.

Por padrão, esta função somente envia emails no formato texto, sem formatação, ou seja, qualquer tag html que exista no seu email será mostrada ao usuário por extenso.

Para resolver este problema, existem duas formas de trabalhar essa função para que ela exiba corretamente as suas tags html.

A primeira e mais simples é adicionando o content-type diretamente na variável $header:

$headers = array("From: Wildiney <criacao@wildiney.com>",
	         "Content-Type: text/html"
	         );

Se forem poucos os lugares onde você fará uso desta função, o exemplo acima resolve perfeitamente. Agora se o uso for constante, você pode configurar diretamente no arquivo functions.php.

add_filter('wp_mail_content_type','set_contenttype');

function set_contenttype($content_type){
  return 'text/html';
}

Existe também uma versão mais resumida da função acima que eu encontrei em alguns fóruns.

add_filter('wp_mail_content_type', create_function('', 'return "text/html"; '));

Nesse caso fica a gosto, não notei nenhuma diferença no desempenho, apesar de acreditar que usar a função do php create_function possa gerar mais processamento do que explicitar diretamente o que quer.

Integrar a biblioteca Zend com WordPress

Procurando uma forma de integrar a biblioteca do Zend Framework para implementar algumas funcões do WordPress, pesquisei em alguns sites algumas sugestões de como proceder. O resultado postado abaixo sugere uma mescla dos diversos resultados encontrados adaptados à minha atual necessidade. Os sites usados na pesquisa encontram-se relacionados abaixo.

Faça o download do Zend Framework Minimal Package no site da Zend (http://www.zend.com/community/downloads)

Descompacte e transfira a pasta library para a raiz do seu template.

No arquivo functions.php insira o código abaixo que fará o include da biblioteca Zend no WP.

set_include_path(
  get_include_path() .
  PATH_SEPARATOR .
  dirname(__FILE__) .
  DIRECTORY_SEPARATOR .
  'library'
);
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();

A partir de agora, qualquer chamada às classes do Zend Framework pelo seu template retornará resultado. Para testar insira o código abaixo em algum arquivo do wordpress, pode ser o single.php se for visualizar um post ou  page.php se for visualizar uma página padrão.

$data = new Zend_Date();
echo $data; // Exibe a data corrente de acordo com o padrão do servidor
$data->toString('YYYY-MM-dd'); // Formata a data no padrão descrito na string

Mas e como fazer para usar as classes que traballham com banco de dados, como o Zend_Db_Table?

No arquivo functions.php, faça a chamada do método Zend_Loader e configure o acesso ao banco de dados.

Zend_Loader::registerAutoload();
$db = Zend_Db::factory('Pdo_Mysql', array(
  'host'          => 'localhost',
  'username'      => 'usuario',
  'password'      => 'senha',
  'dbname'        => 'nomedobanco'
  ));

Zend_Db_Table::setDefaultAdapter($db);

Para cada tabela no banco de dados você deve criar uma classe semelhante a descrita abaixo. Para quem já conhece POO será fácil compreender a estrutura e os elementos.

class Users extends Zend_Db_Table_Abstract {
  protected $_name = 'wp_users';
  }

Para fazer as pesquisas faça a chamada das funções no seu template.

$users = new Users();
$users = $users->fetchAll()->toArray();

echo "<pre>";
  print_r($users[0]);
echo "</pre>";

Não tenho certeza se esse é o método mais seguro ou o mais prático, talvez dê para colocar a configuração do banco no wp-config.php, enfim, ainda serão necessários alguns testes para moldar qual a melhor forma.

Existe um método mais intrusivo descrito em http://www.krotscheck.net/2009/05/16/bootstrapping-a-startup-zend-and-wordpress-auth-integration.html mas que demanda muito mais conhecimento.

Qualquer sugestão a respeito, envie seu comentário.

Referências

http://stackoverflow.com/questions/377628/can-i-integrate-a-zend-framework-powered-web-application-into-a-wordpress-site

http://pt.w3support.net/index.php?db=so&id=377628

http://www.projeteweb.com.br/blog/como-integrar-o-zend-framework-em-um-tema-wordpress

 

Bloco de produtos em promoção e produtos randômicos do Magento

O template para os produtos em promocão fica localizado em appcodecoreMageCatalogBlockProductListPromotion.php. Para utilizar, acrescente ou crie um atributo promotion, de escopo global, input type yes/no,  e adicione ao set de atributos que você utiliza.

Para exibir os produtos em promoção utilize no xml de gerenciamento da sua página o código:

<block type="catalog/product_list_promotion"
       name="product_promotion"
       template="catalog/product/list.phtml"/>

ou insira pelo CMS:

{{block type='catalog/product_list_promotion'
        template='catalog/product/list.phtml'}}

O template do bloco de itens randômicos estão localizados em appcodecoreMageCatalogBlockProductListRandom.php, para chamar no xml de gerenciamento da sua página utilize:

<block type="catalog/product_list_random"
       name="product_random"
       template="catalog/product/list.phtml"/>

 

Configurando as páginas de erro do magento

Na instalação padrão, quando ocorre algum erro no Magento, ele mostra ao usuário uma tela baseada no layout padrão mostrando o código do Error Log. Isso é extremamente desagradável ao usuário por não entender o que aquilo significa.

Para personalizar as suas páginas de erro e ainda exibir um formulário de contato com o cliente que chegou na página de erro, procure na sua instalação a pasta errors/default/ e copie com o nome do seu template, ou seja error/meutemplate/

Renomeie o arquivo local.xml.sample que está dentro da pasta error/ para local.xml e abra para edição.

Altere os valores das tags de acordo com o desejado

  • <skin> – nome do template ao qual pertence a página de erro, ex.: meutemplate;
  • <action> – gerencia qual ação será tomada
    • print: para colocar o erro na tela. Ideal para usar no seu servidor de testes.
    • email: para enviar o erro por email.
  • <subject> – assunto do email
  • <email_address> – para qual email deverá ser enviado o erro.
  • <trash> – gerencia o que fazer com o erro.
    • leave: para gravar o erro no banco
    • delete: para limpar

Personalize os arquivos que copiou da pasta default, sendo os arquivos:

  • page.phtml: para emoldurar a página com o seu template
  • 404.phtml: para configurar a página com o erro de página não encontrada.
  • 503.phtml: para configurar a página com o erro de serviço indisponível.
  • report.phtml: para configurar a página que te enviará o relatório de erros por email.

Tente usar o mínimo de requisições ao core do Magento, pois se o erro ocorrer devido a falhas no core, o usuário não visualizará a página de erro.

Criação de Blocos de página no Magento

Um dos grandes problemas ao se trabalhar com o magento é a sua parte burocrática para a implementação de códigos. Para mudar simplesmente um menu de posição, será necessário um esforço muito maior do que temos hoje para executar o mesmo processo em um sistema Joomla ou WordPress.

Se por um lado é um sacrifício ter que passar por estas etapas, por outro, de acordo com a Varien, isso dá mais segurança.

Então para implementarmos um bloco de código, não é somente inserir um include, require ou implantar o código diretamente no template. Para exemplificar, farei a descrição das etapas para chamar um bloco de código que faça a exibição do menu principal da página. Proceda então da seguinte forma:

Crie o seu arquivo phtml dentro do caminho app/design/frontend/default/seu_tema/template/page/html/, neste caso nomeei como menuprincipal.phtml.

Abra o arquivo page.xml que está dentro de app/design/frontend/default/seu_tema/layout/

Como eu quero que o menu apareça dentro do bloco header, insiro a linha a seguir dentro do trecho de código xml que gerencia este bloco.

<block type="page/html_header" name="header" as="header">
    <block
     type="core/template"
     name="menuprincipal"
     as="menuprincipal"
     template="page/html/menuprincipal.phtml" />
</block>

Então temos quatro variáveis a serem preenchidas para a exibição correta do nosso bloco: type, name, as e template.

  • type identifica o tipo do bloco, você verá outros tipos na própria página page.xml
  • name é o nome do seu bloco;
  • as é o atalho que você usará para chamar este bloco e
  • template é o caminho para se chegar até o seu arquivo phtml.

Para finalizar, vá até o seu template do header que fica em app/design/frontend/default/seu_tema/template/page/html/ e insira o código que fará a chamada do seu bloco.

<?php echo $this->getChildHtml('menuprincipal') ?>

Você pode usar estes blocos para subdividir e gerenciar melhor o seu layout.

Referências

http://inchoo.net/ecommerce/magento/custom-reference-structural-block/

http://www.exploremagento.com/magento/simple-custom-module.php

Adicionando MySQL do MAMP ou XAMPP via linha de comando no Terminal do Mac

Apesar de termos o PHPMyAdmin como excelente ferramenta de gerenciamento do MySQL, existem algumas facilidades quando trabalhamos com o MySQL via linha de comando.

Por exemplo, para fazer ou restaurar backup de uma base de dados é muito mais rápido via linha de comando do que exportando o arquivo pelo PHPMyAdmin e reimportando pelo mesmo. Sem contar que dependendo do tamanho do arquivo podem ocorrer erros na importação e corromper os dados.

Para este tipo específico de problema, resolvi então buscar uma forma mais prática para usar o MySQL instalado pelo MAMP (ou XAMPP) na linha de comando do terminal.

Os resultados que mostro abaixo foram baseados no artigo “Command line MySQL not working with XAMPP” do site http://www.aschroder.com/2009/03/how-to-use-the-mamp-mysql-command-line-client-in-a-terminal/.

Abra o terminal, crie um diretório na raiz chamado bin e acesse.

mkdir ~/bin
cd ~/bin

Crie um atalho para a aplicação

ln -s /Applications/MAMP/Library/bin/mysql mysql

Para usar o XAMPP no lugar do MAMP é só substituir o atalho da aplicação pelo endereço do XAMPP no seu sistema. Abra o arquivo ~/.bash_profile, pode ser usando o comando PICO e VI do terminal ou como eu prefiro, usando o aplicativo TextWrangler. Se houver alguma linha escrita neste arquivo, adicione na linha seguinte:

export PATH=$PATH:/Users/__usuario__/bin/

Caso contrário digite:

export PATH=/Users/__usuario__/bin/:$PATH

Lembrando de trocar o termo __usuario__ pelo seu nome de usuario do sistema. Salve o arquivo, volte ao terminal e teste digitando:

echo $PATH

Verifique o atalho com:

ls -la ~/bin

E verifique qual endereço do MySQL está rodando no seu sistema com:

which mysql

Pronto, a partir de agora para acessar o mysql é só digitar no terminal:

mysql

E o prompt de comando já será alterado para responder ao MySQL.

Atualizar WordPress via SSH

Em algumas hospedagens eu encontrei um problema persistente que faz com que mesmo a pasta tendo chmod 777, o servidor bloqueia a atualização automática do wordpress, ou até mesmo por falta de memória disponível nas hospedagens compartilhadas quando aparece o erro de Timeout.

Procurando uma forma de fazer as atualizações de forma rápida e segura, me deparei com a possibilidade de fazer via SSH. Existem alguns posts falando a respeito, entretanto não encontrei nenhum que falasse como fazer o processo para WordPress versão pt-br.

O processo é bem simples. Acesse o seu servidor via SSH, e insira os comandos abaixo:

wget http://br.wordpress.org/wordpress-3.1.1-pt_BR.tar.gz

Acessando o http://br.wordpress.org você pode pegar o link da versão tar.gz mais atual caso esta não seja.

Descompacte o arquivo.

tar xfz wordpress-3.1.1-pt_BR.tar.gz

Delete as pastas wp-include e wp-admin da sua instalação atual ou simplesmente renomeie caso queira ter como backup.

rm -rf ./wp-includes/
rm -rf ./wp-admin/

Acesse a pasta que você acabou de descompactar

cd wordpress

E copie sobrepondo os arquivos com o seguinte comando:

cp -rpf -f * ../

Volte para a sua instalação WordPress

cd ..

Delete os arquivos que você não usará mais.

rm -rf wordpress
rm -f wordpress-3.1.1-pt_BR.tar.gz

Acesse o admin do seu WordPress e atualize a sua rede.

Como fazer backup da base de dados MySQL via SSH

Faça o acesso ao seu servidor conforme descrito no Acessando o servidor via SSH.

Digite o seguinte comando no Terminal:

mysqldump -h endereco_host -u login -p -R --opt nome_banco_dados > arquivo.sql

Caso opte por fazer o backup apenas de uma tabela coloque o nome da tabela logo após nome_bd

mysqldump -h endereco_host -u login -p -R --opt nome_banco_dados nome_tabela> arquivo.sql

Se houver problemas de acentuação acrescente este parâmetro logo após –opt

mysqldump -h endereco_host -u login -p -R --opt --default-character-set=latin1  nome_banco_dados > arquivo.sql