
通常、WordPressでポストを作成する際に画像も添付します。しかし、ポストを削除した際に画像が残っていることがよくあります。今日は「ポスト画像自動削除」というテーマについて深く掘り下げていきます。
ポストを削除しても画像が削除されない理由
ポストを削除したにもかかわらず画像が残る理由は、画像とポストがデータベース内で異なる扱いをされるからです。ポストを削除する際、WordPressはそのポストのメタ情報とコンテンツを削除しますが、関連する画像は別途管理される添付ファイルとして扱われます。したがって、基本的に画像は残ることになります。
ここで問題が発生します。ポストに関連する画像が残り続けると、ストレージが無駄になり、サイトの速度低下などの問題を引き起こす可能性があります。
毎回不要な画像をImage Library(メディアライブラリ)から削除するのは面倒で、ポストが増えると管理が難しくなります。
ポスト画像自動削除のための関数紹介
以下はポスト削除時に関連するすべての画像を削除するための関数コードです。
function delete_images_with_post( $post_id ) {
// リビジョンは無視
if ( wp_is_post_revision( $post_id ) ) {
return;
}
// 代表画像削除
$thumbnail_id = get_post_thumbnail_id( $post_id );
if ( $thumbnail_id ) {
wp_delete_attachment( $thumbnail_id, true );
}
// 本文に添付されたすべての画像削除
$attachments = get_attached_media( 'image', $post_id );
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
wp_delete_attachment( $attachment->ID, true );
}
}
}
add_action( 'before_delete_post', 'delete_images_with_post' );
関数の動作方式
上記の関数は `add_action( ‘before_delete_post‘, ‘delete_images_with_post’ );` という文によって `before_delete_post`というアクションフックに接続されます。このフックはポストが削除される直前に実行され、その際に ‘delete_image_with_post‘ 関数が実行されるように設定されており、この関数でポストに関連する画像を見つけて削除する作業を行います。
1. **リビジョン無視**: 関数はまず、削除されたポストがリビジョンかどうかを確認します。リビジョンはポストが修正されるたびに自動的に生成される以前のバージョンであるため、このビジネスロジックで不要なリビジョンをスキップします。
2. **代表画像削除**: ポストに関連する代表画像を見つけるために `get_post_thumbnail_id` 関数を使用します。代表画像が存在する場合は、`wp_delete_attachment` 関数を使ってその画像を削除します。
3. **本文のすべての画像削除**: 本文に添付されたすべての画像を見つけるために `get_attached_media` 関数を使用します。ここで ‘image’ タイプを指定してすべての画像形式を抽出し、それぞれの画像を削除するループを実行します。
使用されたアクションフック及び関連フック紹介
`before_delete_post` というアクションフックはポストが削除される直前に実行され、このフックが動作する際に実行したい機能を関数として定義して呼び出す形でWordPressに必要な機能を追加できます。WordPressの機能向上を促進するさまざまなプラグインもこの ‘フック(Hook)‘ を使用して機能を実装します。
類似のアクションフック
1. **after_delete_post**: このフックはポストが削除された後に実行されます。この時点で追跡やログ記録などの後処理が必要な場合に便利です。
2. **delete_attachment**: このフックは添付ファイルが削除されるときに発生します。画像を削除する機能に使用できます。
3. **before_delete_attachment**: 添付ファイルが削除される前に実行され、特定の条件に応じて削除を防いだり、追加作業を行ったりできます。
どうやって使うか?
上記のコードをテーマフォルダにあるfunctions.phpファイルに追加するだけです。functions.phpの修正に関しては以下の文章を参考にしてください。
functions.phpに上記のコードが追加された後は、ポストを削除するとポストに含まれていた画像もすべて削除されます。(データベースの記録からも削除され、サーバーに保存されていた画像ファイルも削除されます。)
参考事項
- ‘ゴミ箱’に送る’削除’の際には動作しません。’完全に削除’を行う際に動作します。
- 同じ画像が他のポストでも使用されている場合、他のポストで画像が表示されなくなります。同じ画像を複数のポストで使用している場合は、使用しない方が良いでしょう。
おわりに
ポストに関連する画像を自動で削除する方法は非常に有益で、ブログ管理に大いに役立ちます。コード作成を通じてデータベースの効率性を最大化し、サイトの全体的なパフォーマンスも向上させることができます。
ポストを削除する際に残る画像の問題は面倒ですが、上記の方法を適用すれば簡単に解決できます。実際に適用する際は、上記のコードをfunctions.phpファイルに追加して超簡単に活用してみてください!
[wp_is_post_revision] : ポストがリビジョンかどうかを確認する機能で、リビジョンの場合は特定の作業をスキップします。
[get_post_thumbnail_id] : 特定のポストの代表画像IDを取得する関数です。
[wp_delete_attachment] : 特定の添付ファイルを削除する関数で、第二の引数で強制削除の有無を設定できます。
[get_attached_media] : 特定のポストに添付されたメディアのリストを取得する関数です。