VimからWordPressのエントリを投稿する方法

2022-10-12Bash,PHP,Vim,WordPress

僕がエントリを投稿するときはいつも Vim で下書きした内容をクリップボードに貼り付け、WordPress の新規投稿ページに貼り付ける、という流れで投稿していますが、 これを Vim の世界だけで完結できないかと思い調べてみました。

WordPress.vim

便利そうな Vim のプラグインを発見

機能概要

一部抜粋。

This is a mirror of http://www.vim.org/scripts/script.php?script_id=3510

VimRepress is a plugin for managing wordpress blog from Vim, a rewritten of vimscript #1953 , which is broken for years.

Now VimRepress lives with more powerful again.

REQUIREMENT

  • Vim 7.3+ with python 2.6/2.7 support
  • Python Environment matched wtih Vim's support
  • python-markdown/python-markdown2 installed
  • wordpress 3.0.0 +

翻訳してみました。

これはhttp://www.vim.org/scripts/script.php?script_id=3510のミラーです。

VimRepress は、Vim の WordPress ブログを管理するためのプラグインです。

VimRepress は継続して改良し続けています(?)

利用前提条件

  • Python 2.6 / 2.7 をサポートする Vim 7.3 以降
  • Python Environment と Vim のサポート
  • python-markdown / python-markdown2 がインストールされている
  • ワードプレス 3.0.0 +

インストール

僕は Dein を導入しているので、以下の流れでインストールしました。

1) .vimrc に以下の行を追記

call dein#add('vim-scripts/VimRepress')

2) Vim を再起動してから以下のコマンドを叩く

:call dein#check_install()

WordPress へ接続するための設定

WordPress の設定ファイルを準備。
$HOME/.vimpressrcに、次のフォーマットで保存。

[Blog0]
blog_url = https://genzouw.com/
username = xxxxx
password = xxxxx

早速以下のコマンドを叩いてみました。

:BlogList

すると。

E492: エディタのコマンドではありません: BlogList

どうやら Vim8 環境あるいは Python3.x 環境では動作しない模様。

諦めて自前でスクリプトを作成

PHP の実行環境が自分の PC にインストールされているため、PHP のライブラリを使って Post する仕組みを構築。

利用したライブラリ

Packagist.org から見つけてきました。

rolenweb/xml-rpc-wordpress-api - Packagist

インストール

Composer を使って Global にインストールしておく。

$ composer global require "rolenweb/xml-rpc-wordpress-api":"dev-master"
Changed current directory to /Users/genzouw/.composer
    1/4:        http://repo.packagist.org/p/provider-latest$78a26b432085a9dfaedb51bd1cff21ba02403ca37be768d9a77763b06ceafa2c.json
    2/4:        http://repo.packagist.org/p/provider-2018-10$599298cdc63481e696c9eb1d095e9ab500797b126dce1feb6828ca63caf1988c.json
    3/4:        http://repo.packagist.org/p/provider-2019-01$a1f9fdc0a36682e80076f0b9b19c0780e04b3c73bd0f0751077ced9858b81b43.json
    4/4:        http://repo.packagist.org/p/provider-2017$07b8f0494281eadcafd1a1d4352b061f65f4dc4505b170d5f2d0a42ea60237d7.json
    Finished: success: 4, skipped: 0, failure: 0, total: 4
./composer.json has been updated
    1/1:        http://repo.packagist.org/p/provider-latest$3411cb05ae76e361d730b1bffd10b63ad42ff95b950429b914aef1b5ce272068.json
    Finished: success: 1, skipped: 0, failure: 0, total: 1
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing rolenweb/xml-rpc-wordpress-api (dev-master 4177850): Cloning 4177850faf from cache
Package ramsey/array_column is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file

エントリ投稿様スクリプトの作成

PATH の通ったディレクトリにファイルを作成します。

例) wp-post.php

$ cat <<'EOF' >$HOME/bin/wp-post.php
#!/usr/bin/env php
<?php

require getenv('HOME') . '/.composer/vendor/autoload.php';

use Rolenweb\Wpapi\Wp;

$wp = new Wp(getenv('WP_URL'), getenv('WP_USER'), getenv('WP_PASSWORD'));

$lines = explode("\n", file_get_contents('php://stdin'));

$wp->newPost([
    'post_type' => 'post',
    'post_content' => implode('\n', array_slice($lines, 2)),
    'post_title' => preg_replace('/^# +/su', '', $lines[0]),
    'post_status' => 'draft',
    'custom_fields' => [
        [
            'key' => 'key',
            'value' => 'value',
        ],
    ],
]);
EOF

$ chmod 700 $HOME/bin/wp-post.php

使い方

事前に以下の環境変数を設定しておきます。

WP_URL=<https://YOUR-SITE-DOMAIN>
WP_USER=<YOUR_LOGIN_ID>
WP_PASSWORD=<YOUR_LOGIN_PASSWORD>

適当に記事ファイルを作成(1 行目にはタイトル、スペースを開けて 3 行目から本文)。

cat <<EOF > entry.txt
TITLEほげほげ

BODY1
BODY2
BODY3
EOF

これを標準入力としてスクリプトに食わせ。

$ cat entry.txt | wp-post.php

テスト

ちゃんと下書きエントリが増えている、と思ったら思い切り文字化けしている。

2020-05-24 追記 : 対処法を後述


2020-05-24 追記

先のライブラリの文字化け解消方法が特定できました。
ラッパーライブラリを自作し対処しました。
Packagist.org で公開したのでもしよかったらお使い下さい。

https://packagist.org/packages/genzouw/xmlrpc-wordpress-api


当面は今までどおりクリップボードに貼り付けてのエントリ投稿ですね

なんとか文字化けの問題にも対処できたので、PHP のスクリプトをコマンドラインから呼び出して投稿できました!

2022-10-12Bash,PHP,Vim,WordPress