让 WordPress 自动删除 Post Revisions

Posted by David on 2008-11-18 in Blog Related

貌似在 wp-config.php 中加入 define(’WP_POST_REVISIONS’, false); 来禁用 WordPress 的日志修订功能,post revision 还是会产生。gohsy 同学写了个插件 Revision Manager 来清理 post revision,不过个人觉得手动清理还是不够方便,决定利用 WordPress 的计划任务功能(WP_Cron)偷偷懒。

不想为了这小小的功能而多添加一个插件,所以在主题目录下的 functions.php 文件添加了以下代码:

function delete_post_revisions() {
  global $wpdb;

  // Also need to delete the post meta and term relationships
  $wpdb->query("DELETE FROM {$wpdb->postmeta} WHERE post_id IN (SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision')");
  $wpdb->query("DELETE FROM {$wpdb->term_relationships} WHERE object_id IN (SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision')");

  // Delete the post revisions
  $wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision'");
}

// Register the event
add_action('delete_post_revisions_event', 'delete_post_revisions');
if (!wp_next_scheduled('delete_post_revisions_event')) {
  wp_schedule_event(time(), 'daily', 'delete_post_revisions_event');
}


这样 WordPress 每天会自动删除 post revision (当然得在有人访问的前提下)。其实每天运行一次也有些过于频繁了,可以将时间间隔设置得更长一些,譬如一周或者二周甚至一个月。不过 WordPress 的 Cron API 本身只提供了 hourly, daily 两个选项,所以需要自己手工添加一些运行时间间隔选项。在刚才添加的代码之前添加以下代码,

function add_schedule_options($schedules) {
  $custom_schedules = array(
    'weekly' => array( 'interval' => 604800, 'display' => __('Once Weekly') ), 
    'fortnightly' => array( 'interval' => 1209600, 'display' => __('Once Fortnightly') ), 
    'monthly' => array( 'interval' => 2592000, 'display' => __('Once Monthly') ), 
  );

  return array_merge($custom_schedules, $schedules);
}
add_filter('cron_schedules', 'add_schedule_options'); 

然后把 wp_schedule_event 函数的第二个参数值 daily 改成 weekly 或 fortnightly 或 monthly 即可。

Tags: , , , , .

Comments

  1. 1 Freeman

    应该是自动保存造成的,简单点装个叫 Disable Autosave 的插件就好了。

  2. 2 David

    @Freeman 希望使用自动保存功能又不想生成多余的revision,可以按我说的这么办,呵呵

Leave a Reply

You can use these XHTML tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>