Этот пост я пишу совсем не в маленьком окошке TinyMCE, а в удобном Sublime Text 2. Более того, чтобы запостить его в блог, мне даже не придется заходить в админку. Пост автоматически появится на странице, когда я сделаю push в git репозиторий. А если я захочу что-то исправить, то опять же, достаточно будет сделать push, и пост будет автоматически исправлен.

Идея, в общем, не нова, многие слышали про Octopress, или блог bobuk'а, которые тоже работают через git. Правда вот никакого похожего плагина для Wordpress я не нашел. Только на одном из сайтов, на вопрос "А можно ли постить в блог через git?" ответили "...this is a massive job for what seems like a very small payoff...". Ну что ж, никому не надо, а мне надо.

Будущую систему я назвал blocto, от слов blog и octo (от Octopus, подразумевая Github, хотя он не используется). Сами посты я решил хранить в статических файлах. Изначально это должны быть Markdown файлы, но я отказался от этой идеи из-за сложности в синхронизации постов. Я использую следующий формат файла:

tags: теги, разделенные, запятыми
categories: категории, разделенные, запятыми
type: тип поста (пост или страница)
author: id автора
post_status: статус поста (черновик, опубликованный)
comment_status: статус комментариев (открыты или закрыты)
title: Заголовок поста


Содержимое идет после двух пропущенных строк.

Само имя файла является идентификатором, и одновременно URI поста. Эти файлы находятся в git репозитории, так что я получаю версионность, а так же своего рода бекап. Я всегда смогу еще раз импортировать все эти файлы в Вордпесс.

Итак, доставка файлов на сервер реализуется с помощью пуша. В git присутствует отличная фича, которая называется хуки (hooks). Можно написать скрипт, который будет выполняться перед коммитом, после коммита, в разные другие моменты, в том числе после пуша. Я создал файл .git/hooks/post-receive, который является шелл скриптом, выполняемым при получении данных. Соответственно все, что нам нужно в нем сделать, это обновить файлы и запустить импорт, поэтому скрипт выглядит так:

#!/bin/sh
GIT_WORK_TREE=/home/viktoras/blocto git checkout -f
php /home/viktoras/blocto/sync.php

Оставалось написать сам скрипт для импорта. Проще всего использовать API самого Wordpress, подключив файл wp-load.php. Тогда не придется вручную подключаться к базе. Скрипт можно посмотреть на Github. Скрипт распространяется под MIT лицензией. Это еще сырая альфа версия, и можно его много чего улучшать и добавлять.

Теперь, написание нового поста выглядит так:

touch posts/new-post.md
edit posts/new-post.md
git add -u
git commit -m "New post"
git push wordpress master

Пост, который вы только что прочитали, был сделан именно таким образом.