Migrando de Jekyll para Wordpress
Publicado em
Depois de alguns anos mantendo um blog em Jekyll (não esse, esse é em Hugo, surgiu a vontade de migrar para Wordpress em um VPS. Os motivos foram vários:
-
o blog começou a crescer em volume de posts, o que fazia a escrita de novos posts ficar mais arrastada, devido a lentidão do Jekyll e a falta de vontade que essa lentidão causa
-
impressão de “imobilidade” do Jekyll, quase como se a ferramenta não tivesse mais muita evolução
-
maior facilidade para escrita: claro, markdown funciona bem, mas é muito mais prático e rápido abrir o browser num admin e começar a escrever o post já no formato que será visto no final. Facilidades com mídia, e centralização de tudo torna o ato de escrever em si mais fácil e direto
-
o motivo mais importante de todos: porque eu quis. Fazia tempo que eu não tinha o trabalho de manter um VPS de forma decente no ar, eu estava muito confortável mantendo o site estático na Netlify e queria arrumar para a minha cabeça. Simples assim
O Plano
Existem muitos plugins e ferramentas fazendo o caminho inverso, mas poucos fazendo a ida para wordpress, e a maioria seguia o caminho de usar o feed para criar o conteúdo no final (como descrito aqui). Isso funciona, mas você tem menos controle do que eu gostaria.
Estava pensando em criar um script e inserir diretamente no banco de dados da instalação wordpress, quando eu topei com o utilitário wp. Isso facilitou muito a vida.
Me apoiando no wp-cli, montei o script em ruby abaixo para criar os comandos e arquivos necessários para poder importar tudo no wordpress.
require "time"
require "set"
if ARGV.size != 2
puts "Usage: ruby migrate_posts_from_jekyll.rb posts_folder output_folder"
exit 1
end
POSTS_DIR = ARGV[0]
OUTPUT_DIR = ARGV[1]
def starts_with_label?(line, label)
line.downcase.strip.start_with?(label)
end
def clean(line, label)
replacements = {
"#{label}: " => "",
"'" => "",
"\"" => "",
"–" => "-",
"“" => "\"",
"”" => "\"",
"\n" => "",
"/" => ""
}
line.strip.gsub(Regexp.union(replacements.keys)) { |match| replacements[match] }
end
commands = "#!/usr/bin/env bash \n"
categories_to_create = Set.new
Dir.children(POSTS_DIR).each do |filename|
full_path = File.join(POSTS_DIR, filename)
next if File.directory?(full_path) or filename.start_with?(".")
title = ""
date = ""
permalink = ""
categories = []
tags = []
content = ""
in_categories = false
in_tags = false
header_count = 0
File.foreach(full_path) do |line|
unless line.start_with?(" ")
in_categories = false
in_tags = false
end
case
when starts_with_label?(line, "title")
title = clean(line, "title")
when starts_with_label?(line, "date")
date = clean(line, "date")
when starts_with_label?(line, "permalink")
permalink = clean(line, "permalink")
when starts_with_label?(line, "categories")
in_categories = true
when starts_with_label?(line, "tags")
in_tags = true
when in_categories
value = line.sub("- ", "").delete("\"").gsub("'", "").strip
categories << value
categories_to_create << value
when in_tags
tags << line.sub("- ", "").delete("\"").gsub("'", "").strip
when starts_with_label?(line, "---")
header_count += 1
when header_count == 2
content += line
end
end
output_file_name = permalink + ".txt"
parsed_date = Time.parse(date).strftime("%Y-%m-%d %H:%M:%S")
puts "#{title} - #{parsed_date} - #{permalink} - #{categories.to_s} - #{tags.to_s}"
commands += "wp post create ./#{output_file_name} --post_author=1 --post_title='#{title}' --post_name='#{permalink}' --post_date='#{parsed_date}' --post_category='#{categories.join(', ')}' --tags_input='#{tags.join(', ')}' --post_status=publish --post_type=post \n"
File.write(OUTPUT_DIR + output_file_name, content)
end
categories_commands = "#!/usr/bin/env bash \n"
categories_to_create.each do |cat|
categories_commands += "wp term create category '#{cat}' \n"
end
File.write(OUTPUT_DIR + "categories.sh", categories_commands)
File.write(OUTPUT_DIR + "posts.sh", commands)Repare que a coleta dos metadados espera o header dos posts em Jekyll no seguinte formato:
---
id: 124
title: O Titulo
date: 2018-04-10T10:19:55-03:00
category: blog
author: Nome Sobrenome
layout: post
permalink: /o-permalink/
categories:
- Categoria1
- Categoria2
tags:
- tag1
- tag2
---
TEXTOE você deve executar o script da seguinte forma:
ruby migrate_posts_from_jekyll.rb content/_posts/ ../output/Então os arquivos categories.sh, posts.sh e os posts individuais serão criados na pasta output. Repare na linha de criação de posts no parâmetro –post_author=1. Esse é o ID do autor dos posts no wordpress.
Com isso em mãos, é só copiar essa pasta para a instalação do wordpress e rodar os categories.sh e posts.sh com “./” mesmo.
A única coisa não coberta aqui foi a parte de mídia, porquê depende muito de como isso foi utilizado ao longo de vida do seu blog. Se houver um padrão, basta alterar no script a variável content, para tratar a forma como você insere imagens nos seus posts para a forma que o wordpress usa. No meu caso foi só copiar a pasta de mídia do Jekyll para a pasta de mídia na instalação do wordpress e rodar o plugin WP Media Sync. Depois desinstalei o plugin e pronto.
E com isso o blog foi para wordpress.
(mentira, tive vários problemas na configuranção de DNS, mas isso foi vacilo meu mesmo e assunto para outro post)
Lembrando: antes de realizar esse tipo de manobra, tenha backups e mantenha os dados do seu repositório Jekyll salvos, pois ainda podem ser úteis no futuro.
Comentários
Sinto que os comentários em blogs têm diminuído com o passar do tempo. Se você tiver alguma dúvida ou quiser falar sobre o post, entre em contato comigo pelos links abaixo.