WordPressの「wp_insert_attachment」を使って、特定の投稿に対して添付ファイルをメディアライブラリにアップロードする

WordPressの特定の投稿に対して、添付ファイルをアップロードしたい場合ってあります。その時は「wp_insert_attachment」を使う方法があることを知りました。

「wp_insert_attachment」とは 

wp_insert_attachment」の概要を、Google翻訳に頼ってなんとなく意訳すると・・・

この関数は、メディアライブラリに添付ファイルをアップロードします。wp_update_attachment_metadata()とwp_generate_attachment_metadata()と組み合わせて使用する必要があります。 wp_postsテーブルに作成されたエントリのIDを返します。

メディアライブラリとは

WordPressの管理画面にある「メディア」→「ライブラリ」の場所を指します。

「wp_insert_attachment」の使い方

どういう使い方をすればいいのか、自分なりにまとめました。

基本形

<?php wp_insert_attachment( $attachment, $filename, $parent_post_id ); ?>

パラメーター

$attachment

配列で値を与える。添付ファイルに関するデータがwp_postsテーブルに書き込まれる。少なくとも、post_title,post_content(指定する値は空の文字列であること),post_status,post_mime_typeの4つは指定すること。

なるほど~。ということは、最低限与える値は例ですが、こういうことなんでしょうかね。

$attachment = array(
 'post_mime_type' => $wp_filetype['type'], //1
 'post_title' => sanitize_file_name($filename), //2
 'post_content' => '', //3
 'post_status' => 'inherit' //4
 );

$filename

サーバー上のファイルの場所。※ファイルのURIではなく絶対パスを使用してください。ファイルがアップロードディレクトリになければなりません。 wp_upload_dir()を参照してください。

なるほど~。ファイルのURIっていうのは「URLとURIは何が違うの? どちらが正しい呼び方? | Web担当者Forum」の記事がとてもわかりやすいです。URIについては、知っておくと役に立つはずです。

$parent_post_id

添付ファイルは、親投稿に関連付けられる。親の投稿IDを指定。

サンプルコードを確認しました

なんとなく設定するパラメータもわかったので、Codexにあるサンプルコードを確認しました。

サンプルコード

<?php
  $wp_filetype = wp_check_filetype(basename($filename), null ); //ファイル名の拡張子、mime形式を配列で取得
  $wp_upload_dir = wp_upload_dir(); //ファイルのアップロード先ディレクトリを取得
  $attachment = array(
     'guid' => $wp_upload_dir['url'] . '/' . basename( $filename ), 
     'post_mime_type' => $wp_filetype['type'], //mime形式を指定「image/png」「image/jpeg」など
     'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ), //ファイル名を指定
     'post_content' => '', //空の文字列を指定
     'post_status' => 'inherit' //投稿ステータスを指定
  );
  $attach_id = wp_insert_attachment( $attachment, $filename, 37 ); //投稿ID「37」に対して添付ファイルをメディアライブラリにアップロード。変数「attach_id」に返ってきたIDを格納
  // you must first include the image.php file
  // for the function wp_generate_attachment_metadata() to work
  require_once( ABSPATH . 'wp-admin/includes/image.php' ); //「wp_generate_attachment_metadata()」を使う場合には、このファイルを事前に読み込んでおくこと
  $attach_data = wp_generate_attachment_metadata( $attach_id, $filename ); //組み合わせて使う
  wp_update_attachment_metadata( $attach_id, $attach_data ); //組み合わせて使う
?>

一連の処理が割と長いので、忘れないようにコメントアウトでメモしました。だいたいこんな感じだと思っています。「wp_generate_attachment_metadata」「wp_update_attachment_metadata」については、また次回書こうと考えています。

「wp_insert_attachment」をどう使ったか

私の場合は、特定の数だけ自動で投稿するようなループを作り、ループ内で投稿したIDに対して特定の画像を添付ファイルとしてメディアライブラリにアップロードさせる時に使いました。

まとめ

先ほども書いたんですが、この関数「wp_insert_attachment」を使う場合は、与えるパラメーターを作成する必要もあるため、割と複雑に見えてしまうんですが・・・まあやっぱり、どう控えめに見ても複雑ですね、私にとっては。もっとシンプルにやりたいことを実現できればいいんですが、現状ではこの方法でやっています。

ただいまこの関数を使いまくっているので「使って行くうちに徐々に慣れていけばいいわ~」と楽観的に考えてはいます。

著者:bouya Imamura