6
20
2014
WordPressのリビジョン機能をコントロールする方法
WordPressのお節介なリビジョン保存機能を無効化するには
WordPressで標準のエディタを用いて記事を書いていると自動的にリビジョンと呼ばれるバックアップデータがDB内に保存されてしまう.Wordpressのauto paragraph機能とこのリビジョン機能はWordpressの余計なお節介機能の代表的なもので、この機能を無効にするためのプラグインモジュールが数多く出まわっている所を見ると、やはり多くの人達が困っているのだろう.
これらの機能を無効化するプラグインモジュールに関する紹介記事は、既に多くの人が書いているのでここではプラグインに関しては触れない事にするが、自分でプラグインを作成したりカスタマイズを行いたい人達のために、リビジョン機能を無効化する方法についてだけ簡単に紹介しようと思う.
WordPressのバージョンによって、リビジョン機能に関連するファイル構成や実装方法が変わっているので、今回は最新版の V3.9.1(6/20 2014時点)のソースコードを基に関連する部分を示すが、何れのバージョンでも基本的な処理内容は同じなので、バージョン毎の違いは各自で調査して欲しい.
リビジョン機能に関連するコードを眺めてみる
リビジョン機能に関連する部分として、次の2つのファイルが関わっている.
・ ”wp-includes/revision.php” (リビジョン機能に関するメインコード)
・ ”wp-includes/default-constants.php” (Wordpressの基本的な定数などを記述)
“revision.php” のLine 450 – 483 辺りに、 “wp_revisions_to_keep()” というリビジョンの数をコントロールする関数がある.
/**
* Determine how many revisions to retain for a given post.
* By default, an infinite number of revisions are stored if a post type supports revisions.
*
* @since 3.6.0
*
* @uses post_type_supports()
*
* @param object $post The post object.
* @return int The number of revisions to keep.
*/
function wp_revisions_to_keep( $post ) {
$num = WP_POST_REVISIONS;
if ( true === $num )
$num = -1;
else
$num = intval( $num );
if ( ! post_type_supports( $post->post_type, 'revisions' ) )
$num = 0;
/**
* Filter the number of revisions to save for the given post.
*
* Overrides the value of WP_POST_REVISIONS.
*
* @since 3.6.0
*
* @param int $num Number of revisions to store.
* @param WP_Post $post Post object.
*/
return (int) apply_filters( 'wp_revisions_to_keep', $num, $post );
}
一方、”default-constants.php” ファイルを覗いて見ると、
/**
* Defines functionality related WordPress constants
*
* @since 3.0.0
*/
function wp_functionality_constants() {
/**
* @since 2.5.0
*/
if ( !defined( 'AUTOSAVE_INTERVAL' ) )
define( 'AUTOSAVE_INTERVAL', 60 );
/**
* @since 2.9.0
*/
if ( !defined( 'EMPTY_TRASH_DAYS' ) )
define( 'EMPTY_TRASH_DAYS', 30 );
if ( !defined('WP_POST_REVISIONS') )
define('WP_POST_REVISIONS', true);
/**
* @since 3.3.0
*/
if ( !defined( 'WP_CRON_LOCK_TIMEOUT' ) )
define('WP_CRON_LOCK_TIMEOUT', 60); // In seconds
}
‘WP_POST_REVISIONS’が記事のリビジョンを保存するかどうかの定数で、初期値は ‘true’ に設定されている.この場合、”wp_revisions_to_keep()” は リターン値として -1 を返すようになっており、’true’ 以外の数値が設定されている場合は、その数値だけのリビジョンを保存する事になる.つまりこの定数の設定値をオーバーライドして 0 に設定すればリビジョンを全く保存しなくなる.
リビジョン機能をコントロールするコードを組み込むには
先に挙げた2つのファイルのうち、”default-constants.php” ファイルの
“define(‘WP_POST_REVISIONS’, true);” ⇒ ”define(‘WP_POST_REVISIONS’, 0 );”
の部分を書き換えるのが手っ取り早いのだが、このファイルに直接手を下すのはやってはいけない.このファイルはWordpressがアップデートされる度に自動的に書き換わってしまうので、ここに変更を加えてしまうとアップデートの度に毎回この修正を加えなくてはならなくなる.以前の記事でも紹介したが、ユーザがWordpressの機能を変更する場合は、テーマ(theme)に含まれる”functions.php” ファイルの中で機能を変更するのが標準的なやり方だ.
今回の変更に関しては “functions.php”ファイルを書き換えるまでもなく、もっと簡単な方法で変更可能だ.
“config.php” ファイルの終わりの辺りに、次の1行
define(‘WP_POST_REVISIONS’, 0 );
を書き加えるだけで良い.”config.php” ファイルで設定した定数の定義が、Wordpressのデフォルト値として設定される.
...
// Change this to localize WordPress. A corresponding MO file for the
// chosen language must be installed to wp-content/languages.
// For example, install de.mo to wp-content/languages and set WPLANG to 'de'
// to enable German language support.
define ('WPLANG', '');
// Revision control
define('AUTOSAVE_INTERVAL', 1800 ); // seconds
define('WP_POST_REVISIONS', 2 );
/* That's all, stop editing! Happy blogging. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php');
?>
【蛇足】エディタの自動セーブ機能そのものを停止させたい場合には
上記の”config.php” ファイルの設定で、
define(‘AUTOSAVE_INTERVAL’, 1800 ); // 秒数
のように長めの秒数を指定すれば実質的に自動セーブが働かないようにすることが可能だが、数値を0に設定すれば自動セーブ機能が働かなくなるかどうかは不明.
自動セーブ機能は “/wp-includes/js/autosave.js” が受け持っており、”/wp-includes/js/script-loader.php”の中で、”autosave.js” をロードしている.
ロードされている”autosave.js” をアンロードすれば良いが、Wordpressには ”wp_deregister_script()” というスクリプトをアンロードするAPIを呼び出せば良いだろう.
wp_deregister_script(‘autosave’);
この辺のスクリプトをアンロードするするようなテクニックは、実際にプラグイン等を開発したことの無い人には少し分かり難い部分かもしれない.