システム開発・構築の神様

新しいサービスや技術を使った開発や構築。その他不具合解決など

wordpressのwp_handle_upload関数を使ってローカルファイルをメディアへアップロードする

wordpressの管理画面を使わずに、自前で投稿処理ができると、フロントエンド開発が楽しくなってきます。

 

フロントエンドのajaxから、wordpressへのログイン認証、投稿のpostなどは比較的簡単に行えるのですが、メディア投稿に関してはちょっとだけ癖がありましたので、その時のメモです。

 

基本的には

 

wp_insert_attachment

wp_generate_attachment_metadata

wp_update_attachment_metadata

 

の関数を使えば、メディアへの登録は完了できますが、元となるファイルを指定する方法がちょっと戸惑いました。

 

メディアへ登録するファイルは、wordpressの現在のアップロード先に存在していないと駄目でした。

 

サーバー内(ローカルストレージ)の画像ファイルの場合、事前にwordpressのアップロードフォルダへ移動させていないといけません。

 

これを知らずに、画像がコピーできていない・・・っというトラブルに悩まされてしまいました。

 

で、事前にwordpressのアップロードフォルダへ移動させれば良い!っと単純なものでもありません。ユニークなファイル名で移動しておかなければならないので

 

自前でやる場合は

 

そのユニークなファイル名の確認やリネーム処理を自前で対応していないといけません。

 

面倒・・・

 

wp_handle_uploadを使えば、それらの処理をwordpress側に任せると分かりコードをプログラムするも・・・

 

エラーで動作しない・・・

 

どうやらwp_handle_uploadは、HTML Formからマルチパートで送信されてくるのを前提にしているようです。

 

wp_handle_uploadはローカルファイルの指定ができないのか?

 

そう思って諦めかけていたとき・・・解決方法を見つけました。

 

wp_handle_upload( $upload_file, array( 'test_form' => FALSE, 'action' => 'local' ) );

 

test_formをFALSEにして、actionを任意の文字列にすることで、フォームからの送信確認をスキップするようになります。

 

やったね。

 

これで、Ajaxからオリジナルのあらゆるタイプの投稿がガンガン行えるようになりました。

 

来年くらいからは、フロントエンドはHTMLで、バックエンドはWordpressで開発・構築するのが当たり前になるのだろうか?

 

余談

 

アイキャッチ画像の登録は

set_post_thumbnail( $post_id, $attach_id );

 

Advanced Custom Fieldsの画像(オブジェクト)へ登録は

update_field( 'img', $attach_id, $post_id );

 

で問題なく動作しました。