Import ACF post object field by WP All Import plugin

WP All Import プラグイン(有料版)を用いると、他のプラグインでは標準で対応していない Advanced Custom Field (ACF)のカスタムフィールドも含めてインポートできる。しかし投稿オブジェクト(Post Object)のフィールドはDB上にシリアライズ化されて保存されているため、インポートに一癖必要だった。

結論

こういう投稿IDのカンマ区切りのデータをインポートしたいなら

こうする

[serialize(explode(",", {companies[1]}))]

投稿オブジェクトフィールドはシリアライズされて保存されている

今回のケースでは製品に紐づく会社を投稿オブジェクトフィールド:companies として持たせていたので、例えば投稿ID:478, 482, 480 と関連付けされている場合はこんな感じでDB上に保存されている。

a:3:{i:0;s:3:"478";i:1;s:3:"482";i:2;s:3:"480";}

これをデシリアライズしてやるとこういう感じ。

Array
(
    [0] => 478
    [1] => 482
    [2] => 480
)

シリアライズ、デシリアライズのオンラインツールはこちらがおすすめ

https://www.onlinewebtoolkit.com/unserialize

CSVデータをシリアライズデータに変換

今回はこういうCSVデータを用意していたので、この companies 列のカンマ区切りの投稿IDをうまいことシリアライズされたデータに変換してインポートする必要があった。

結論から言うとこの形。

[serialize(explode(",", {ingredients[1]}))]

explode()でArrayに変換した後に、serialize()でシリアライズ化する。どちらもPHP標準関数なのでそのまま使えた。外側を大かっこ([])で囲むことと、ダブルクォーテーションを使うことに注意。

投稿ID以外の値はダメっぽい

試してはいないが、紐付ける投稿のタイトルやスラッグをシリアライズされたものを渡してもインポートはしてくれないはず。投稿IDが事前に分かっている必要があるので、必然的に(カテゴリーなどの登録と違って)紐付ける投稿が存在しない場合に新規作成する、といったことはできないことになる。

標準機能のシリアライズは正しく機能しなかった

ちなみに WP All Import の標準機能でシリアライズもできるようになっているが、これを使ってもうまく行かなかった。

こんな感じでキーと値の数が手動追加だし、「自動検知」ボタンを押して入る値は全然関係ない値がベタ書きで入る(変数化されてない値なので当然全レコードに同じ値が入ってしまう)。

一応PHPのカスタム関数を作成してそれを利用する方法もある(Calling PHP Functions In Your Import Configuration)が、serialize()explode() はどちらもPHP標準の関数なのでそのまま使えた。ただしシングルクォーテーションが使えなかったり、セミコロンを入れるとエラーになるなど微妙に注意が必要。

参考リンク

https://notnil-creative.com/blog/archives/1752

https://www.php.net/manual/ja/function.serialize.php

https://stackoverflow.com/questions/1125730/split-a-comma-delimited-string-into-an-array