Scribble at 2020-06-27 16:55:26 Last modified: 2020-07-07 11:55:56

WordPress で或るサイトのテンプレートを作っているのだが、サイトに登録するデータを(かなりデタラメなフォーマットの CSV で)もらってインポートするのが色々と厄介なことになっている。まず、CSV のフォーマットを整理しなおして、全ての値を double-quotation で囲んで、カンマで区切り、UTF-8 としたところまではいいのだが、これをインポートできるプラグインが WordPress 用に出ていないらしい。なぜかというと、今回のサイトでは Advanced Custom Fields を使っているからだ。

プラグインの管理画面で検索すればわかるように、CSV をインポートするプラグインとしては、"WP All Import"、"Import and Export WordPress Data as CSV or XML"、"WP CSV to Database – Insert CSV file content into WordPress database"、そして "Really Simple CSV Importer" くらいがある。この中で、ACF (Advanced Custom Fields)のカスタム・フィールドをサポートしているものもあるが、試用もできずに Pro 版として年間2万円ていどのコストがかかる。まともに動くかどうかもわからないプラグインにそんなお金は出せない(WP のプラグインの場合、正しく動かないことも多いからだ)。また、かなり派手に宣伝している "WP All Import" は、UI は丁寧に作ってあるものの、そもそも CSV のインポート自体が理由もなく拒絶されて途方に暮れる残念な結果だった。そして、意外にも調べた中で最も古く、しかも5年前に開発が止まっている "Really Simple CSV Importer" がいちばんまともに動いた。

しかし、Really Simple CSV Importer は、そのままでは ACF のカスタム・フィールドを扱えないので、いくつかのページを参考に色々と試しているところだ。ACF に対応するという Qiita のページは最初に見たのだが、実はチェックボックスをぜんぜん処理できていない(わざわざチェックボックスの処理だけ CSV のカラム名に "acf_" をつけるといった手順も紹介されているが、無効である)。実は・・・「なにもしないでそのまま CSV を Really Simple CSV Importer に処理させる」のが正解である。

次に、CSV に適当な文章を改行込みで入れてきているため、これを正しく処理させないといけない。どうやら、そのまま ACF の値として入れてしまうと、条件は不明だが一部のテキスト・データが Wordpress の管理画面で " htmlspecialchars() expects parameter 1 to be string, array given" というエラーになってしまい、実際の echo get_field( 'fieldname', $id ) という出力でも "Array()" となってしまう。目下、チェックボックスはなんとか解決したので、このあたりの問題に取り組んでいる。他にも値がおかしな処理をされていて PHP のエラーが出てしまうようなので、一つずつ潰していかないといけないらしい。これ、CSV として記事をインポートするたびにデータを消しなおしているため、ローカル・マシン上の Adminer で "truncate wp_term_relationships; truncate wp_termmeta; truncate wp_posts; truncate wp_postmeta;" を何度も繰り返すことになる。そして、これをやると ACF の定義まで消えてしまうので、記事のインポートをやりなおすたびに ACF の定義ファイルもインポートするという作業になっている。あまりにも何度も繰り返すので、ルーチン・ワークとして MD の記事にしておきたいくらいだ。まぁ、デバッグとはがんらいそうしたものだが、困るのはこれがコンピューター・サイエンスとして何の知見も蓄積しないし生み出されない、学術的には生産性がゼロの作業ということだ。休日の暇潰しにやっているからこそ大した問題ではないが、こんなことを何千回と繰り返したり何百時間やろうと、人類の知恵は 1mm すら前進しない。

なお、この手の事案について解説しているページをいくつか見たが、あまり捗々しくない。ACF のバージョンとも関係があるのだろう。

https://qiita.com/kinshist/items/527f9da037fa46de3f25 (セレクトボックスは機能しない。現在はチェックボックスは何もしないのが正しい)

http://bashalog.c-brains.jp/19/07/01-120000.php(このページのコードを使ってもチェックボックスの値は無視される)

おそらくだが、

https://qiita.com/soundweaver/items/bb37f256b9a0d5714a6d

このページで説明されているように、最近の ACF では値を既にシリアライズしているため、functions.php に追加する処理にフィールド・データをシリアライズするような get_post_meta( $_id, 'field_name', TRUE );(この第三引数がシリアライズを有効にする)を使うのは逆効果なのだろう。ただ、そういうことを除外しても、それぞれのやり方はそれぞれ不足があるため、ACF の内部動作と全く同じことを《入力が WordPress の管理画面からではなく CSV というだけの違い》で実行するようなコードを書かない限りは、正しい動作を実現するのは難しい。やはりきちんとやるには ACF のコードを睨むしかなさそうだ。今回は、ざっとでもいいからデータを突っ込んでおいて、個々のデータは WordPress の管理画面で修正していこうと思う(人物のデータが280人分なので、それなりの数にはなるが、単純作業を苦にしないなら一日でやれる分量だ)。

ただまぁ、こうして土日に作業してみてわかったことだが、やはり事前にルールを決めておかないとデタラメな CSV を作ってくるので、そちらの注意も必要だ。誤字脱字、サービス名の表記揺れ、芸能人ブログみたいな無意味な改行(もともとは携帯で閲覧するユーザの「滞留時間」という指標を嵩上げするために広告代理店や三流ウェブ制作会社が編み出したイカサマだが、既に一部の人々にとってはオンラインの文章を書くときのスタイルとなっている)、それから都道府県名を一方で「北海道」と書いていながら他の地域は「東京」と書いたりする杜撰な表記(省くなら「北海」と書け)、値を二重引用符で括ったり括らなかったりと、しばしば CSV には「方言」があると言われるが、これでは方言以前の「赤ちゃん言葉」だ。

よって、上記に書いた不具合のいくつかも、プラグインやプラグインの解説に問題があるのかどうか、もう今となっては再検証している暇もないのだが、それなりにフォーマットを正規化したつもりでも、とりわけ ACF のフィールド値を CSV でインポートするのは困難で不安定だという結論は変わらない。実際、上記のように色々とやってはいても、たった1行のテキスト・データをインポートするのですら失敗している事例が多々ある(改行が入っている長文だけかと思ったら、1行だけのデータも取り込みに失敗している)。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook