WordPressでは、transientを使ってPHP出力をキャッシュするとサイトの表示速度が高速化します。
それを利用してSWELLでは何でもかんでもtransientでキャッシュすることでテーマを高速化しています。
transientは結果をキャッシュしてしまうので、サイトの表示がすぐに更新されないため、必要に応じてtransientをいちいち削除しなければならない運用上のデメリットがあります。
特定のtransientを削除できるdelete_transient()関数があります。
しかし、この関数はkeyの指定が必要なのです。
特定の文字列を含むtransientだけ一括で削除したい時に、keyを正確に指定しなければならないdelete_transient()関数だと使い勝手が悪いと思っていました。
transientは、名前に規則がありますので直接SQLを叩けば削除することができます。
この記事でメモしておきます。
transientを名前の部分指定で一括削除するスニペット
transientを削除するタイミングとして、save_postやdeleted_postアクションフックに引っ掛けていますが、別に無くてもいいです。
<?php
add_action( 'save_post', 'wpdocs_delete_my_important_transient',9,1);
add_action( 'deleted_post', 'wpdocs_delete_my_important_transient',9,1 );
//add_action( 'edit_post', 'wpdocs_delete_my_important_transient',9,3 );
//prefixを含むtransientを削除
//$transient_key="prefix_".md5($hoge)
function wpdocs_delete_my_important_transient($post_ID) {
$prefix="prefix_";
delete_transient_prefix($prefix);
}
function delete_transient_all(){
global $wpdb;
$db_prefix = $wpdb->prefix;
$wpdb->query("delete from `".$db_prefix."options` where `option_name` like '%_transient_%'");
}
function delete_transient_prefix($prefix){
global $wpdb;
$db_prefix = $wpdb->prefix;
$wpdb->query("delete from `".$db_prefix."options` where `option_name` like '%_transient_".$prefix."_%'");
}