WordPressの記事を削除したり編集した際にページキャッシュも削除したい
記事やコメントの状態変化に応じてアクションフックを設定
WordPressの高速化にはページキャッシュを利用するのが効果的だが、キャッシュファイルを適切に削除しないと、ユーザーの意図に反した結果を招いてしまうかもしれない。
本エントリーでは、ページキャッシュを実装済みのWordPressに、キャッシュファイルを削除するアクションフックとその実装について書いてみる。
記事の削除時
管理画面で記事を削除したら、ページキャッシュも削除したい。その場合は、delete_postアクションフックが利用できる。
add_action('delete_post', array($this, 'delete_cache_page'));
delete_cache_page関数には$post_idを渡すことが可能。そして、以下のように設定すれば、記事を削除したタイミングでページキャッシュも削除できる。
function delete_cache_page($post_id) { $post_url = get_permalink( $post_id ); $settings_cachedir = '/path/to/'; $cachelink = $settings_cachedir.md5($post_url).'.html'; @unlink($cachelink); }
記事の編集時
記事編集時は、save_postアクションフックを利用する。
add_action('save_post', array($this, 'delete_cache_page'));
このフックは、編集時だけでなく、新規に記事を投稿した際にも利用できるアクションフックになる。そのため、delete_cache_page内で新規投稿か編集なのかの判定が必要となる。
if ( wp_is_post_revision( $post_id ) ) { return; }
上の処理で新規投稿の場合はreturnとなり、ページキャッシュの削除処理が回避される。
コメント削除時
コメント削除時は、transition_comment_statusアクションフックを利用して削除処理を行うことができる。
add_action('transition_comment_status', array($this, 'comment_status_change'), 10, 3);
transition_comment_statusは、コメントの状態変化に応じて削除処理を追加することが可能。transition_comment_statusに渡す引数は3つあり、
- $new_status
- $old_status
- $comment
を渡すことができる。アクションフック内で投稿ID(post_id)を取得する場合は
$comment->comment_post_ID
とすることでpost_idを取得することができるので、コメントに紐づく投稿を特定するために引数を利用できる。具体的に以下のようにしてコメントの状態変化に応じてページキャッシュを削除可能。
function comment_status_change($new_status, $old_status, $comment) { if($old_status != $new_status) { if($new_status == 'trash') { $post_url = get_permalink($comment->comment_post_ID); $settings_cachedir = '/path/to/'; $cachelink = $settings_cachedir.md5($post_url).'.html'; @unlink($cachelink); } } }
コメント承認時にページキャッシュを削除する場合は、
if($new_status == 'approve') { }
とすることでコメントを承認した際に実行される処理を書くこともできる。
delete_comment
delete_commentというアクションフックが存在し、その名前からコメントを削除した際にフックするものと連想することができるのだが、このフックではコメントを削除してもページキャッシュの削除処理を実行することができなかった。
add_action('delete_comment', array($this, 'delete_cache_page'));
上のようにフックすると、コメント削除時ではなく、削除したコメントを復元した際にページキャッシュが実行されるようになってしまった。そのため、transition_comment_statusを利用したほうがトラブルに遭遇することなくフックできる。
初めまして。
こちらの設定に関して、
function.phpに記述すればいいのでしょうか?
functions.phpに設定する場合は、アクションフックの設定をそれぞれ以下のように変更してください。
↓
プラグインでフックを設定する際に第二引数を
array($this, ~);
として設定することがあります。
把握していなくて申し訳ございません。
PHP・フック等、専門用語分からないのですが、
array($this, ~);除いて記述するのでしょうか?
また、記事で紹介されている手順に関しまして、
function.phpで対応できるものはどれでしょうか?
(「記事の削除時」「記事の編集時」でしょうか?)
>ユーザーの意図に反した結果を招いてしまうかもしれない。
例えば、どういう結果を招いてしまう事になるのでしょうか?
記事の削除時、記事の編集時とコメント削除時もfunctions.phpで有効にできるはずです。試してみてください。
delete_commentアクションでは、記事作成の時点でうまく削除できなかったため、利用する際には削除するはずなのにできないという結果にならないように動作の確認が必要と考えています。
functions.phpでフックする場合にはそれぞれ以下のようにすればうまくいくはずです。
がちょぴんさんがやろうとしていることは分かりませんが、うまくいったらおしえてください。