きっかけ
WordPressで記事を書くとき、通常は管理画面にログインし、投稿画面を開き、タイトルと本文を入力して……という流れになります。
ですが正直なところ、これが少し面倒に感じることがあります。
たとえば、お客様に「アンケート感覚で気軽に投稿していただきたい」というケースや、スタッフにもログインID・パスワードを渡さずに投稿だけしてもらいたいケース。こうした場面では、いちいち管理画面にログインしていただくのは現実的ではありません。
そこで思いついたのが、ACF(Advanced Custom Fields)とContact Form 7を連携させ、HTMLフォームから直接投稿できる仕組みを作ることでした。
発想はシンプル
考え方自体は、とてもシンプルです。
・Contact Form 7で入力フォームを用意する
・送信されたデータをフックして拾う
・ACFのカスタムフィールドに値を流し込みながら、投稿を新規作成する
これだけ聞くと、「それなら簡単そうだ」と思われるかもしれません。実際、頭の中で設計している段階では、パズルのピースがきれいにハマっていくような感覚さえあります。
管理画面を経由せずに、フォームに答えるだけで投稿ページが自動生成される。ログインは不要です。お客様は「フォームに答えた」という感覚しかないのに、裏側ではきちんとWordPressの投稿として記事ができあがっています。
でも、実装すると急に難易度が上がる
ここからが本題です。実際にコードを書き始めると、想像していたよりずっと骨が折れます。
CF7側の送信データをどう拾うか、
wpcf7_before_send_mailやwpcf7_mail_sentあたりのフックをどう使うか。投稿をwp_insert_post()で作成したあと、ACFのフィールドに値を入れるにはupdate_field()を正しいキーで呼ぶ必要があり、フィールド名とメタキーがずれていると、値が入らないということも起こります。
さらに、画像や複数選択のフィールドが絡んでくると、一気に厄介になります。バリデーションをどこまでフォーム側で行うか、サーバー側でも二重にチェックするか。投稿者を誰にするか、ステータスを下書きにするか公開にするか、スパム対策はどうするか——考えるべきことが次々に増えていきます。
「思いつくのは簡単、実装するのは難しい」というのは、まさにこういうことなのだと思います。設計図を描くことと、実際に家を建てることとでは、必要な体力も気力もまったく違います。
それでも作る価値がある
ただ、ここを乗り越えると、あとがかなり楽になります。
一度この仕組みを作ってしまえば、お客様ご自身がログインの手間なく気軽に投稿できるようになりますし、こちらとしても「投稿代行」のような単純作業から解放されます。フォームのURLをひとつお渡しするだけで、相手は迷わず操作できます。
目先の実装の大変さより、完成したあとの「便利さ」のほうが長く効いてきます。今しんどいのは、あとで楽をするための投資のようなものだと考えています。
というわけで
難易度は上がりますが、ここが踏ん張りどころです。
頑張ります。