LIGのメルマガ、はじめました!
LIGのメルマガ、はじめました!

WordPressでWP-CLIを使って記事移行とかを少し楽にする

づや

こんにちは、エンジニアのづやです。

ここのところ、「CSVからWordPressにデータを取り込みたい!」「ルールに沿って特定のカテゴリを違うカテゴリに付け替えたい!」などのお話を受けることが多かったので、苦労した点とかを共有したいと思います。

気軽なやり方

全然大したことない処理のときは、phpファイルを作って、WordPressだけ呼び出して処理ですね、お手軽。

<?php
require_once "wp-load.php"; // パスは環境によって変えてね
?>

これを読み込んだら、WordPress関数が使えるので、CLIからphpとして実行したり、まあdocument rootにおいて実行して消すなりしちゃえばOKです。WordPress管理外じゃないけど、WordPressの記事を引っ張りたいときとかと一緒ですね。

たまに「wp-blog-header.php」をロードしてる人を見ますが、正常に動いてるようでhttpステータス 200じゃなかったりするので注意です。

WP-CLIを使ったかっちりしたやり方

ちゃんとやるなら、WP CLIで決まりです。

WP-CLIはコマンドラインからWordPressを管理できるツールでして、なかなか便利です。めちゃくちゃいろんなことができるのですが、例えばサイトURL変更の際とかは、wp search-replaceを使っている方も多いのではないかと思います。

SQLでもURLの置換は可能ですが、WP-CLIで行うとシリアライズされたデータ内も置換してくれたり素晴らしいです。WP-CLIを使ってバッチを作成すると、wpコマンドを使えることができ、やれることの幅が広がります。

バッチファイルの作り方

まずは適当なphpファイルを作ります。ファイルの中には、WP_CLI_Commandを継承したクラスを作成し、行いたい処理を書いた関数を作ります。

そして再度クラスをWP_CLIのコマンドして登録するための、add_commandをしてあげます。ここではファイル名はsample.phpとします。

class Sample_Command extends WP_CLI_Command {

	function hello(){
		echo "hello";
	}
}

// 第1引数がCLIから呼ぶコマンド名、第2引数が作成したクラスですね
WP_CLI::add_command( 'sample', 'Sample_Command' );

そしたらWordPressがインストールされているディレクトリに、wp-cli.ymlを作成して先ほど作成したファイルまでのパスを記載してあげます。

require:
  - ./sample.php

これで準備完了です。

お手持ちのCLIから「wp sample hello」を実行してみましょう。うまくいっていたらコマンドラインに「hello」とでるのではないでしょうか。

画像をアップロードしてみる

これでは何が便利か伝わりきらないと思うので、よくあるケースを考えてみます。テキストデータはCSVでもらって、画像は実ファイルを別でもらっているパターンを考えてみます。

投稿タイプとして登録したり、カスタムフィールドを作ったり、カテゴリつけたりは大変ではないかと思います。画像だけどう扱うかを苦労してるんですが、WP-CLIを使うのが一番いいのではと思っています。

例えばこんな感じで実装してみましょう。実際はループの中で実装すると思うので大事なところだけです。

$file_path = "xxxx.jpg"; // importしたい画像のパス
$post_id = 1; // 画像を紐づけたい記事ID
$title = "画像XXXX"; // 画像のタイトル

$command = "media import --post_id={$post_id} --title={$title} {$new_file}";

$attachment_id = WP_CLI::runcommand($command . ' --porcelain', ['return' => true]);

post_idとかtitleはオプションです。こちらのドキュメントに記載のやつが使えます。

こちらを実行すると、画像を登録してくれて、登録された投稿タイプ「attachment」の投稿の記事IDが$attachment_idに帰ってきます。upload時に利用してるhookなどがあればそれもちゃんと呼ばれます。

ACFとか使ってる場合は、この戻り値をACFの画像フィールドに紐づけたり簡単に行えますね。WP-CLIで使えるいろんな機能をデータ処理内で使えるので、使いこなしたら便利になるのではないでしょうか。

ではまた。