WordPressの全データをREST-API(wp-json)でダンプするツールを作った

2022年2月7日

ツールというほど立派なものではないですが。

繰り返しwp-jsonにアクセスするだけの単純なスクリプトみたいなものです。

インストールは次のように行います(goコマンドが必要です)。

$ go install github.com/ryer/wpdump@latest

WordPress.ORGの固定ページデータをダウンロードするとしたらこうやります。

$ wpdump --url 'https://wordpress.org/news/wp-json/wp/v2' --pages --dir /tmp
Dumped(pages): /tmp/pages0001.json

こんなことは普通にcurlでアクセスしてもできることですね。


このツールの特徴は merge というオプションです。

WordPress.ORGの全データをダンプするとしたら次のようにします。

(※)クローラーみたいなものなので、あんまり知らないサイトに実行すると怒られるかも?

$ wpdump --url 'https://wordpress.org/news/wp-json/wp/v2' --all --merge --dir /tmp
Dumped(categories): /tmp/categories.json
Dumped(pages): /tmp/pages.json
Dumped(tags): /tmp/tags.json
Dumped(media): /tmp/media.json
Dumped(posts): /tmp/posts.json
Dumped(users): /tmp/users.json

大量のデータがあるときにwp-jsonではページング機能(page=1, page=2…)を使う必要があります。

この場合、複数のJSONファイルに分割してしまって少々面倒なんですね。

mergeオプションを使うと複数のJSONファイルを1つにまとめてくれます。

ツールの内部でやっている事はというと、ファイルの中身の文字列を結合しているだけですけど😅


あとはカスタム投稿タイプにも対応しています。

$ wpdump --url 'https://example.com/wp-json/wp/v2' --custom shop --dir /tmp
Dumped(shop): /tmp/shop0001.json

ただし事前にWordPressへwp-jsonを公開する設定が必要です。

普通の人がカスタム投稿タイプを定義するときには「Custom Post Type UI」のような便利プラグインを使っていると思います。

その場合には「Show in REST API」というような設定をOnにすればwp-jsonでダンプ可能となります。

カスタム投稿タイプをPHPコードで定義しているような奇特な人には説明は不要かもですが、次のようにします。

register_post_type('shop', [
    ...
    'show_in_rest' => true, // ← これを足す
    ...
]);

register_taxonomy('shop_category', [
    ...
    'show_in_rest' => true, // ← これを足す
    ...
]);

これでwp-jsonへ公開され、ダンプ可能になります。


ダンプするJSONに任意のフィールドを足すこともできます。

これは投稿メタデータをwp-jsonへ公開したい場合に行う事になるでしょう。例えば次のようにします。

register_rest_field(
    'post',
    'related_post',
    [
      'get_callback' => function ($post) {
        $meta = [];
        $meta['related_post_01'] = get_post_meta($post['id'], 'related_post_01', true);
        $meta['related_post_02'] = get_post_meta($post['id'], 'related_post_02', true);
        $meta['related_post_03'] = get_post_meta($post['id'], 'related_post_03', true);
        $meta['related_post_04'] = get_post_meta($post['id'], 'related_post_04', true);
        $meta['related_post_05'] = get_post_meta($post['id'], 'related_post_05', true);
        return $meta;
      }
    ]
  );

どんなデータでも適当に追加できるのでJSONは便利ですね。


ダンプしたJSONファイルをどう使うかは自由です。

スクリプトからJSONファイルを使いやすくするためのヘルパーも用意しました。

自分はPHPerなのでPHP用です。

先程のWordPress.ORGの全ダンプに対して次のようなコードを適用してみます。

require 'vendor/autoload.php';
$wpDump = new WPDumpSupport\WPDump("/tmp");
$wpDump->load();
echo 'link: ' . $wpDump->posts[8455]->link . PHP_EOL;
echo 'title: ' . $wpDump->posts[8455]->title . PHP_EOL;
echo 'author: ' . $wpDump->posts[8455]->author->name . PHP_EOL;
echo 'category: ' . $wpDump->posts[8455]->categories[0]->name . PHP_EOL;

実行すると次のような結果になります。

$ php t.php
link: https://wordpress.org/news/2020/03/adderley/
title: WordPress 5.4 “Adderley”
author: Matt Mullenweg
category: Releases

このようにデータ同士の参照を自動構成してくれるヘルパーです。

内部的にはそんなに大したことをやっているわけでもないですが、それなりに便利です。


今回紹介したツールは、WordPressの全データを取り出してごにょごにょなにかをする時に便利かと思いますので、よかったら使ってみてください。

なにか不都合があればGitHubのほうへNew issueしてくださいね。

ほとんど自分の備忘のために書いたような記事ですが、久しぶりにプログラムの話題でした!

でわでわ。