目的
Obsidianを愛用している私は、MarkdownファイルをWordPressへスムーズに公開したいと考えていました。
ObsidianにはWordPress Publishというコミュニティプラグインが提供されているものの、私の環境では画像のアップロードが正常に動作しませんでした。また、このプラグインではObsidianとWordPressの記事が紐づけされないため、記事を編集して再アップロードすると既存記事が更新されず、新しい記事として重複投稿されてしまうという問題もありました。
これらの課題を解決し、自分の理想的なブログ公開ワークフローを実現するため、独自のPythonプログラムを開発することにしました。今回はその開発過程と機能について詳しくご紹介します。
私のObsidianの使い方はこちらです


要件定義
基本機能
- ローカルのObsidianにあるMarkdownが最新版であること
- WordPressのGutenberg形式で公開できること
- Markdownの再アップロード時は、既存のWordPress記事を更新すること
- WordPressのショートコードを使用できること
- WordPressのテーマを使用できること
- カテゴリ、タグを追加できること
画像管理機能
- 画像のアップロードが可能であること
- 画像を重複してアップロードしないこと
- ローカルの画像は記事タイトルまたはslugがある場合、その名称へリネームすること
- こだわりポイント: スクショをたくさんObsidianに貼っているため、画像ファイル名がぐちゃぐちゃになっている。WordPressにそのままの名称でアップロードすると、画像がどのブログに紐づいているのか分かりづらくなるため、画像ファイル名をローカルで変更した上でWordPressにアップロードする必要がある
リンク管理機能
- WordPress上の画像リンクとローカルのMarkdownリンクで、それぞれのパスの画像をリンク先とすること
- WordPress上:WordPress上の画像をリンク先とする
- ローカルのMarkdown:ローカルの画像をリンク先とする
- こだわりポイント: WordPressがなくなったときにローカルの画像リンクが壊れることは避けたい
メタデータ管理機能
- Front-matterで以下の項目を管理できること:
- 記事のタイトル
- カテゴリ
- タグ
- 画像リンク
- 記事ID
- サムネイル
今回はChatGPTとClaudeを使ってスクリプトを作成しました。基本的には作ってほしい仕様を入力して、ブラッシュアップしながら作りました。
開発方針の検討
最初のアプローチとその課題
MarkdownからWordPressへアップロードする方法として、ChatGPTが最初に提案したのは以下のような仕組みでした:
- pandocでMarkdownをHTMLに変換
- scpでサーバへファイル転送
- wp-cliで記事を投稿
しかし、この方法には重要な問題がありました。HTMLをそのまま使用すると、WordPress上でクラシックエディタとして表示されてしまうのです。
なぜGutenberg形式にこだわるのか
クラシックエディタの採用は避けたいと考えました。理由は以下の通りです:
- WordPressは将来的にクラシックエディタのサポートを終了すると発表している
- 長期的にブログを運用したい場合、サポート終了のリスクは避けるべき
- 現在の主流であるGutenberg形式での運用が望ましい
そのため、Gutenberg形式でのアップロードにこだわることに決めました。
wp-cliという解決策の発見
開発を始めるにあたり、まずこちらのブログを参考にしました。この記事では、wp-cliというツールを使ってコマンドラインでWordPressを操作する方法が紹介されていました。

「これを使えばローカルからファイル転送して、WordPress上で適切に表示できるのではないか?」と考え、wp-cliを採用することに決めました。
使い方
WordPressサーバ側の設定
SSH接続の設定
- SSH接続できるように設定を行ってください
- 設定内容はご利用のサーバによって異なるため詳細は割愛しますが、基本的には公開鍵と秘密鍵を作成してSSH接続を有効にします
wp-cliのインストール
以下のコマンドでwp-cliをインストールします:
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
ローカル側の設定
1. プログラムのダウンロード
GitHubからプログラムをクローンします:
git clone https://github.com/ktr17/markdown-to-wordpress
2. 必要なライブラリのインストール
Pythonライブラリをインストールします:
pip install -r requirements.txt
3. 環境設定ファイルの作成
.env.example
を.env
にリネームしてください.env
ファイル内の設定項目を適切に入力してください
4. プログラムの実行
以下のコマンドでMarkdownファイルをWordPressにアップロードします:
python deploy.py your_post.md
- 引数には、WordPressにアップロードしたいMarkdownファイルのパスを指定してください
5. 記事の確認・公開
- WordPressの管理画面で下書き状態でアップロードされた記事を確認してください
- 内容に問題がなければ公開してください
こちらから使ってね
Front-matterの設定
PythonプログラムでWordPressにMarkdownをアップロードする際、ローカルのMarkdownファイルにFront-matterが自動で追加されます。Front-matterは自動生成されるため、何も設定しなくても動作しますが、より使いやすくするために以下のオプションが利用できます。
ユーザー設定可能な項目
private
- 公開可否を設定します
- true:公開不可
- false:公開可能
categories
- WordPress上に存在するカテゴリを記事に割り当てます
- 注意: 新しいカテゴリを作成する機能はありません。存在しないカテゴリを指定するとエラーになります
tags
- 記事に割り当てるタグを指定します
- 注意: WordPress上に存在しないタグは設定できません
featured_image
- ブログのアイキャッチ画像をパスで指定してください
- ObsidianのVault直下からの相対パスで記載できます
slug
- 記事のURLスラッグ(短縮表記)を指定できます
- 使用可能文字:アルファベット、ハイフン
システム管理項目(編集禁止)
以下の項目はPythonプログラムが自動管理するため、手動での編集は避けてください。これらは自動で追加・更新されるため、ユーザーが意識する必要はありません。
wp_id
- WordPress上の記事IDを保存
- 値なし: 新規記事としてWordPressにアップロード
- 値あり: 既存記事として更新処理を実行
wp_img
- Markdownの画像リンクとWordPress上の画像URLを紐づける情報
- JSON形式で以下のフォーマットで保存されます:
wp_images:
画像1のハッシュ値:
id: '<画像ID>'
url: '<画像URL>'
original_path: <ローカルの画像リンク>
さいごに
結局のところ、Obsidianから直接Wordpressにアップロードするわけではありませんが、ローカルのMarkdownを正として、Wordpressを更新していくという本来やりたかったことは実現できました!
Obsidianに手軽にメモを残しながらも、いとも簡単にブログ公開できるようになったので私の心はウキウキです!
ぜひ、活用いただき快適なObsidian生活を送ってくださいね!
コメント