quarta-feira, 7 de novembro de 2012

Como converter Xoops-SmartSection para WordPress

Segundo a Wikipedia, o Xoops é um CMS feito em PHP cuja maior característica é a facilidade de instalação, operação, além do fato de existir uma infinidade de módulos que possibilitam agregar mais funções ao portal que se deseja criar. É uma ferramenta poderosa, flexível e fácil de usar na criação e administração dos mais variados tipos de sites. Pode ser usado para criar desde pequenas páginas até portais médios ou grandes. Todas as ações são efetuadas através de uma interface web simples e funcional, deixando aos administradores, praticamente só a tarefa de gerenciar o conteúdo do site. Ou seja, é uma ferramenta muita usada por quem quer ter um site bonito com CMS e não quer, ou não sabe, programar.

Um de seus módulos, que é o que vamos tratar de um probleminha aqui é o SmartSection. O SmartSection fornece todas aquelas funcionalidades de organização por categorias, subcategorias e notificações que o Wordpress e muitos blogs tem por aí.

Bem, o Wordpress é muito famoso. Mesmo achando desnecessário falar a respeito dele, vamos lá. Também da Wikipedia. O WordPress é um aplicativo de sistema de gerenciamento de conteúdo para web, escrito em PHP com banco de dados MySQL, voltado principalmente para a criação de blogs via web. Essa é uma das ferramentas mais famosas na criação de blogs disputando diretamente com o serviço do Google chamado Blogger. No entanto, o WordPress é adotado por aqueles que queiram um blog mais profissional e com maiores recursos diferenciais.


Bem, agora que já expusemos os elementos envolvidos vamos ao problema: converter os "posts" do SmartSection para o WordPress. A organização do banco de dados de ambos é muito diferente, mas depois de apanhar um pouco, foi possível.



O início da solução foi este site. Ele ajudou muito. Porém, ele explicava como fazer isso para o Xoops, ele mesmo, e não para o módulo SmartSection. Então eu tive que fazer muitas adaptações no código original.

A solução que funcionou aqui foi criar uma tabela de posts do wordpress no mesmo banco de dados em que eu estava trabalhando e exportar utillizando INSERT ... SELECT. A consulta utilizada foi esta daqui:

INSERT INTO wp_posts SELECT itemid AS ID, 1 AS post_author, FROM_UNIXTIME( datesub ) AS post_date, FROM_UNIXTIME( datesub ) AS post_date_gmt, body AS post_content, title AS post_title, partial_view AS post_excerpt, 'publish' AS post_status, 'open' AS comment_status, 'open' AS ping_status, '' AS post_password, title AS post_name, '' AS to_ping, '' AS pinged, FROM_UNIXTIME( datesub ) AS post_modified, FROM_UNIXTIME( datesub ) AS post_modified_gmt, '' AS post_content_filtered, '' AS post_parent, '' AS guid, '' AS menu_order, 'post' AS post_type, '' AS post_mime_type,  0 AS comment_count FROM `projeto_smartsection_items`;


Antes de fazer desse jeito, tentei fazer dump e usar mysqlimport, jogar a saída do mysql num arquivo e utilizar conversores de csv diversos, utilizar o comando "LOAD DATA LOCAL INFILE" do mysql e nada. Cada um por um motivo mais diferente e ruim de resolver que o outro. Por exemplo, o mysql do servidor não é o mais recente. Porém, não é caso de um ou dois projetos utilizando-o, são mais de 30. Quais as chances de algo dar errado se eu tentasse atualizá-lo? Enfim! Essa solução é para ser independente de versão do mysql.


No caso, o Wordpress está instalado numa cópia do banco de dados do projeto original, pois o projeto inicial, em Xoops, está sendo migrado para Wordpress. Cá entre nós, acho horrível trabalhar com Xoops, atualizá-lo então nem se fala. Pois a versão que o cliente está usando tem umas falhas de segurança grotescas e o servidor já foi invadido por causa disso algumas vezes. Wordpress tem lá suas falhas, mas deixa o Xoops no chinelo.


Bem, continuando. Para importar as categorias:
insert into wp_terms select (categoryid+2) as term_id, name, name as slug, 0 as term_group from projeto_smartsection_categories;

Utilizei "name as slug" pois nem todos os short_url estavam preenchidos e o Wordpress não aceita slugs repetidos. Adicionei 2 a categoryid por já ter dois itens na tabela "wp_terms".

As categorias já foram inseridos no banco de dados, porém, o Wordpress ainda não as vê como categorias. Precisamos definir na tabela "wp_term_taxonomy" o que elas são:
insert into wp_term_taxonomy select NULL as term_taxonomy_id, term_id, 'category' as taxonomy, '' as description, 0 as parent, 0 as count from wp_terms where term_id > 2;

As categorias já existem e o Wordpress já as exibe como categorias, mas não criamos as relações entre elas e os posts ainda. Para isso:
INSERT INTO wp_term_relationships SELECT itemid AS object_id, (categoryid+2) AS term_taxonomid_id, 0 as term_order FROM `projeto_smartsection_items`;

Pronto! Conversão completa! ;)




Nenhum comentário: