メディアライブラリから未使用の画像を削除する場合、実際に使用しているかどうかを判定するのは結構手間がかかります。
メディアライブラリ一覧の「アップロード先」の表示で、ある程度判断することはできますが、ここで「未使用」と表示される画像であっても、実際は使用している場合があります。
これは投稿画面よりメディアライブラリを使用して追加した場合等は、この「アップロード先」は設定されるのですが、アイキャッチ画像やカスタム フィールド、インポート等では設定されない場合があるからです。
そこで、なるべく「アップロード先」つまり投稿と関連付けできれば作業を軽減することができると思い作成したのが、今回紹介する「Associate Attachment」プラグインです。
実は以前作成したアイキャッチ画像を自動生成するプラグインに数行のコードを追加するだけだったことが大きいです。そして、そのプラグインはアイキャッチ画像関連のプラグインで、機能的に大きく異なるため別のプラグインとして作成する運びとなった次第です。
添付ファイルに投稿を関連付けるコード
添付ファイルに投稿を関連付けるメインの処理は下記のようになります。
/**
* Associates an attachment file with a post.
*
* @param int $attachment_id Attachment ID.
* @param int $post_id Post ID.
* @return bool TRUE on success. FALSE on failure.
*/
function update_attachment_post_parent( $attachment_id, $post_id ) {
$attachment_post = get_post( $attachment_id );
if ( ! $attachment_post->post_parent ) {
$result = wp_update_post( array( 'ID' => $attachment_id, 'post_parent' => $post_id ) )
return ( $result == $attachment_id );
}
return false;
}
添付ファイルの投稿オブジェクトの post_parent に関連付けされている投稿 ID が格納されています。0 の場合は関連付けなし(「未使用」)です。
プラグインでは、すべての投稿を一括で処理するため処理速度を優先して下記のように SQL クエリを実行するようにしました。
/**
* Associates an attachment file with a post.
*
* @global wpdb $wpdb
* @param int $attachment_id Attachment ID.
* @param int $post_id Post ID.
* @return int|bool The number of rows affected on success. FALSE on failure.
*/
function update_attachment_post_parent( $attachment_id, $post_id ) {
global $wpdb;
return $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_parent=%d WHERE post_type='attachment' AND ID=%d", $post_id, $attachment_id ) );
}
※ 余談ですが今後はコードのコメントは、なるべく英語で記述したいと思っています。
Associate Attachment プラグイン
現時点では、公式ディレクトリに登録していません。詳細およびダウンロードは下記ページを参照してください。
最後に
現バージョン(0.1.0)では、投稿の記事(コンテンツ)内の画像とアイキャッチ画像のみを対象としています。今後の予定としては、カスタムフィールドの画像(Advanced Custom Fields プラグインの画像フィールド等)に対応させたいと思っています。