<?xml version="1.0" encoding="UTF-8" standalone="yes"?><oembed><version><![CDATA[1.0]]></version><provider_name><![CDATA[iDeasilo]]></provider_name><provider_url><![CDATA[https://ideasilo.wordpress.com]]></provider_url><author_name><![CDATA[Takayuki Miyoshi]]></author_name><author_url><![CDATA[https://ideasilo.wordpress.com/author/miyoshita/]]></author_url><title><![CDATA[WordPress 2.1 のアタッチメント&nbsp;API]]></title><type><![CDATA[link]]></type><html><![CDATA[<p>WordPress 2.1 ではアタッチメント(編集画面からアップロードされた画像などのファイル) 管理のための API が拡張され、それ以前と比べて格段に充実しています。アタッチメント関連のプラグイン作者向けに、WordPress 2.1 の変更ポイントや今後の方向性についてまとめました。</p>
<p>参考: <a href="http://mdawaffe.wordpress.com/2006/12/05/hitting-wordpress-attachment-handling/">Hitting WordPress Attachment Handling</a> by mdawaffe<br />
<!--more--></p>
<h4>DB スキーマの変更</h4>
<p><a href="http://www.miyoshitakayuki.com/archives/281">WordPress のアタッチメントは変種のポストで</a>、そのポストメタとしてファイルのパスや画像のサイズ、サムネイルのファイル名などの付随情報を保持する仕組みになっています。</p>
<p>通常のポストと静的なページ、さらにアタッチメントを区別するために、WordPress 2.0 までは posts テーブルの post_status が使われてきましたが、WordPress 2.1 では post_type が使われるようになりました。post_type 自体は以前からあったものですが WordPress 2.0 では使われていませんでした。</p>
<dl>
<dt>WordPress 2.0</dt>
<dd>
<table></tbody>
<tr>
<th>カラム名</th>
<th>取り得る値</th>
</tr>
<tr>
<th>post_status</th>
<td>publish, draft, private, static, attachment</td>
</tr>
<tr>
<th>post_type</th>
<td>(N/A)</td>
</tr>
</tbody>
</table>
</dd>
<dt>WordPress 2.1</dt>
<dd>
<table></tbody>
<tr>
<th>カラム名</th>
<th>取り得る値</th>
</tr>
<tr>
<th>post_status</th>
<td>publish, draft, private, inherit, future</td>
</tr>
<tr>
<th>post_type</th>
<td>post, page, attachment</td>
</tr>
</tbody>
</table>
</dd>
</dl>
<p>WordPress 2.1 ではアタッチメントの post_type は attachment に、 post_status は inherit に指定されます。inherit は「継承する」という意味なので、この場合アタッチメントの post_status は親ポストの post_status を継承するという扱いになります。</p>
<h4>アタッチメント API</h4>
<p>wp-includes の post.php と post-template.php に追加されたアタッチメント関連関数についてまとめます。</p>
<p><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php">wp-includes/post.php</a></p>
<dl>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L7"><strong>get_attached_file</strong>($attachment_id)</a></code></dt>
<dd>アタッチメントのファイルパスを返す。具体的にはアタッチメントの <code>_wp_attached_file</code> ポストメタに保存されたファイルパスを返す。適用フィルタ: <code>get_attached_file</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L14"><strong>update_attached_file</strong>($attachment_id, $file)</a></code></dt>
<dd>アタッチメントのファイルパスを <code>_wp_attached_file</code> ポストメタに保存する。すでに値があればそれを更新する。適用フィルタ: <code>update_attached_file</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L1198"><strong>is_local_attachment</strong>($url)</a></code></dt>
<dd>URL がローカルのリソースを指していて、かつそのリソースがアタッチメントである場合に真を返す。</dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L1211"><strong>wp_insert_attachment</strong>($object, $file, $post_parent)</a></code></dt>
<dd>アタッチメントを保存する。既存のアタッチメントであれば更新する。<code>$object</code> は連想配列(<a href="http://trac.wordpress.org/browser/tags/2.1/wp-admin/upload-functions.php">wp-admin/upload-functions.php</a> での<a href="http://trac.wordpress.org/browser/tags/2.1/wp-admin/upload-functions.php#L222">実際の使われ方</a>を見るとわかりやすい)。アタッチメントの ID を返す。適用フィルタ: <code>content_save_pre</code>, <code>content_filtered_save_pre</code>, <code>excerpt_save_pre</code>, <code>title_save_pre</code>, <code>category_save_pre</code>, <code>name_save_pre</code>, <code>comment_status_pre</code>, <code>ping_status_pre</code>, <code>post_mime_type_pre</code> 実行アクション: <code>edit_attachment</code>, <code>add_attachment</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L1366"><strong>wp_delete_attachment</strong>($attachment_id)</a></code></dt>
<dd>アタッチメントを削除する。コメントやポストメタなど付属のレコードとファイルも一緒に削除する。サムネイルは他のアタッチメントで使われていないことを確認して削除する。適用フィルタ: <code>wp_delete_file</code> 実行アクション: <code>delete_attachment</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L1406"><strong>wp_get_attachment_metadata</strong>($attachment_id)</a></code></dt>
<dd>アタッチメントの <code>_wp_attachment_metadata</code> ポストメタを返す。適用フィルタ: <code>wp_get_attachment_metadata</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L1417"><strong>wp_update_attachment_metadata</strong>($attachment_id, $data)</a></code></dt>
<dd>アタッチメントの <code>_wp_attachment_metadata</code> ポストメタを保存する。すでに値があればそれを更新する。適用フィルタ: <code>wp_update_attachment_metadata</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L1432"><strong>wp_get_attachment_url</strong>($attachment_id)</a></code></dt>
<dd>アタッチメントの URL を返す。具体的にはアタッチメントの GUID を返す。適用フィルタ: <code>wp_get_attachment_url</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L1445"><strong>wp_get_attachment_thumb_file</strong>($attachment_id)</a></code></dt>
<dd>サムネイルのファイルパスを返す。適用フィルタ: <code>wp_get_attachment_thumb_file</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L1459"><strong>wp_get_attachment_thumb_url</strong>($attachment_id)</a></code></dt>
<dd>サムネイルの URL を返す。適用フィルタ: <code>wp_get_attachment_thumb_url</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L1474"><strong>wp_attachment_is_image</strong>($attachment_id)</a></code></dt>
<dd>アタッチメントが画像(JPEG, GIF, PNG)であれば真を返す。拡張子が判断の基準になる。</dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post.php#L1491"><strong>wp_mime_type_icon</strong>($mime)</a></code></dt>
<dd>MIME タイプ別アイコンの URL を返す。<code>$mime</code> には MIME タイプかまたはアタッチメントの ID が指定できる。適用フィルタ: <code>icon_dir</code>, <code>icon_dir_uri</code>, <code>wp_mime_type_icon</code></dd>
</dl>
<p><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post-template.php">wp-includes/post-template.php</a></p>
<dl>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post-template.php#L326"><strong>the_attachment_link</strong>($attachment_id, $fullsize, $max_dims)</a></code></dt>
<dd>内部で <code>get_the_attachment_link</code> を呼び出し、結果を書き出す。</dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post-template.php#L330"><strong>get_the_attachment_link</strong>($attachment_id, $fullsize, $max_dims)</a></code></dt>
<dd>アタッチメント URL へのリンクを返す。内部で <code>get_attachment_innerHTML</code> を呼び出し、結果が a 要素の内容になる。</dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post-template.php#L343"><strong>get_attachment_icon_src</strong>($attachment_id, $fullsize)</a></code></dt>
<dd>アタッチメントのアイコンを、アイコンの URL とファイルパスからなる配列として返す。<code>$fullsize</code> が偽で(偽がデフォルト)、かつサムネイルがある場合はサムネイルをアイコンとして使う。それ以外の場合はアタッチメント本体、MIME 別のアイコンの順でアイコンを探す。適用フィルタ: <code>icon_dir</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post-template.php#L377"><strong>get_attachment_icon</strong>($attachment_id, $fullsize, $max_dims)</a></code></dt>
<dd>アタッチメントのアイコンを img 要素として返す。内部で <code>get_attachment_icon_src</code> を呼び出し、結果の URL が src 属性の値になる。<code>$max_dims</code> が指定されている場合は width 属性と height 属性の指定により表示サイズに上限をかける。<code>$max_dims</code> は画像の横と縦のピクセル数からなる配列。適用フィルタ: <code>attachment_max_dims</code>, <code>attachment_icon</code></dd>
<dt><code><a href="http://trac.wordpress.org/browser/tags/2.1/wp-includes/post-template.php#L417"><strong>get_attachment_innerHTML</strong>($attachment_id, $fullsize, $max_dims)</a></code></dt>
<dd>アタッチメント URL へのリンクで使われる a 要素の内容を返す。内部で <code>get_attachment_icon</code> を呼び出し、アイコンが返された場合はそのアイコンを返し、アイコンがない場合はアタッチメントのタイトルを返す。適用フィルタ: <code>attachment_innerHTML</code></dd>
</dl>
<h4>今後の方向性</h4>
<p>WordPress 2.1 で API の充実が見られましたが、アタッチメントについてはまだ大きな問題が残されています。</p>
<p>最たるものはファイルの絶対パス保存の問題です。WordPress ではファイルパスを絶対パスとして DB に保存しますが、これはポータビリティを損ねる要因になります。</p>
<p>たとえばブログを別のサーバに移し替えるようなケースを想像してみてください。ほとんどの場合、元サーバと新サーバでディレクトリ構成が異なるため、絶対パスで保存されたファイルパスは新サーバでは意味をなさなくなります。この結果アップロードされたファイルが見つからないなどの不具合が起こります。</p>
<p>これに対して<a href="http://trac.wordpress.org/ticket/2682">ファイルパスを相対パスで保存する改善案</a>が現在上がっており、予定では4月にリリースされる WordPress 2.2 で導入されることになっています。</p>
<p>その他に<a href="http://trac.wordpress.org/ticket/2794">サムネイルの作成をプラグインで変更できるようにする変更</a>が WordPress 2.2 で予定されており、これによりビデオや PDF などの非画像ファイルのサムネイル作成がプラグインから可能になります(<a href="https://ideasilo.wordpress.com/2006/08/10/tam-attachment/">tam-attachment</a> が前からやっていたことに近いですが、この変更により tam-attachment も以前よりシンプルなやり方で実現できるようになるはずです)。</p>
]]></html></oembed>