WordPressのリビジョン自動削除
今回、このブログのリニューアルにあたり、プラグインを減らそう!と思いまして。
ワンクリックでリビジョン(下書きのバージョン管理みたいなもの)を消すプラグインを使っていたのですが、クリックせずに自動で消してくれたら楽だなと思い、テーマのfunctions.phpでリビジョンを消す処理をすることにしました。
コード1
記事を保存したときにリビジョンを消す。
1 2 3 4 5 6 7 8 9 10 11 |
function delete_revision() { global $wpdb; $wpdb->query( " DELETE FROM $wpdb->posts WHERE post_status = 'inherit' AND post_type = 'revision' " ); } add_action( 'save_post', 'delete_revision', 10, 3 ); |
global $wpdb;で$wpdbクラスを呼び出し、$wpdb->query()でSQLクエリを実行します。
SQLクエリは、xx_postsテーブルのステータスがinheritのリビジョンをリビジョンを削除する指定をしています。
テーブルの接頭辞はwp-config.phpで指定しているかと思いますが、接頭辞を「wp_」のままにしていた場合も変更した場合も、$wpdb->postsを指定すればOK。
また、私の場合は記事保存のタイミングでやりたいことが他にもあったのでこのタイミングにしていますが、例えばadd_actionをadmin_initにすると管理画面にアクセスするたびにリビジョン削除、ということもできます。
コード2
記事の保存をしたときに1週間前までのリビジョンを消す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function delete_revision() { global $wpdb; $date = date("Y-m-d H:i:s",strtotime("-1 week")); $wpdb->query( $wpdb->prepare( " DELETE FROM $wpdb->posts WHERE post_status = 'inherit' AND post_type = 'revision' AND post_date < %s ", $date )); } add_action( 'save_post', 'delete_revision', 10, 3 ); |
今まさに編集中の記事のリビジョンは使うかもしれないし残しておきたい!と思い、1週間前までという条件を増やしました。
ANDで繋げます。
SQLクエリ内に変数を使いたい場合は、$wpdb->prepare()が便利です。%sというのはプレースホルダで、文字列がここに入るという指定になります。%dだと整数、%fだと浮動小数点数です。
$wpdb->prepare()の第一引数にプレースホルダを使ったSQLクエリを書き、第二引数以降一つずつクエリ内での出現順にプレースホルダに入る値を指定します。
$wpdb->prepare()を使うのにはインジェクション攻撃から守る意味もあります。特に自分以外の入力によるデータをデータベースに送るときは必ず使いましょう。