<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Markdown - CayTech Lab</title>
	<atom:link href="https://caymezon.com/tag/markdown/feed/" rel="self" type="application/rss+xml" />
	<link>https://caymezon.com</link>
	<description></description>
	<lastBuildDate>Sat, 14 Feb 2026 02:17:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://caymezon.com/wp-content/uploads/2026/01/cropped-CayTechLab-32x32.jpg</url>
	<title>Markdown - CayTech Lab</title>
	<link>https://caymezon.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<atom:link rel='hub' href='https://caymezon.com/?pushpress=hub'/>
	<item>
		<title>VSCodeで画像挿入が一瞬！クリップボード画像をMarkdown化するTypeScriptマクロ</title>
		<link>https://caymezon.com/vscode-clipboard-image-macro/</link>
					<comments>https://caymezon.com/vscode-clipboard-image-macro/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sat, 14 Feb 2026 02:17:05 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[VSCode]]></category>
		<category><![CDATA[クリップボード]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[生産性向上]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20127</guid>

					<description><![CDATA[<p>目次 はじめにこの記事で分かることこんな人におすすめ機能概要できること具体例コード詳細解説全体構造1. アクティブエディタの取得2. ユーザー入力の取得3. パス解決とフォルダ作成4. PowerShellで画像取得5. [&#8230;]</p>
<p>The post <a href="https://caymezon.com/vscode-clipboard-image-macro/">VSCodeで画像挿入が一瞬！クリップボード画像をMarkdown化するTypeScriptマクロ</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">この記事で分かること</a></li><li><a href="#toc3" tabindex="0">こんな人におすすめ</a></li><li><a href="#toc4" tabindex="0">機能概要</a><ol><li><a href="#toc5" tabindex="0">できること</a></li><li><a href="#toc6" tabindex="0">具体例</a></li></ol></li><li><a href="#toc7" tabindex="0">コード詳細解説</a><ol><li><a href="#toc8" tabindex="0">全体構造</a></li><li><a href="#toc9" tabindex="0">1. アクティブエディタの取得</a></li><li><a href="#toc10" tabindex="0">2. ユーザー入力の取得</a></li><li><a href="#toc11" tabindex="0">3. パス解決とフォルダ作成</a></li><li><a href="#toc12" tabindex="0">4. PowerShellで画像取得</a></li><li><a href="#toc13" tabindex="0">5. Markdownテキスト挿入</a></li></ol></li><li><a href="#toc14" tabindex="0">インストール方法</a><ol><li><a href="#toc15" tabindex="0">1. 拡張機能プロジェクトの準備</a></li><li><a href="#toc16" tabindex="0">2. ファイル配置</a></li><li><a href="#toc17" tabindex="0">3. extension.tsにコマンド登録</a></li><li><a href="#toc18" tabindex="0">4. package.json設定</a></li><li><a href="#toc19" tabindex="0">5. ビルドとインストール</a></li></ol></li><li><a href="#toc20" tabindex="0">実践的な使い方</a><ol><li><a href="#toc21" tabindex="0">基本的な使い方</a></li><li><a href="#toc22" tabindex="0">ブログ執筆での活用</a></li><li><a href="#toc23" tabindex="0">ドキュメント作成での活用</a></li><li><a href="#toc24" tabindex="0">議事録での活用</a></li></ol></li><li><a href="#toc25" tabindex="0">トラブルシューティング</a><ol><li><a href="#toc26" tabindex="0">エラー: クリップボードに画像がない</a></li><li><a href="#toc27" tabindex="0">エラー: imagesフォルダ作成に失敗</a></li><li><a href="#toc28" tabindex="0">エラー: ショートカットキーが動かない</a></li></ol></li><li><a href="#toc29" tabindex="0">Claude Codeでの開発体験</a><ol><li><a href="#toc30" tabindex="0">開発時間の比較</a></li><li><a href="#toc31" tabindex="0">Claude Codeのメリット</a></li></ol></li><li><a href="#toc32" tabindex="0">メリット・デメリット</a><ol><li><a href="#toc33" tabindex="0">メリット</a></li><li><a href="#toc34" tabindex="0">デメリット</a></li></ol></li><li><a href="#toc35" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>「Markdownで記事を書くとき、画像挿入がいちいち面倒…」</p>
<p>ブログ執筆やドキュメント作成で、こんな経験をしたことがある人は多いはずです。</p>
<p><!-- ![画像挿入作業の手間](images/manual-image-insert.jpg) --></p>
<p><strong>従来の作業フロー：</strong></p>
<pre><code class="language-plaintext">1. スクリーンショットを撮る
2. 画像編集ソフトで開く
3. ファイル名をつけて保存
4. imagesフォルダに移動
5. Markdownに![]形式で記述
→ 約5ステップ・30秒</code></pre>
<p>このマクロを使えば、<strong>ショートカットキー一発で全て自動化</strong>できます！</p>
<p><!-- ![マクロ使用時のフロー](images/macro-workflow.jpg) --></p>
<p>本記事では、実際にClaude Codeを使って開発したマクロの詳細と、効果的な使い方を紹介します。</p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで (Software Design plus)","b":"技術評論社","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/510GhCOD1FL._SL500_.jpg","\/41og2y1EEHL._SL500_.jpg","\/51XHb97PpFL._SL500_.jpg","\/51uDIY22bQL._SL500_.jpg","\/51PaoVK3MWL._SL500_.jpg","\/51eG7JBoavL._SL500_.jpg","\/51CDCo8FmJL._SL500_.jpg","\/41JLTXb+tsL._SL500_.jpg","\/51Hsv39e7IL._SL500_.jpg","\/41PTe+TqLEL._SL500_.jpg","\/51TUxdoXjrL._SL500_.jpg","\/51AkZEJWGhL._SL500_.jpg","\/51paP7D5R5L._SL500_.jpg","\/41lJtbpaQvL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4297127474","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4297127474","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AETypeScript%E5%85%A5%E9%96%80%20%E5%AE%89%E5%85%A8%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%8B%E3%82%89%E9%AB%98%E5%BA%A6%E3%81%AA%E5%9E%8B%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81%A7%20(Software%20Design%20plus)\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AETypeScript%E5%85%A5%E9%96%80%20%E5%AE%89%E5%85%A8%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%8B%E3%82%89%E9%AB%98%E5%BA%A6%E3%81%AA%E5%9E%8B%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81%A7%20(Software%20Design%20plus)","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"OaDLa","s":"s"});</script></p>
<div id="msmaflink-OaDLa">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc2">この記事で分かること</span></h2>
<ul>
<li>クリップボード画像挿入マクロの機能</li>
<li>コードの詳細解説</li>
<li>インストール方法</li>
<li>実践的な使い方</li>
<li>トラブルシューティング</li>
<li>Claude Codeでの開発体験</li>
</ul>
<h2><span id="toc3">こんな人におすすめ</span></h2>
<ul>
<li>Markdownでブログやドキュメントを書く人</li>
<li>画像挿入作業を効率化したい人</li>
<li>VSCodeでマクロを作りたい人</li>
<li>TypeScriptで拡張機能開発を学びたい人</li>
</ul>
<h2><span id="toc4">機能概要</span></h2>
<h3><span id="toc5">できること</span></h3>
<p><strong>ショートカットキー一発で：</strong></p>
<pre><code class="language-plaintext">1. クリップボードの画像を取得
2. 画像名とファイル名を入力（ダイアログ）
3. ![]形式でカーソル位置に挿入
4. imagesフォルダに画像を保存
→ わずか10秒！</code></pre>
<p><!-- ![マクロ実行の流れ](images/macro-execution-flow.jpg) --></p>
<h3><span id="toc6">具体例</span></h3>
<p><strong>操作：</strong></p>
<pre><code class="language-plaintext">1. スクリーンショットを撮る（Win+Shift+S）
2. Ctrl+Shift+I を押す
3. 画像名入力: "サンプル画面"
4. ファイル名入力: "sample-screen"</code></pre>
<p><strong>結果：</strong></p>
<p><!-- ```markdown
![サンプル画面](images/sample-screen.jpg)
``` --></p>
<pre><code class="language-plaintext">✅ imagesフォルダが自動作成
✅ sample-screen.jpgが保存される
✅ Markdownテキストが挿入される</code></pre>
<h2><span id="toc7">コード詳細解説</span></h2>
<h3><span id="toc8">全体構造</span></h3>
<pre><code class="language-typescript">// src/macros/insertImageFromClipboard.ts
import * as vscode from 'vscode';
import * as fs from 'fs';
import * as path from 'path';
import { exec } from 'child_process';
import { promisify } from 'util';

const execAsync = promisify(exec);

export async function insertImageFromClipboard() {
    // 機能実装
}</code></pre>
<h3><span id="toc9">1. アクティブエディタの取得</span></h3>
<pre><code class="language-typescript">const editor = vscode.window.activeTextEditor;
if (!editor) {
    vscode.window.showWarningMessage('アクティブなエディタがありません');
    return;
}</code></pre>
<p><!-- ![エディタチェック](images/editor-check.jpg) --></p>
<p><strong>ポイント：</strong></p>
<ul>
<li>VSCodeのアクティブなエディタを取得</li>
<li>エディタがない場合は警告を表示</li>
</ul>
<h3><span id="toc10">2. ユーザー入力の取得</span></h3>
<pre><code class="language-typescript">// 画像名（altテキスト）
const imageName = await vscode.window.showInputBox({
    prompt: '画像名（altテキスト）を入力してください',
    placeHolder: '例: サンプル画像'
});

if (!imageName) return;

// ファイル名
const fileName = await vscode.window.showInputBox({
    prompt: 'ファイル名（拡張子なし）を入力してください',
    placeHolder: '例: sample-image'
});

if (!fileName) return;</code></pre>
<p><!-- ![入力ダイアログ](images/input-dialog.jpg) --></p>
<p><strong>ポイント：</strong></p>
<ul>
<li><code>showInputBox</code>でユーザー入力を受け付け</li>
<li><code>prompt</code>で説明文、<code>placeHolder</code>で例を表示</li>
<li>キャンセルされたら処理中断</li>
</ul>
<h3><span id="toc11">3. パス解決とフォルダ作成</span></h3>
<pre><code class="language-typescript">// 現在のファイルがあるディレクトリ
const currentDir = path.dirname(editor.document.uri.fsPath);
const imagesDir = path.join(currentDir, 'images');

// imagesフォルダ作成（なければ）
if (!fs.existsSync(imagesDir)) {
    fs.mkdirSync(imagesDir, { recursive: true });
}

// 出力パス
const outputPath = path.join(imagesDir, `${fileName}.jpg`);</code></pre>
<p><!-- ![フォルダ構造](images/folder-structure.jpg) --></p>
<p><strong>ポイント：</strong></p>
<ul>
<li><code>path.dirname</code>で現在のディレクトリを取得</li>
<li><code>fs.mkdirSync</code>でフォルダ作成</li>
<li><code>recursive: true</code>で親フォルダも自動作成</li>
</ul>
<h3><span id="toc12">4. PowerShellで画像取得</span></h3>
<pre><code class="language-typescript">const psScript = `
    Add-Type -AssemblyName System.Windows.Forms;
    Add-Type -AssemblyName System.Drawing;
    $img = [System.Windows.Forms.Clipboard]::GetImage();
    if ($img) {
        $img.Save('${outputPath.replace(/\\/g, '\\\\')}', [System.Drawing.Imaging.ImageFormat]::Jpeg);
        exit 0;
    } else {
        exit 1;
    }
`;

try {
    await execAsync(`powershell -Command "${psScript}"`);
} catch (error) {
    vscode.window.showErrorMessage(`画像の取得に失敗しました`);
    return;
}</code></pre>
<p><!-- ![PowerShell実行](images/powershell-execution.jpg) --></p>
<p><strong>ポイント：</strong></p>
<ul>
<li>Windows.Formsでクリップボードにアクセス</li>
<li>JPEG形式で保存</li>
<li>バックスラッシュをエスケープ</li>
</ul>
<h3><span id="toc13">5. Markdownテキスト挿入</span></h3>
<pre><code class="language-typescript">const markdownText = `![${imageName}](images/${fileName}.jpg)`;

editor.edit(editBuilder => {
    editBuilder.insert(editor.selection.active, markdownText);
});

vscode.window.showInformationMessage(
    `画像を挿入しました: ${fileName}.jpg`
);</code></pre>
<p><!-- ![Markdown挿入](images/markdown-insert.jpg) --></p>
<p><strong>ポイント：</strong></p>
<ul>
<li><code>editor.edit</code>でテキスト編集</li>
<li>カーソル位置に挿入</li>
<li>完了メッセージ表示</li>
</ul>
<h2><span id="toc14">インストール方法</span></h2>
<h3><span id="toc15">1. 拡張機能プロジェクトの準備</span></h3>
<pre><code class="language-bash"># プロジェクト作成
mkdir my-macros
cd my-macros

# 初期化
npm init -y

# VSCode拡張機能用パッケージ
npm install --save-dev @types/vscode @types/node typescript
npm install --save-dev @vscode/vsce</code></pre>
<h3><span id="toc16">2. ファイル配置</span></h3>
<pre><code class="language-plaintext">my-macros/
├── src/
│   ├── extension.ts
│   └── macros/
│       └── insertImageFromClipboard.ts
├── package.json
└── tsconfig.json</code></pre>
<h3><span id="toc17">3. extension.tsにコマンド登録</span></h3>
<pre><code class="language-typescript">// src/extension.ts
import * as vscode from 'vscode';
import { insertImageFromClipboard } from './macros/insertImageFromClipboard';

export function activate(context: vscode.ExtensionContext) {
    const command = vscode.commands.registerCommand(
        'myMacros.insertImageFromClipboard',
        insertImageFromClipboard
    );
    
    context.subscriptions.push(command);
}</code></pre>
<h3><span id="toc18">4. package.json設定</span></h3>
<pre><code class="language-json">{
  "name": "my-macros",
  "contributes": {
    "commands": [
      {
        "command": "myMacros.insertImageFromClipboard",
        "title": "Insert Image from Clipboard"
      }
    ],
    "keybindings": [
      {
        "command": "myMacros.insertImageFromClipboard",
        "key": "ctrl+shift+i",
        "when": "editorTextFocus"
      }
    ]
  }
}</code></pre>
<h3><span id="toc19">5. ビルドとインストール</span></h3>
<pre><code class="language-bash"># コンパイル
npm run compile

# VSIXパッケージ作成
vsce package

# VSCodeにインストール
code --install-extension my-macros-0.0.1.vsix</code></pre>
<h2><span id="toc20">実践的な使い方</span></h2>
<h3><span id="toc21">基本的な使い方</span></h3>
<p><strong>1. スクリーンショットを撮る</strong></p>
<pre><code class="language-plaintext">Windows: Win + Shift + S
macOS: Cmd + Shift + 4</code></pre>
<p><strong>2. Markdownファイルを開く</strong></p>
<pre><code class="language-bash">code article.md</code></pre>
<p><strong>3. 挿入位置にカーソルを置く</strong></p>
<p><strong>4. Ctrl+Shift+I を押す</strong></p>
<p><strong>5. 情報を入力</strong></p>
<pre><code class="language-plaintext">画像名: サンプル画面
ファイル名: sample-screen</code></pre>
<p><!-- ![基本的な使い方](images/basic-usage.jpg) --></p>
<h3><span id="toc22">ブログ執筆での活用</span></h3>
<p><strong>記事構造：</strong></p>
<pre><code class="language-plaintext">article/
├── post.md
└── images/
    ├── intro.jpg
    ├── step1.jpg
    ├── step2.jpg
    └── result.jpg</code></pre>
<p><strong>執筆フロー：</strong></p>
<pre><code class="language-markdown"># 記事タイトル

## はじめに

<!-- ![イントロ画面](images/intro.jpg) -->
↑ Ctrl+Shift+Iで一発挿入！

## 手順

### ステップ1

<!-- ![手順１](images/step1.jpg) -->
↑ スクリーンショット後すぐ挿入！

### ステップ2

<!-- ![手順２](images/step2.jpg) --></code></pre>
<h3><span id="toc23">ドキュメント作成での活用</span></h3>
<p><strong>設計書：</strong></p>
<pre><code class="language-markdown"># システム設計書

## 画面遷移図

<!-- ![画面遷移図](images/screen-flow.jpg) -->

## データベース設計

<!-- ![ER図](images/er-diagram.jpg) -->

## UIモックアップ

<!-- ![メイン画面](images/main-screen-mock.jpg) --></code></pre>
<h3><span id="toc24">議事録での活用</span></h3>
<pre><code class="language-markdown"># 2026/02/12 打ち合わせ議事録

## ホワイトボード

<!-- ![ホワイトボード内容](images/whiteboard-20260212.jpg) -->

## 資料スクリーンショット

<!-- ![スライド5](images/slide05.jpg) --></code></pre>
<h2><span id="toc25">トラブルシューティング</span></h2>
<h3><span id="toc26">エラー: クリップボードに画像がない</span></h3>
<p><strong>エラーメッセージ：</strong></p>
<pre><code class="language-plaintext">画像の取得に失敗しました</code></pre>
<p><strong>原因：</strong></p>
<ul>
<li>クリップボードに画像がコピーされていない</li>
<li>テキストデータやファイルがコピーされている</li>
</ul>
<p><strong>解決策：</strong></p>
<pre><code class="language-plaintext">1. スクリーンショットを再度撮る
2. 画像編集ソフトからコピー
3. ブラウザの画像を右クリック→画像をコピー</code></pre>
<h3><span id="toc27">エラー: imagesフォルダ作成に失敗</span></h3>
<p><strong>エラーメッセージ：</strong></p>
<pre><code class="language-plaintext">EACCES: permission denied</code></pre>
<p><strong>原因：</strong></p>
<ul>
<li>書き込み権限がない</li>
</ul>
<p><strong>解決策：</strong></p>
<pre><code class="language-plaintext">1. ファイルの保存場所を変更
2. ユーザーディレクトリで作業
3. VSCodeを管理者権限で起動</code></pre>
<h3><span id="toc28">エラー: ショートカットキーが動かない</span></h3>
<p><strong>原因：</strong></p>
<ul>
<li>他の拡張機能とキーバインドが競合</li>
</ul>
<p><strong>確認方法：</strong></p>
<pre><code class="language-plaintext">1. Ctrl+Shift+P
2. "Preferences: Open Keyboard Shortcuts"
3. "ctrl+shift+i" で検索</code></pre>
<p><strong>解決策：</strong></p>
<pre><code class="language-json">// keybindings.json
{
    "key": "ctrl+alt+i",  // 別のキーに変更
    "command": "myMacros.insertImageFromClipboard",
    "when": "editorTextFocus"
}</code></pre>
<h2><span id="toc29">Claude Codeでの開発体験</span></h2>
<p>このマクロは、実際にClaude Codeを使って開発しました。</p>
<h3><span id="toc30">開発時間の比較</span></h3>
<p>Claude Codeを使った場合と使わなかった場合で、開発効率に大きな違いがありました。</p>
<p>詳しくはこちらの記事で解説しています：</p>

<a rel="noopener" href="https://caymezon.com/claude-code-efficiency-comparison/" title="Claude Code vs Web版・Desktop版 開発効率徹底比較｜実際のマクロ開発で検証" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/claude-code-efficiency-comparison-featured-2c6fec-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/claude-code-efficiency-comparison-featured-2c6fec-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-efficiency-comparison-featured-2c6fec-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-efficiency-comparison-featured-2c6fec-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-efficiency-comparison-featured-2c6fec-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Claude Code vs Web版・Desktop版 開発効率徹底比較｜実際のマクロ開発で検証</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「Claude Codeって本当に効率的なの？」そんな疑問を持つ開発者は多いはずです。実際、Web版やDesktop版と比べて、どれくらいのメリットがあるのかイメージしにくいかもしれません。本記事では、実際に「VSCodeでクリップ...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.14</div></div></div></div></a>
<p><strong>主なポイント：</strong></p>
<ul>
<li>Claude Code: 8分</li>
<li>Web版: 17分</li>
<li>効率: 53%向上</li>
</ul>
<h3><span id="toc31">Claude Codeのメリット</span></h3>
<p>✅ <strong>プロジェクト理解</strong></p>
<ul>
<li>既存マクロのパターンを自動認識</li>
<li>一貫性のあるコード生成</li>
</ul>
<p>✅ <strong>直接ファイル操作</strong></p>
<ul>
<li>コピペ不要</li>
<li>エディタ切替不要</li>
</ul>
<p>✅ <strong>高速な修正</strong></p>
<ul>
<li>エラーを即座に修正</li>
<li>全体の整合性保持</li>
</ul>
<h2><span id="toc32">メリット・デメリット</span></h2>
<h3><span id="toc33">メリット</span></h3>
<p>✅ <strong>圧倒的な時短効果</strong></p>
<pre><code class="language-plaintext">従来: 30秒 × 10画像 = 5分
マクロ: 10秒 × 10画像 = 1.5分
→ 3.5分の短縮！70%減）</code></pre>
<p>✅ <strong>ファイル管理が楽</strong></p>
<ul>
<li>自動でimagesフォルダ作成</li>
<li>ファイル名の統一管理</li>
</ul>
<p>✅ <strong>ミスが減る</strong></p>
<ul>
<li>ファイル名のタイプミス防止</li>
<li>パス間違い防止</li>
</ul>
<h3><span id="toc34">デメリット</span></h3>
<p>⚠️ <strong>Windows専用</strong></p>
<ul>
<li>PowerShell依存</li>
<li>macOS/Linuxでは修正必要</li>
</ul>
<p>⚠️ <strong>初期設定が必要</strong></p>
<ul>
<li>拡張機能のインストール</li>
<li>ショートカットキー設定</li>
</ul>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発","b":"オライリージャパン","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51vjj+osAgL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4873119049","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4873119049","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0TypeScript%20%E2%80%95%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8BJavaScript%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0TypeScript%20%E2%80%95%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8BJavaScript%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"vFiVC","s":"s"});</script></p>
<div id="msmaflink-vFiVC">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc35">まとめ</span></h2>
<p>VSCodeでクリップボード画像をMarkdown化するマクロを紹介しました。</p>
<p><strong>主な機能：</strong></p>
<p>✅ ショートカットキー一発で画像挿入<br />✅ ダイアログで画像名とファイル名を入力<br />✅ ![]形式で自動挿入<br />✅ imagesフォルダに画像保存</p>
<p><strong>効果：</strong></p>
<p>🚀 70%の時短<br />🚀 ミスの削減<br />🚀 ワークフローの改善</p>
<p><strong>活用シーン：</strong></p>
<p>📝 ブログ執筆<br />📝 技術ドキュメント<br />📝 議事録作成<br />📝 README作成</p>
<p><strong>開発体験：</strong></p>
<p>Claude Codeを使って、8分で実装できました。詳しくは関連記事をご覧ください。</p>
<p><strong>関連記事：</strong></p>
<ul>
<li>Claude Code完全ガイド</li>
</ul>

<a rel="noopener" href="https://caymezon.com/claude-code-overview/" title="Claude Code完全ガイド｜ターミナルで動くAIコーディングアシスタントの全貌【2026年6月版】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Claude Code完全ガイド｜ターミナルで動くAIコーディングアシスタントの全貌【2026年6月版】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「AIにコードを書かせたいけど、ブラウザとエディタを行き来するのが面倒…」そんな悩みを解決するのがClaude Codeです。2026年6月時点で、Anthropicが提供するターミナル型AIエージェントとして、開発者の間で急速に注...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.14</div></div></div></div></a>
<ul>
<li>Claude Code環境構築ガイド</li>
</ul>

<a rel="noopener" href="https://caymezon.com/claude-code-setup-guide/" title="Claude Code環境構築完全ガイド｜初心者でも30分でセットアップできる詳細手順" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/claude-code-setup-guide-featured-90954f-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/claude-code-setup-guide-featured-90954f-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-setup-guide-featured-90954f-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-setup-guide-featured-90954f-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-setup-guide-featured-90954f-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Claude Code環境構築完全ガイド｜初心者でも30分でセットアップできる詳細手順</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「Claude Codeを使ってみたいけど、環境構築が難しそう…」そんな不安を持つ方も多いはずです。実際、ターミナルベースのツールは初心者にとってハードルが高く感じられます。しかし、この記事の手順通りに進めれば、初心者でも30分でC...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.14</div></div></div></div></a>
<ul>
<li>Claude Code vs Web版・Desktop版 比較</li>
</ul>

<a rel="noopener" href="https://caymezon.com/claude-code-efficiency-comparison/" title="Claude Code vs Web版・Desktop版 開発効率徹底比較｜実際のマクロ開発で検証" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/claude-code-efficiency-comparison-featured-2c6fec-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/claude-code-efficiency-comparison-featured-2c6fec-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-efficiency-comparison-featured-2c6fec-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-efficiency-comparison-featured-2c6fec-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-efficiency-comparison-featured-2c6fec-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Claude Code vs Web版・Desktop版 開発効率徹底比較｜実際のマクロ開発で検証</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「Claude Codeって本当に効率的なの？」そんな疑問を持つ開発者は多いはずです。実際、Web版やDesktop版と比べて、どれくらいのメリットがあるのかイメージしにくいかもしれません。本記事では、実際に「VSCodeでクリップ...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.14</div></div></div></div></a>
<hr>
<p><strong>タグ:</strong> #VSCode #TypeScript #マクロ #Markdown #生産性向上 #クリップボード</p><p>The post <a href="https://caymezon.com/vscode-clipboard-image-macro/">VSCodeで画像挿入が一瞬！クリップボード画像をMarkdown化するTypeScriptマクロ</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/vscode-clipboard-image-macro/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPressブログの執筆環境を劇的改善した話【VSCode × Markdown × 自動化】</title>
		<link>https://caymezon.com/wordpress-writing-environment-improvement/</link>
					<comments>https://caymezon.com/wordpress-writing-environment-improvement/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Mon, 12 Jan 2026 07:17:47 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[VSCode]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[生産性向上]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://caymezon.com/wordpress-writing-environment-improvement/</guid>

					<description><![CDATA[<p>目次 はじめに：執筆環境の重要性Before：WordPress標準の執筆フロー従来の方法問題点After：理想の執筆環境新しい方法改善されたこと実際の運用フロー日常的な記事投稿既存記事の更新複数記事の一括投稿GitHu [&#8230;]</p>
<p>The post <a href="https://caymezon.com/wordpress-writing-environment-improvement/">WordPressブログの執筆環境を劇的改善した話【VSCode × Markdown × 自動化】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに：執筆環境の重要性</a></li><li><a href="#toc2" tabindex="0">Before：WordPress標準の執筆フロー</a><ol><li><a href="#toc3" tabindex="0">従来の方法</a></li><li><a href="#toc4" tabindex="0">問題点</a></li></ol></li><li><a href="#toc5" tabindex="0">After：理想の執筆環境</a><ol><li><a href="#toc6" tabindex="0">新しい方法</a></li><li><a href="#toc7" tabindex="0">改善されたこと</a></li></ol></li><li><a href="#toc8" tabindex="0">実際の運用フロー</a><ol><li><a href="#toc9" tabindex="0">日常的な記事投稿</a></li><li><a href="#toc10" tabindex="0">既存記事の更新</a></li><li><a href="#toc11" tabindex="0">複数記事の一括投稿</a></li></ol></li><li><a href="#toc12" tabindex="0">GitHub Actions連携</a><ol><li><a href="#toc13" tabindex="0">さらなる自動化</a></li></ol></li><li><a href="#toc14" tabindex="0">効果測定</a><ol><li><a href="#toc15" tabindex="0">定量的な改善</a></li><li><a href="#toc16" tabindex="0">定性的な改善</a></li></ol></li><li><a href="#toc17" tabindex="0">Tips & Best Practices</a><ol><li><a href="#toc18" tabindex="0">1. フォルダ構成の工夫</a></li><li><a href="#toc19" tabindex="0">2. テンプレートの活用</a></li><li><a href="#toc20" tabindex="0">3. 画像の命名規則</a></li><li><a href="#toc21" tabindex="0">4. プレビューの活用</a></li><li><a href="#toc22" tabindex="0">5. スニペットの活用</a></li></ol></li><li><a href="#toc23" tabindex="0">トラブルシューティング</a><ol><li><a href="#toc24" tabindex="0">よくある問題と解決策</a></li></ol></li><li><a href="#toc25" tabindex="0">まとめ</a><ol><li><a href="#toc26" tabindex="0">改善のポイント</a></li><li><a href="#toc27" tabindex="0">Before → After</a></li><li><a href="#toc28" tabindex="0">得られたもの</a></li></ol></li><li><a href="#toc29" tabindex="0">おわりに</a></li><li><a href="#toc30" tabindex="0">参考リンク</a></li><li><a href="#toc31" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに：執筆環境の重要性</span></h2>
<p>ブログを続けるために最も重要なことは何でしょうか？</p>
<ul>
<li>文章力？</li>
<li>ネタ探し？</li>
<li>SEO対策？</li>
</ul>
<p>もちろん、これらも重要です。しかし、私が最も重要だと考えるのは、<strong>執筆環境の快適さ</strong>です。</p>
<p>書きやすい環境があれば、自然と記事を書きたくなります。逆に、環境が悪いと、書くこと自体がストレスになります。</p>
<p>この記事では、私がWordPressブログの執筆環境を劇的に改善した方法をご紹介します。</p>
<p><img decoding="async" src="images/01-environment-comparison.png" alt="執筆環境の変化"></p>
<p> </p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"【改訂第3版】WordPress 仕事の現場でサッと使える！ デザイン教科書 ［WordPress 6.x対応版］ (Webデザイナー養成講座)","b":"技術評論社","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/514CbLHJNVL._SL500_.jpg","\/518zU1JQhaL._SL500_.jpg","\/51JppOL1T3L._SL500_.jpg","\/51ytewMgIGL._SL500_.jpg","\/51ZwjXcqdnL._SL500_.jpg","\/51DY9XYqPTL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4297135779","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4297135779","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/%E3%80%90%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88%E3%80%91WordPress%20%E4%BB%95%E4%BA%8B%E3%81%AE%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%82%B5%E3%83%83%E3%81%A8%E4%BD%BF%E3%81%88%E3%82%8B%EF%BC%81%20%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E6%95%99%E7%A7%91%E6%9B%B8%20%EF%BC%BBWordPress%206.x%E5%AF%BE%E5%BF%9C%E7%89%88%EF%BC%BD%20(Web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E9%A4%8A%E6%88%90%E8%AC%9B%E5%BA%A7)\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=%E3%80%90%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88%E3%80%91WordPress%20%E4%BB%95%E4%BA%8B%E3%81%AE%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%82%B5%E3%83%83%E3%81%A8%E4%BD%BF%E3%81%88%E3%82%8B%EF%BC%81%20%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E6%95%99%E7%A7%91%E6%9B%B8%20%EF%BC%BBWordPress%206.x%E5%AF%BE%E5%BF%9C%E7%89%88%EF%BC%BD%20(Web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E9%A4%8A%E6%88%90%E8%AC%9B%E5%BA%A7)","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"ywMaT","s":"s"});</script></p>
<div id="msmaflink-ywMaT">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc2">Before：WordPress標準の執筆フロー</span></h2>
<h3><span id="toc3">従来の方法</span></h3>
<p><strong>私が以前使っていた方法：</strong></p>
<pre><code class="language-plaintext">1. WordPress管理画面を開く
   → ログイン
   
2. Gutenbergエディタで執筆
   → ブラウザ上で直接編集
   
3. 画像をドラッグ&ドロップ
   → Media Libraryにアップロード
   
4. プレビュー確認
   → 別タブで開く
   
5. 公開
   → 「公開」ボタンをクリック</code></pre>
<h3><span id="toc4">問題点</span></h3>
<p><strong>1. ブラウザに依存</strong></p>
<ul>
<li>ブラウザがクラッシュしたら、書いた内容が消える</li>
<li>自動保存はあるが、常に不安</li>
</ul>
<p><strong>2. バージョン管理ができない</strong></p>
<ul>
<li>いつ何を変更したか分からない</li>
<li>過去のバージョンに戻せない</li>
</ul>
<p><strong>3. 画像管理が煩雑</strong></p>
<ul>
<li>同じ画像を何度もアップロード</li>
<li>Media Libraryが肥大化</li>
<li>どれが最新の画像か分からない</li>
</ul>
<p><strong>4. オフライン作業ができない</strong></p>
<ul>
<li>ネット環境が必須</li>
<li>移動中に書けない</li>
</ul>
<p><strong>5. 執筆に集中できない</strong></p>
<ul>
<li>Gutenbergの操作に気を取られる</li>
<li>Markdown記法が使えない</li>
</ul>
<p> </p>
<h2><span id="toc5">After：理想の執筆環境</span></h2>
<h3><span id="toc6">新しい方法</span></h3>
<p><strong>現在の方法：</strong></p>
<pre><code class="language-plaintext">1. VSCodeで記事作成
   → Markdown記法で執筆
   → Ctrl+Shift+V でプレビュー
   
2. 画像を配置
   → ローカルフォルダに保存
   
3. スクリプト実行
   → npm run publish
   
4. WordPress管理画面で確認
   → 公開</code></pre>
<h3><span id="toc7">改善されたこと</span></h3>
<p><strong>1. 慣れ親しんだエディタ</strong></p>
<ul>
<li>VSCodeで執筆</li>
<li>ショートカットキーが使える</li>
<li>拡張機能が使える</li>
</ul>
<p><strong>2. バージョン管理</strong></p>
<pre><code class="language-bash">git commit -m "記事追加：○○について"
git push</code></pre>
<ul>
<li>いつ何を変更したか記録</li>
<li>過去のバージョンに戻せる</li>
<li>チーム開発も可能</li>
</ul>
<p><strong>3. 画像管理の自動化</strong></p>
<ul>
<li>画像を上書き保存すればOK</li>
<li>自動で変更を検知</li>
<li>Media Libraryがクリーン</li>
</ul>
<p><strong>4. オフライン作業</strong></p>
<ul>
<li>ネット環境不要</li>
<li>移動中でも書ける</li>
<li>書き溜めておいて、まとめて投稿</li>
</ul>
<p><strong>5. 執筆に集中</strong></p>
<ul>
<li>Markdownでシンプルに書ける</li>
<li>プレビューも高速</li>
<li>余計な操作が不要</li>
</ul>
<p> </p>
<h2><span id="toc8">実際の運用フロー</span></h2>
<h3><span id="toc9">日常的な記事投稿</span></h3>
<h4>Step 1：記事作成</h4>
<p><strong>VSCodeで記事を書く：</strong></p>
<pre><code class="language-bash">code posts/new-article/post.md</code></pre>
<p><strong>Front Matter（記事のメタ情報）：</strong></p>
<pre><code class="language-yaml">---
title: "記事タイトル"
slug: new-article
category: Development
tags: [WordPress, Markdown, 自動化]
featured_image: featured.jpg
mode: html
status: draft
date: 2026-01-11
---</code></pre>
<p><strong>本文（Markdown記法）：</strong></p>
<pre><code class="language-markdown">## はじめに

この記事では、○○について解説します。

### 対象読者

- ○○に興味がある方
- ○○を始めたい方

## 本文

詳しい説明...

npm install example

![スクリーンショット](images/01-screenshot.png)

## まとめ

この記事では、以下について解説しました...</code></pre>
<p><strong>プレビュー確認：</strong></p>
<pre><code class="language-plaintext">Ctrl+Shift+V</code></pre>
<p>VSCode内でリアルタイムプレビュー！</p>
<p> </p>
<h4>Step 2：画像配置</h4>
<p><strong>フォルダ構成：</strong></p>
<pre><code class="language-plaintext">posts/new-article/
├── post.md
├── featured.jpg  ← アイキャッチ画像
└── images/
    ├── 01-screenshot.png
    └── 02-diagram.png</code></pre>
<p><strong>Markdown内の参照：</strong></p>
<pre><code class="language-markdown">![スクリーンショット](images/01-screenshot.png)
![図解](images/02-diagram.png)</code></pre>
<p><strong>シンプル！</strong></p>
<p> </p>
<h4>Step 3：スクリプト実行</h4>
<pre><code class="language-bash">npm run publish-single new-article</code></pre>
<p><strong>出力：</strong></p>
<pre><code class="language-plaintext">📝 処理開始: new-article
📄 タイトル: 記事タイトル
🎯 モード: HTML変換
🏷️  カテゴリー: Development
🔖 タグ: WordPress, Markdown, 自動化

📸 画像アップロード中...
  ✅ 01-screenshot.png → new-article-01-screenshot-a3f2b1.png
  ✅ 02-diagram.png → new-article-02-diagram-7c4d8e.png

🖼️  アイキャッチ画像アップロード中...
  ✅ featured.jpg → new-article-featured-9e8f7d.jpg

🔧 最初のH1見出しを削除（タイトル重複回避）
✨ Markdown → HTML 変換完了

✨ 新規記事を作成します
   📌 Status: draft (新規)

📤 WordPress投稿中...
✅ 投稿成功！
🔗 URL: http://example.com/new-article/
📊 ステータス: draft</code></pre>
<p><strong>数秒で完了！</strong></p>
<p> </p>
<h4>Step 4：WordPress管理画面で確認</h4>
<pre><code class="language-plaintext">1. WordPress管理画面を開く
2. 投稿 → 投稿一覧 → 下書き
3. 記事を開く
4. 最終確認
5. 「公開」ボタンをクリック</code></pre>
<p><strong>完璧に投稿されている！</strong></p>
<p> </p>
<h3><span id="toc10">既存記事の更新</span></h3>
<p><strong>さらに便利なのが、既存記事の更新です。</strong></p>
<h4>Step 1：VSCodeで編集</h4>
<pre><code class="language-bash">code posts/existing-article/post.md</code></pre>
<p><strong>内容を編集：</strong></p>
<pre><code class="language-markdown">## 追加セクション

新しい情報を追加...</code></pre>
<p> </p>
<h4>Step 2：画像も更新（オプション）</h4>
<p><strong>スクリーンショットを撮り直して、同じファイル名で上書き保存：</strong></p>
<pre><code class="language-plaintext">posts/existing-article/images/01-screenshot.png</code></pre>
<p><strong>ファイル名は変えない！</strong></p>
<p> </p>
<h4>Step 3：スクリプト実行</h4>
<pre><code class="language-bash">npm run test-local</code></pre>
<p><strong>出力：</strong></p>
<pre><code class="language-plaintext">📝 処理開始: existing-article

📸 画像アップロード中...
  🗑️  古い画像を削除: existing-article-01-screenshot-a3f2b1.png
  ✅ 01-screenshot.png → existing-article-01-screenshot-3f8d2a.png
  ♻️  02-diagram.png (変更なし)

📝 既存記事を更新します（ID: 123）
   📌 Status: publish (既存維持)

✅ 更新成功！</code></pre>
<p><strong>自動的に：</strong></p>
<ul>
<li>既存記事を検索</li>
<li>画像の変更を検知</li>
<li>古い画像を削除</li>
<li>新しい画像をアップロード</li>
<li>変更がない画像は再利用</li>
<li>記事を更新</li>
</ul>
<p><strong>完璧！</strong></p>
<p> </p>
<h3><span id="toc11">複数記事の一括投稿</span></h3>
<p><strong>過去記事の移行など：</strong></p>
<pre><code class="language-bash">npm run publish</code></pre>
<p><strong>すべての記事を自動投稿！</strong></p>
<pre><code class="language-plaintext">🚀 3 件の記事を処理します

📝 処理開始: article-1
✅ 投稿成功！

📝 処理開始: article-2
✅ 投稿成功！

📝 処理開始: article-3
✅ 投稿成功！

✅ すべての処理が完了しました</code></pre>
<p> </p>
<h2><span id="toc12">GitHub Actions連携</span></h2>
<h3><span id="toc13">さらなる自動化</span></h3>
<p><strong>次のステップ：git push で自動投稿</strong></p>
<h4>設定ファイル</h4>
<p><strong><code>.github/workflows/publish.yml</code></strong></p>
<pre><code class="language-yaml">name: Publish to WordPress

on:
  push:
    branches: [main]
    paths: ['posts/**']

jobs:
  publish:
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      
      - name: Install dependencies
        run: npm install
      
      - name: Publish to WordPress
        env:
          WP_URL: ${{ secrets.WP_URL }}
          WP_USER: ${{ secrets.WP_USER }}
          WP_APP_PASSWORD: ${{ secrets.WP_APP_PASSWORD }}
        run: npm run publish</code></pre>
<h4>GitHub Secrets設定</h4>
<pre><code class="language-plaintext">GitHub → Settings → Secrets and variables → Actions
→ New repository secret

WP_URL: https://example.com
WP_USER: username
WP_APP_PASSWORD: xxxx xxxx xxxx xxxx</code></pre>
<h4>運用フロー</h4>
<pre><code class="language-plaintext">1. VSCodeで記事作成
   posts/new-article/post.md
   
2. Git commit
   git add .
   git commit -m "記事追加：新しい記事"
   
3. Git push
   git push origin main
   
4. GitHub Actions自動実行
   → WordPressに自動投稿
   
5. メール通知
   → 投稿完了のお知らせ</code></pre>
<p><strong>完全自動化！🎉</strong></p>
<p> </p>
<h2><span id="toc14">効果測定</span></h2>
<h3><span id="toc15">定量的な改善</span></h3>
<p><strong>執筆時間の短縮：</strong></p>
<pre><code class="language-plaintext">従来の方法:
  記事作成: 2時間
  画像管理: 30分
  投稿作業: 10分
  ──────────
  合計: 2時間40分

新しい方法:
  記事作成: 2時間
  画像管理: 0分（自動）
  投稿作業: 30秒
  ──────────
  合計: 2時間30秒

短縮: 約40分</code></pre>
<p><strong>更新作業の効率化：</strong></p>
<pre><code class="language-plaintext">従来の方法:
  WordPress管理画面を開く
  → 記事を探す
  → 編集
  → 画像を差し替え
  → 保存
  合計: 約10分

新しい方法:
  VSCodeで編集
  → npm run publish
  合計: 約30秒

短縮: 約9分30秒</code></pre>
<p><strong>年間の効果：</strong></p>
<pre><code class="language-plaintext">週1回の記事投稿 × 52週 = 52記事/年

短縮時間:
  投稿: 40分 × 52回 = 2,080分 (約35時間)
  更新: 9.5分 × 52回 = 494分 (約8時間)
  ──────────────────
  合計: 約43時間/年

浮いた時間で約21記事追加可能！</code></pre>
<p> </p>
<h3><span id="toc16">定性的な改善</span></h3>
<p><strong>1. ストレスの軽減</strong></p>
<ul>
<li>ブラウザクラッシュの不安がない</li>
<li>画像管理の煩わしさがない</li>
<li>執筆に集中できる</li>
</ul>
<p><strong>2. モチベーションの向上</strong></p>
<ul>
<li>書きやすいから、書きたくなる</li>
<li>ワンコマンドで投稿できる満足感</li>
<li>Git管理による安心感</li>
</ul>
<p><strong>3. 記事の品質向上</strong></p>
<ul>
<li>プレビューで確認しやすい</li>
<li>過去のバージョンと比較できる</li>
<li>落ち着いて推敲できる</li>
</ul>
<p><strong>4. 継続しやすい</strong></p>
<ul>
<li>オフラインでも書ける</li>
<li>スキマ時間を活用</li>
<li>無理なく続けられる</li>
</ul>
<p> </p>
<h2><span id="toc17">Tips & Best Practices</span></h2>
<h3><span id="toc18">1. フォルダ構成の工夫</span></h3>
<p><strong>推奨構成：</strong></p>
<pre><code class="language-plaintext">posts/
├── 2025/
│   ├── 01-january/
│   │   ├── article-1/
│   │   └── article-2/
│   └── 02-february/
│       └── article-3/
└── 2026/
    └── 01-january/
        └── article-4/</code></pre>
<p><strong>メリット：</strong></p>
<ul>
<li>記事が探しやすい</li>
<li>管理しやすい</li>
<li>アーカイブしやすい</li>
</ul>
<p> </p>
<h3><span id="toc19">2. テンプレートの活用</span></h3>
<p><strong>記事テンプレート：</strong></p>
<pre><code class="language-bash">cp templates/post-template.md posts/new-article/post.md</code></pre>
<p><strong>テンプレート内容：</strong></p>
<pre><code class="language-markdown">---
title: "【カテゴリ名】記事タイトル"
slug: article-name
category: Development
tags: [タグ1, タグ2]
featured_image: featured.jpg
mode: html
status: draft
date: 2026-01-11
---

## はじめに

この記事では...

### 対象読者

- ○○な方
- ○○を始めたい方

## 本文

詳しい説明...

## まとめ

この記事では...</code></pre>
<p><strong>効率アップ！</strong></p>
<p> </p>
<h3><span id="toc20">3. 画像の命名規則</span></h3>
<p><strong>推奨：</strong></p>
<pre><code class="language-plaintext">01-descriptive-name.png
02-another-image.png
03-final-screenshot.png</code></pre>
<p><strong>メリット：</strong></p>
<ul>
<li>順番が分かる</li>
<li>内容が分かる</li>
<li>管理しやすい</li>
</ul>
<p> </p>
<h3><span id="toc21">4. プレビューの活用</span></h3>
<p><strong>VSCodeの拡張機能：</strong></p>
<ul>
<li>
<p><strong>Markdown All in One</strong></p>
<ul>
<li>便利なショートカット</li>
<li>Table of Contents自動生成</li>
</ul>
</li>
<li>
<p><strong>Markdown Preview Enhanced</strong></p>
<ul>
<li>リッチなプレビュー</li>
<li>PDF出力</li>
</ul>
</li>
</ul>
<p><strong>Ctrl+Shift+V で即座にプレビュー！</strong></p>
<p> </p>
<h3><span id="toc22">5. スニペットの活用</span></h3>
<p><strong>VSCodeスニペット：</strong></p>
<pre><code class="language-json">{
  "Code Block": {
    "prefix": "code",
    "body": [
      "```${1:bash}",
      "$0",
      "```"
    ]
  },
  "Image": {
    "prefix": "img",
    "body": [
      "![${1:説明}](images/${2:filename}.png)"
    ]
  }
}</code></pre>
<p><strong>使い方：</strong></p>
<pre><code class="language-plaintext">code → Tab → コードブロック完成
img → Tab → 画像リンク完成</code></pre>
<p> </p>
<h2><span id="toc23">トラブルシューティング</span></h2>
<h3><span id="toc24">よくある問題と解決策</span></h3>
<p><strong>問題1：画像が表示されない</strong></p>
<p><strong>原因：</strong></p>
<ul>
<li>画像パスが間違っている</li>
</ul>
<p><strong>確認：</strong></p>
<pre><code class="language-plaintext">post.md: ![説明](images/screenshot.png)
実際のファイル: posts/article/images/screenshot.png</code></pre>
<p><strong>解決：</strong></p>
<ul>
<li>パスを修正</li>
<li>ファイル名を確認</li>
</ul>
<p> </p>
<p><strong>問題2：既存記事が見つからない</strong></p>
<p><strong>原因：</strong></p>
<ul>
<li>スラッグが違っている</li>
</ul>
<p><strong>確認：</strong></p>
<pre><code class="language-plaintext">post.md: slug: article-name
WordPress: 既存記事のスラッグ？</code></pre>
<p><strong>解決：</strong></p>
<ul>
<li>スラッグを一致させる</li>
<li>WordPress管理画面で確認</li>
</ul>
<p> </p>
<p><strong>問題3：認証エラー</strong></p>
<p><strong>原因：</strong></p>
<ul>
<li>Application Passwordが間違っている</li>
</ul>
<p><strong>解決：</strong></p>
<pre><code class="language-plaintext">1. WordPress管理画面
   → ユーザー → プロフィール
   → アプリケーションパスワード
   
2. 新しいパスワードを生成

3. .env.local を更新
   WP_APP_PASSWORD=xxxx xxxx xxxx xxxx</code></pre>
<p> </p>
<h2><span id="toc25">まとめ</span></h2>
<h3><span id="toc26">改善のポイント</span></h3>
<p><strong>1. 執筆環境を整える</strong></p>
<ul>
<li>慣れ親しんだエディタ</li>
<li>Markdown記法</li>
<li>リアルタイムプレビュー</li>
</ul>
<p><strong>2. 自動化する</strong></p>
<ul>
<li>画像アップロード</li>
<li>パス置換</li>
<li>既存記事の更新</li>
</ul>
<p><strong>3. バージョン管理</strong></p>
<ul>
<li>Git管理</li>
<li>履歴が残る</li>
<li>安心感</li>
</ul>
<p><strong>4. 継続的な改善</strong></p>
<ul>
<li>GitHub Actions連携</li>
<li>さらなる自動化</li>
<li>効率化</li>
</ul>
<h3><span id="toc27">Before → After</span></h3>
<p><strong>Before（従来の方法）：</strong></p>
<pre><code class="language-plaintext">WordPress Gutenbergで執筆
  ↓ ブラウザに依存
  ↓ バージョン管理なし
  ↓ 画像管理が煩雑
  ↓ ストレス</code></pre>
<p><strong>After（新しい方法）：</strong></p>
<pre><code class="language-plaintext">VSCodeで執筆
  ↓ Markdown記法
  ↓ Git管理
  ↓ 画像自動管理
  ↓ npm run publish
  ↓ 快適！</code></pre>
<h3><span id="toc28">得られたもの</span></h3>
<p><strong>時間：</strong></p>
<ul>
<li>年間約43時間の短縮</li>
<li>浮いた時間で約21記事追加可能</li>
</ul>
<p><strong>快適さ：</strong></p>
<ul>
<li>ストレスフリーな執筆環境</li>
<li>執筆に集中できる</li>
<li>書くことが楽しくなる</li>
</ul>
<p><strong>継続性：</strong></p>
<ul>
<li>モチベーション維持</li>
<li>無理なく続けられる</li>
<li>ブログが続く</li>
</ul>
<p><strong>品質：</strong></p>
<ul>
<li>落ち着いて推敲できる</li>
<li>バージョン管理で安心</li>
<li>記事の品質が向上</li>
</ul>
<p> </p>
<h2><span id="toc29">おわりに</span></h2>
<p>ブログを続けるために最も重要なのは、<strong>書きやすい環境</strong>です。</p>
<p>環境が整えば、自然と記事を書きたくなります。</p>
<p>私の場合、執筆環境を改善したことで：</p>
<ul>
<li>記事を書くことが楽しくなった</li>
<li>更新頻度が上がった</li>
<li>記事の品質が向上した</li>
</ul>
<p>そして何より、<strong>執筆そのものに集中できる</strong>ようになりました。</p>
<p>もしあなたがWordPressでブログを書いているなら、ぜひこの方法を試してみてください。</p>
<p>きっと、ブログを書くことがもっと楽しくなるはずです。</p>
<p><strong>Happy Blogging! 🚀</strong></p>
<hr>
<h2><span id="toc30">参考リンク</span></h2>
<ul>
<li><a href="https://code.visualstudio.com/">VSCode</a></li>
<li><a href="https://www.markdownguide.org/">Markdown Guide</a></li>
<li><a href="https://github.com/features/actions">GitHub Actions</a></li>
<li><a href="https://developer.wordpress.org/rest-api/">WordPress REST API</a></li>
</ul>
<h2><span id="toc31">関連記事</span></h2>
<ul>
<li>
<p><strong>VSCodeからWordPressへ！Markdown記事を自動投稿するシステムを作った話</strong></p>
<ul>
<li>システムの全体像と開発の経緯</li>
</ul>
</li>
<li>
<p><strong>【試行錯誤の記録】WordPress画像管理を最適化！ハッシュベースの賢い仕組み</strong></p>
<ul>
<li>画像管理の技術的な詳細</li>
</ul>
</li>
</ul>
<p><!-- ## GitHub

実際のコードは、GitHubで公開予定です。 --></p>
<p><strong>最終更新：</strong> 2026-01-11</p><p>The post <a href="https://caymezon.com/wordpress-writing-environment-improvement/">WordPressブログの執筆環境を劇的改善した話【VSCode × Markdown × 自動化】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/wordpress-writing-environment-improvement/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VSCodeからWordPressへ！Markdown記事を自動投稿するシステムを作った話</title>
		<link>https://caymezon.com/vscode-wordpress-markdown-publisher/</link>
					<comments>https://caymezon.com/vscode-wordpress-markdown-publisher/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Mon, 12 Jan 2026 05:58:23 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[REST API]]></category>
		<category><![CDATA[VSCode]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://caymezon.com/vscode-wordpress-markdown-publisher/</guid>

					<description><![CDATA[<p>目次 はじめに：なぜこのシステムを作ったのか理想の執筆環境とは求めていた機能開発の流れ：試行錯誤の連続Phase 1：まずは基本機能Phase 2：画像アップロードの実装Phase 3：WP Githuber MDプラグ [&#8230;]</p>
<p>The post <a href="https://caymezon.com/vscode-wordpress-markdown-publisher/">VSCodeからWordPressへ！Markdown記事を自動投稿するシステムを作った話</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに：なぜこのシステムを作ったのか</a></li><li><a href="#toc2" tabindex="0">理想の執筆環境とは</a><ol><li><a href="#toc3" tabindex="0">求めていた機能</a></li></ol></li><li><a href="#toc4" tabindex="0">開発の流れ：試行錯誤の連続</a><ol><li><a href="#toc5" tabindex="0">Phase 1：まずは基本機能</a></li><li><a href="#toc6" tabindex="0">Phase 2：画像アップロードの実装</a></li><li><a href="#toc7" tabindex="0">Phase 3：WP Githuber MDプラグインとの出会い</a></li></ol></li><li><a href="#toc8" tabindex="0">遭遇した問題たち</a><ol><li><a href="#toc9" tabindex="0">問題1：Markdownがそのまま表示される</a></li><li><a href="#toc10" tabindex="0">問題2：既存記事がHTMLの場合</a></li><li><a href="#toc11" tabindex="0">問題3：画像が増え続ける</a></li></ol></li><li><a href="#toc12" tabindex="0">最大の挑戦：画像管理の最適化</a><ol><li><a href="#toc13" tabindex="0">解決策の検討</a></li><li><a href="#toc14" tabindex="0">ハッシュベースの実装</a></li></ol></li><li><a href="#toc15" tabindex="0">完成したシステム</a><ol><li><a href="#toc16" tabindex="0">最終的なアーキテクチャ</a></li><li><a href="#toc17" tabindex="0">主要機能</a></li></ol></li><li><a href="#toc18" tabindex="0">実際の運用フロー</a><ol><li><a href="#toc19" tabindex="0">日常的な記事投稿</a></li><li><a href="#toc20" tabindex="0">既存記事の更新</a></li></ol></li><li><a href="#toc21" tabindex="0">得られたメリット</a><ol><li><a href="#toc22" tabindex="0">1. 執筆効率の向上</a></li><li><a href="#toc23" tabindex="0">2. 画像管理の最適化</a></li><li><a href="#toc24" tabindex="0">3. 既存記事の更新が楽</a></li><li><a href="#toc25" tabindex="0">4. バージョン管理</a></li></ol></li><li><a href="#toc26" tabindex="0">今後の展望</a><ol><li><a href="#toc27" tabindex="0">GitHub Actions連携</a></li><li><a href="#toc28" tabindex="0">複数サイト対応</a></li><li><a href="#toc29" tabindex="0">バルク投稿</a></li></ol></li><li><a href="#toc30" tabindex="0">まとめ</a><ol><li><a href="#toc31" tabindex="0">開発を通じて学んだこと</a></li><li><a href="#toc32" tabindex="0">このシステムを作って良かったこと</a></li></ol></li><li><a href="#toc33" tabindex="0">技術スタック</a></li><li><a href="#toc34" tabindex="0">おわりに</a></li><li><a href="#toc35" tabindex="0">参考リンク</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに：なぜこのシステムを作ったのか</span></h2>
<p>ブログを書くとき、皆さんはどんなエディタを使っていますか？</p>
<p>WordPress標準のGutenbergエディタも便利ですが、長文を書いているとこんな不満が出てきませんか？</p>
<ul>
<li><strong>ブラウザがクラッシュしたら書いた内容が消える不安</strong></li>
<li><strong>画像管理が煩雑で、同じ画像が重複してアップロードされる</strong></li>
<li><strong>Markdown記法で書けないもどかしさ</strong></li>
<li><strong>バージョン管理ができない</strong></li>
</ul>
<p>私もまさにこの悩みを抱えていました。そこで、<strong>VSCodeでMarkdownを書いて、ワンコマンドでWordPressに投稿できるシステム</strong>を作ることにしました。</p>
<p>この記事では、その開発の経緯と、遭遇した問題、そして最終的に完成したシステムについてご紹介します。</p>
<p> </p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"Visual Studio Code実践入門! ~ソフトウェア開発の強力手段","b":"","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51+Jrz2cBnL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/486594334X","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/486594334X","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/Visual%20Studio%20Code%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80!%20~%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%BC%B7%E5%8A%9B%E6%89%8B%E6%AE%B5\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=Visual%20Studio%20Code%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80!%20~%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%BC%B7%E5%8A%9B%E6%89%8B%E6%AE%B5","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"sl77U","s":"s"});</script></p>
<div id="msmaflink-sl77U">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"【改訂第3版】WordPress 仕事の現場でサッと使える！ デザイン教科書 ［WordPress 6.x対応版］ (Webデザイナー養成講座)","b":"技術評論社","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/514CbLHJNVL._SL500_.jpg","\/518zU1JQhaL._SL500_.jpg","\/51JppOL1T3L._SL500_.jpg","\/51ytewMgIGL._SL500_.jpg","\/51ZwjXcqdnL._SL500_.jpg","\/51DY9XYqPTL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4297135779","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4297135779","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/%E3%80%90%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88%E3%80%91WordPress%20%E4%BB%95%E4%BA%8B%E3%81%AE%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%82%B5%E3%83%83%E3%81%A8%E4%BD%BF%E3%81%88%E3%82%8B%EF%BC%81%20%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E6%95%99%E7%A7%91%E6%9B%B8%20%EF%BC%BBWordPress%206.x%E5%AF%BE%E5%BF%9C%E7%89%88%EF%BC%BD%20(Web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E9%A4%8A%E6%88%90%E8%AC%9B%E5%BA%A7)\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=%E3%80%90%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88%E3%80%91WordPress%20%E4%BB%95%E4%BA%8B%E3%81%AE%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%82%B5%E3%83%83%E3%81%A8%E4%BD%BF%E3%81%88%E3%82%8B%EF%BC%81%20%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E6%95%99%E7%A7%91%E6%9B%B8%20%EF%BC%BBWordPress%206.x%E5%AF%BE%E5%BF%9C%E7%89%88%EF%BC%BD%20(Web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E9%A4%8A%E6%88%90%E8%AC%9B%E5%BA%A7)","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"ywMaT","s":"s"});</script></p>
<div id="msmaflink-ywMaT">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc2">理想の執筆環境とは</span></h2>
<p>まず、私が目指した理想の執筆環境はこんな感じです：</p>
<h3><span id="toc3">求めていた機能</span></h3>
<p><strong>1. VSCodeでMarkdownを書きたい</strong></p>
<ul>
<li>慣れ親しんだエディタで執筆</li>
<li>リアルタイムプレビュー（Ctrl+Shift+V）</li>
<li>Gitでバージョン管理</li>
</ul>
<p><strong>2. 画像管理を自動化したい</strong></p>
<ul>
<li>ローカルの画像を自動アップロード</li>
<li>画像パスを自動で置換</li>
<li>同じ画像の重複を避ける</li>
</ul>
<p><strong>3. ワンコマンドで投稿したい</strong></p>
<pre><code class="language-bash">npm run publish</code></pre>
<p>これだけで完了！</p>
<p><strong>4. 既存記事の更新も自動化したい</strong></p>
<ul>
<li>スラッグで既存記事を検索</li>
<li>見つかったら自動更新</li>
<li>見つからなければ新規投稿</li>
</ul>
<p> </p>
<h2><span id="toc4">開発の流れ：試行錯誤の連続</span></h2>
<h3><span id="toc5">Phase 1：まずは基本機能</span></h3>
<p>最初は、シンプルに「MarkdownをWordPressに投稿する」ことを目指しました。</p>
<p><strong>使用した技術：</strong></p>
<ul>
<li>Node.js</li>
<li>WordPress REST API</li>
<li><code>marked</code>（Markdown → HTML変換）</li>
<li><code>gray-matter</code>（Front Matter解析）</li>
</ul>
<p><strong>基本的な処理フロー：</strong></p>
<pre><code class="language-plaintext">1. post.md を読み込み
2. Front Matter解析（タイトル、スラッグなど）
3. Markdown → HTML変換
4. WordPress REST APIで投稿</code></pre>
<p><strong>最初のコード（簡略版）：</strong></p>
<pre><code class="language-javascript">const marked = require('marked');
const matter = require('gray-matter');
const axios = require('axios');

// Markdownファイル読み込み
const fileContent = fs.readFileSync('post.md', 'utf-8');
const { data: frontMatter, content: markdown } = matter(fileContent);

// HTML変換
const htmlContent = marked(markdown);

// WordPress投稿
await axios.post(
  `${WP_URL}/wp-json/wp/v2/posts`,
  {
    title: frontMatter.title,
    content: htmlContent,
    slug: frontMatter.slug,
    status: 'draft'
  },
  { auth: { username: WP_USER, password: WP_APP_PASSWORD } }
);</code></pre>
<p>この時点では、<strong>「動く！」という感動</strong>がありました。VSCodeで書いた記事が本当にWordPressに投稿されたのです。</p>
<p> </p>
<h3><span id="toc6">Phase 2：画像アップロードの実装</span></h3>
<p>次に、画像の自動アップロードに取り組みました。</p>
<p><strong>課題：</strong></p>
<ul>
<li>Markdown内の相対パス（<code>images/screenshot.png</code>）を、WordPressのURLに置換する必要がある</li>
</ul>
<p><strong>解決策：</strong></p>
<ol>
<li><code>images/</code> フォルダ内の画像を全てアップロード</li>
<li>アップロード後のURLを取得</li>
<li>Markdown内のパスを置換</li>
</ol>
<p><strong>実装：</strong></p>
<pre><code class="language-javascript">// 画像アップロード
const imageMap = {};

for (const imageFile of imageFiles) {
  const imagePath = path.join(imagesDir, imageFile);
  
  const form = new FormData();
  form.append('file', fs.createReadStream(imagePath));
  
  const response = await axios.post(
    `${WP_URL}/wp-json/wp/v2/media`,
    form,
    { auth: { username: WP_USER, password: WP_APP_PASSWORD } }
  );
  
  // ローカルパス → WordPressのURL
  imageMap[`images/${imageFile}`] = response.data.source_url;
}

// Markdown内のパスを置換
let updatedMarkdown = markdown;
for (const [localPath, wpUrl] of Object.entries(imageMap)) {
  updatedMarkdown = updatedMarkdown.replace(
    new RegExp(`\\(${localPath}\\)`, 'g'),
    `(${wpUrl})`
  );
}</code></pre>
<p>これで、<strong>画像が自動でアップロードされ、記事内のリンクも正しく置換される</strong>ようになりました！</p>
<p> </p>
<h3><span id="toc7">Phase 3：WP Githuber MDプラグインとの出会い</span></h3>
<p>ここで、<strong>WP Githuber MD</strong>という素晴らしいプラグインを発見しました。</p>
<p>このプラグインを使うと、WordPress側でもMarkdown記法で編集できます。つまり：</p>
<pre><code class="language-plaintext">VSCodeでMarkdown編集
  ↓
WordPressに投稿（Markdownのまま）
  ↓
WordPress側でもMarkdown編集可能！</code></pre>
<p><strong>試してみた結果：</strong></p>
<p>最初は「Markdown → HTML変換」していましたが、WP Githuber MDを使えば<strong>Markdownをそのまま投稿</strong>できるはず...</p>
<p><strong>しかし、ここで大きな問題が発生しました。</strong></p>
<p> </p>
<h2><span id="toc8">遭遇した問題たち</span></h2>
<h3><span id="toc9">問題1：Markdownがそのまま表示される</span></h3>
<p><strong>症状：</strong></p>
<pre><code class="language-plaintext">
## 見出し

本文...</code></pre>
<p>このMarkdownをそのまま送信すると、WordPress側で：</p>
<pre><code class="language-html"><p># タイトル</p>
<p>## 見出し</p>
<p>本文...</p></code></pre>
<p><strong>Markdownの記号がそのまま表示されてしまいました。</strong></p>
<p><strong>原因：</strong></p>
<ul>
<li>WordPress REST APIは、デフォルトでMarkdownを認識しない</li>
<li>WP Githuber MDのメタフィールドを設定する必要がある</li>
</ul>
<p><strong>解決策：</strong></p>
<pre><code class="language-javascript">// メタフィールドを追加
const postData = {
  title: frontMatter.title,
  content: markdown,  // HTMLではなくMarkdown
  meta: {
    _is_githuber_markdown: '1',
    _is_githuber_markdown_enabled: 'yes'
  }
};</code></pre>
<p>これで、<strong>Markdownがそのまま送信され、WordPress側で正しく表示される</strong>ようになりました！</p>
<p> </p>
<h3><span id="toc10">問題2：既存記事がHTMLの場合</span></h3>
<p><strong>次の問題：</strong></p>
<p>既存記事（すでにHTMLで保存されている）を、Markdownで更新しようとすると...</p>
<p><strong>症状：</strong></p>
<pre><code class="language-plaintext">既存記事（HTML形式）
  ↓
Markdownを送信
  ↓
WordPress: 「これはテキストだ」
  ↓
<p>## 見出し</p> で保存される</code></pre>
<p><strong>つまり、一度HTMLとして保存された記事は、Markdownとして認識されない！</strong></p>
<p><strong>試行錯誤：</strong></p>
<ol>
<li>WordPress管理画面で手動変換 → 面倒</li>
<li>記事を削除して再投稿 → 一時的に記事が消える</li>
<li>モード切替可能にする → <strong>これだ！</strong></li>
</ol>
<p> </p>
<h3><span id="toc11">問題3：画像が増え続ける</span></h3>
<p><strong>最大の問題：</strong></p>
<p>記事を更新するたびに、画像が新規アップロードされる：</p>
<pre><code class="language-plaintext">1回目: featured.jpg
2回目: featured-2.jpg  ← 新規
3回目: featured-3.jpg  ← どんどん増える</code></pre>
<p><strong>WordPress Media Libraryが肥大化！</strong></p>
<p>この問題の解決が、今回の開発で最も時間をかけた部分でした。</p>
<p> </p>
<h2><span id="toc12">最大の挑戦：画像管理の最適化</span></h2>
<h3><span id="toc13">解決策の検討</span></h3>
<p><strong>方法1：画像を再利用</strong></p>
<ul>
<li>ファイル名で検索 → 見つかったら再利用</li>
<li><strong>問題：</strong> 内容が変わっても検出できない</li>
</ul>
<p><strong>方法2：削除して再アップロード</strong></p>
<ul>
<li>毎回削除 → 再アップロード</li>
<li><strong>問題：</strong> 遅い、無駄</li>
</ul>
<p><strong>方法3：ハッシュベース（採用！）</strong></p>
<ul>
<li>画像の内容からハッシュを計算</li>
<li>ハッシュが一致 → 再利用</li>
<li>ハッシュが異なる → 削除して再アップロード</li>
</ul>
<h3><span id="toc14">ハッシュベースの実装</span></h3>
<p><strong>1. ハッシュ計算：</strong></p>
<pre><code class="language-javascript">const crypto = require('crypto');

function calculateFileHash(filePath) {
  const fileBuffer = fs.readFileSync(filePath);
  const hashSum = crypto.createHash('md5');
  hashSum.update(fileBuffer);
  const hex = hashSum.digest('hex');
  return hex.substring(0, 6);  // 最初の6桁
}</code></pre>
<p><strong>2. ファイル名にハッシュを含める：</strong></p>
<pre><code class="language-plaintext">元のファイル名: featured.jpg
  ↓
ハッシュ計算: a3f2b1
  ↓
新しいファイル名: article-slug-featured-a3f2b1.jpg</code></pre>
<p><strong>3. 既存画像を検索：</strong></p>
<pre><code class="language-javascript">async function findExistingImageByPattern(slug, originalFileName) {
  const searchPattern = `${slug}-${originalFileName}`;
  
  const response = await axios.get(
    `${WP_URL}/wp-json/wp/v2/media`,
    {
      auth: { username: WP_USER, password: WP_APP_PASSWORD },
      params: { search: searchPattern }
    }
  );
  
  // パターンに一致する画像を探す
  for (const media of response.data) {
    const fileName = path.basename(media.source_url);
    if (fileName.startsWith(searchPattern)) {
      return media;
    }
  }
  
  return null;
}</code></pre>
<p><strong>4. 統合処理：</strong></p>
<pre><code class="language-javascript">async function uploadOrReuseImage(imagePath, fileName, slug) {
  // ハッシュ計算
  const hash = calculateFileHash(imagePath);
  const newFileName = `${slug}-${fileName}-${hash}.jpg`;
  
  // 既存画像を検索
  const existingImage = await findExistingImageByPattern(slug, fileName);
  
  if (existingImage) {
    const existingFileName = path.basename(existingImage.source_url);
    
    if (existingFileName.includes(`-${hash}`)) {
      // ハッシュ一致 → 再利用
      console.log(`♻️  ${fileName} (変更なし)`);
      return { id: existingImage.id, url: existingImage.source_url };
    } else {
      // ハッシュ不一致 → 削除
      console.log(`🗑️  古い画像を削除`);
      await deleteImage(existingImage.id);
    }
  }
  
  // 新規アップロード
  console.log(`✅ ${fileName} → ${newFileName}`);
  return await uploadImage(imagePath, newFileName);
}</code></pre>
<p><strong>結果：</strong></p>
<pre><code class="language-plaintext">1回目実行:
  ✅ featured.jpg → article-featured-a3f2b1.jpg

2回目実行（画像変更なし）:
  ♻️  featured.jpg (変更なし)  ← 再利用！

3回目実行（画像を更新）:
  🗑️  古い画像を削除: article-featured-a3f2b1.jpg
  ✅ featured.jpg → article-featured-9e8f7d.jpg  ← 新しいハッシュ</code></pre>
<p><strong>完璧に動作しました！🎉</strong></p>
<p> </p>
<h2><span id="toc15">完成したシステム</span></h2>
<h3><span id="toc16">最終的なアーキテクチャ</span></h3>
<pre><code class="language-plaintext">VSCode
  ↓ Markdown記法で執筆
posts/
├── article-name/
│   ├── post.md
│   ├── featured.jpg
│   └── images/
│       └── screenshot.png
  ↓ npm run publish
Node.jsスクリプト
  ├─ Front Matter解析
  ├─ H1削除
  ├─ 画像アップロード（ハッシュ管理）
  ├─ パス置換
  ├─ HTML変換（HTMLモード）
  └─ 既存記事検索・更新
  ↓ WordPress REST API
WordPress
  ↓ 表示
ブログ記事</code></pre>
<h3><span id="toc17">主要機能</span></h3>
<p><strong>1. 2つのモード</strong></p>
<pre><code class="language-yaml"># HTMLモード（推奨）
mode: html
→ スクリプト側でHTML変換
→ Gutenbergエディタ

# Markdownモード
mode: markdown
→ Markdownをそのまま送信
→ WP Githuber MDエディタ</code></pre>
<p><strong>2. 既存記事の自動更新</strong></p>
<pre><code class="language-javascript">// 既存記事を検索
const existingPost = await findExistingPost(frontMatter.slug);

if (existingPost) {
  // 更新
  await axios.post(`/wp-json/wp/v2/posts/${existingPost.id}`, data);
} else {
  // 新規投稿
  await axios.post(`/wp-json/wp/v2/posts`, data);
}</code></pre>
<p><strong>3. ハッシュベースの画像管理</strong></p>
<pre><code class="language-plaintext">画像変更なし → 再利用 ♻️
画像変更あり → 削除 🗑️ → 再アップロード ✅</code></pre>
<p><strong>4. タイトル重複の自動回避</strong></p>
<pre><code class="language-javascript">// 最初のH1を自動削除
updatedMarkdown = removeFirstH1(updatedMarkdown);</code></pre>
<p> </p>
<h2><span id="toc18">実際の運用フロー</span></h2>
<h3><span id="toc19">日常的な記事投稿</span></h3>
<pre><code class="language-bash"># 1. 記事作成
code posts/new-article/post.md

# 2. 画像配置
posts/new-article/
├── post.md
├── featured.jpg
└── images/
    └── screenshot.png

# 3. プレビュー確認
Ctrl+Shift+V

# 4. 投稿
npm run publish-single new-article

# 5. WordPress管理画面で確認
→ 公開</code></pre>
<p><strong>所要時間：わずか数秒！</strong></p>
<h3><span id="toc20">既存記事の更新</span></h3>
<pre><code class="language-bash"># 1. VSCodeで編集
code posts/existing-article/post.md

# 2. 画像も更新（上書き保存）
posts/existing-article/images/screenshot.png

# 3. 投稿
npm run test-local

# 4. 出力確認
📸 画像アップロード中...
  🗑️  古い画像を削除: article-screenshot-a3f2b1.png
  ✅ screenshot.png → article-screenshot-9e8f7d.png
📝 既存記事を更新します（ID: 123）
✅ 更新成功！</code></pre>
<p><strong>画像の更新も自動検出！</strong></p>
<p> </p>
<h2><span id="toc21">得られたメリット</span></h2>
<h3><span id="toc22">1. 執筆効率の向上</span></h3>
<p><strong>Before：</strong></p>
<pre><code class="language-plaintext">WordPress Gutenbergで執筆
  ↓ 画像をドラッグ&ドロップ
  ↓ ブラウザがクラッシュしないか不安
  ↓ バージョン管理なし</code></pre>
<p><strong>After：</strong></p>
<pre><code class="language-plaintext">VSCodeで執筆
  ↓ Ctrl+Shift+V でプレビュー
  ↓ Gitでバージョン管理
  ↓ npm run publish
  ↓ 完了！</code></pre>
<h3><span id="toc23">2. 画像管理の最適化</span></h3>
<p><strong>Before：</strong></p>
<pre><code class="language-plaintext">同じ画像が何度もアップロードされる
→ Media Libraryが肥大化
→ 管理が大変</code></pre>
<p><strong>After：</strong></p>
<pre><code class="language-plaintext">画像の内容が変わっていなければ再利用
→ Media Libraryがクリーン
→ 無駄なアップロードなし</code></pre>
<h3><span id="toc24">3. 既存記事の更新が楽</span></h3>
<p><strong>Before：</strong></p>
<pre><code class="language-plaintext">WordPress管理画面を開く
→ 記事を探す
→ 編集
→ 保存</code></pre>
<p><strong>After：</strong></p>
<pre><code class="language-plaintext">VSCodeで編集
→ npm run publish
→ 完了！</code></pre>
<h3><span id="toc25">4. バージョン管理</span></h3>
<p><strong>Gitで管理：</strong></p>
<pre><code class="language-bash">git commit -m "記事追加：○○について"
git push</code></pre>
<p><strong>履歴が残る：</strong></p>
<ul>
<li>いつ何を変更したか</li>
<li>過去のバージョンに戻せる</li>
<li>チーム開発も可能</li>
</ul>
<p> </p>
<h2><span id="toc26">今後の展望</span></h2>
<h3><span id="toc27">GitHub Actions連携</span></h3>
<p>次のステップは、<strong>GitHub Actionsでの自動投稿</strong>です：</p>
<pre><code class="language-yaml">name: Publish to WordPress

on:
  push:
    branches: [main]
    paths: ['posts/**']

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
      - run: npm install
      - env:
          WP_URL: ${{ secrets.WP_URL }}
          WP_USER: ${{ secrets.WP_USER }}
          WP_APP_PASSWORD: ${{ secrets.WP_APP_PASSWORD }}
        run: npm run publish</code></pre>
<p><strong>運用フロー：</strong></p>
<pre><code class="language-plaintext">VSCodeで記事作成
  ↓
git push
  ↓
GitHub Actions自動実行
  ↓
WordPressに自動投稿</code></pre>
<p><strong>完全自動化！</strong></p>
<h3><span id="toc28">複数サイト対応</span></h3>
<p>複数のWordPressサイトへの投稿も検討中：</p>
<pre><code class="language-bash">npm run publish-site1
npm run publish-site2</code></pre>
<h3><span id="toc29">バルク投稿</span></h3>
<p>過去記事の一括移行：</p>
<pre><code class="language-bash">npm run publish  # 全記事を投稿</code></pre>
<p> </p>
<h2><span id="toc30">まとめ</span></h2>
<h3><span id="toc31">開発を通じて学んだこと</span></h3>
<p><strong>1. 試行錯誤の重要性</strong></p>
<p>最初から完璧なシステムは作れません。問題に遭遇するたびに、解決策を考え、実装し、改善する。この繰り返しが重要でした。</p>
<p><strong>2. ユーザー体験の大切さ</strong></p>
<p>技術的に可能でも、運用が面倒では意味がありません。「ファイル名を変える」という一手間を省くために、ハッシュベースの仕組みを実装しました。</p>
<p><strong>3. ドキュメントの価値</strong></p>
<p>試行錯誤の過程を記録しておくことで、後から見返したときに「なぜこうしたのか」が分かります。</p>
<h3><span id="toc32">このシステムを作って良かったこと</span></h3>
<ul>
<li><strong>執筆が楽しくなった</strong></li>
<li><strong>バージョン管理ができるようになった</strong></li>
<li><strong>画像管理のストレスがなくなった</strong></li>
<li><strong>記事の更新が簡単になった</strong></li>
</ul>
<p>そして何より、<strong>このシステム自体がブログ記事になりました！</strong></p>
<p> </p>
<h2><span id="toc33">技術スタック</span></h2>
<p>最後に、使用した技術をまとめておきます：</p>
<p><strong>言語・ランタイム：</strong></p>
<ul>
<li>Node.js</li>
</ul>
<p><strong>ライブラリ：</strong></p>
<ul>
<li><code>axios</code> - HTTP通信</li>
<li><code>marked</code> - Markdown → HTML変換</li>
<li><code>gray-matter</code> - Front Matter解析</li>
<li><code>form-data</code> - ファイルアップロード</li>
<li><code>dotenv</code> - 環境変数管理</li>
<li><code>crypto</code> - ハッシュ計算</li>
</ul>
<p><strong>WordPress側：</strong></p>
<ul>
<li>WordPress REST API</li>
<li>WP Githuber MD（オプション）</li>
</ul>
<p><strong>エディタ：</strong></p>
<ul>
<li>VSCode</li>
</ul>
<p><strong>バージョン管理：</strong></p>
<ul>
<li>Git / GitHub</li>
</ul>
<p> </p>
<h2><span id="toc34">おわりに</span></h2>
<p>VSCodeでブログを書きたい、画像管理を自動化したい、という単純な動機から始まったこのプロジェクト。</p>
<p>試行錯誤を繰り返しながら、最終的には想像以上に完成度の高いシステムになりました。</p>
<p>もし同じような悩みを抱えている方がいたら、この記事が参考になれば嬉しいです。</p>
<p>そして、「自分でツールを作る」という選択肢を持つことで、日々の作業がもっと楽しくなるかもしれません。</p>
<p><strong>Happy Blogging! 🚀</strong></p>
<hr>
<h2><span id="toc35">参考リンク</span></h2>
<ul>
<li><a href="https://developer.wordpress.org/rest-api/">WordPress REST API ハンドブック</a></li>
<li><a href="https://wordpress.org/plugins/wp-githuber-md/">WP Githuber MD</a></li>
<li><a href="https://marked.js.org/">Marked.js</a></li>
<li><a href="https://nodejs.org/api/crypto.html">Node.js Crypto</a></li>
</ul>
<p><!-- ## GitHub

実際のコードは、GitHubで公開する予定です。（準備中） --></p>
<p><strong>最終更新：</strong> 2026-01-11</p><p>The post <a href="https://caymezon.com/vscode-wordpress-markdown-publisher/">VSCodeからWordPressへ！Markdown記事を自動投稿するシステムを作った話</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/vscode-wordpress-markdown-publisher/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
