「WordPress 3分間フッキング」は、WordPressのフック(アクション・フィルター)を活用して、プラグインをインストールせずに簡単にサイトをカスタマイズする方法をわかりやすく解説するシリーズです。あの料理番組「3分間クッキング」のように、短時間で実用的なテクニックをマスターしていきましょう!
投稿リビジョンとデータベース肥大化の問題
WordPressの便利な機能の一つに「リビジョン(改訂履歴)」があります。この機能により、投稿や固定ページを編集するたびに過去のバージョンが保存され、必要に応じて以前の状態に戻すことができます。とても便利な機能ですが、一方でデメリットもあります。
デフォルト設定では、リビジョンの保存数に制限がないため、頻繁に編集を行う投稿では、データベース内にリビジョンが際限なく増え続けることになります。これはデータベースの肥大化を招き、バックアップ時間の増加、クエリの遅延、全体的なサイトパフォーマンスの低下につながる可能性があります。
今回は wp_revisions_to_keep
フィルターフックを使って、投稿や固定ページのリビジョン保存数を制限し、データベースを最適化する方法をご紹介します!データベースの肥大化を簡単に防ぎ、サイトパフォーマンスの維持に貢献する小さな改善です。
フィルターフックを使ってリビジョン数を制限する
今回使用するのは wp_revisions_to_keep
というフィルターフックです。このフックは、投稿や固定ページのリビジョンを保存する際に、何個のリビジョンを保持するかを制御することができます。
WordPressのフィルターフックは、特定のデータを「フィルタリング(加工)」して返すためのフックです。このケースでは、リビジョンの最大保存数をフィルタリングして、適切な数に制限します。
では、具体的なコードを見ていきましょう!
基本的なリビジョン数の制限
以下のコードを functions.php
に追加します:
1 2 3 4 5 6 |
// リビジョンの保存数を5つに制限 function wp3min_limit_revisions_number($num, $post) { return 5; // リビジョンの最大保存数 } add_filter('wp_revisions_to_keep', 'wp3min_limit_revisions_number', 10, 2); |
コードの解説
1. wp3min_limit_revisions_number
関数を定義し、wp_revisions_to_keep
フィルターフックに登録しています。
2. この関数は2つのパラメータを受け取ります:
$num
: デフォルトのリビジョン数(通常はfalseで、無制限を意味します)$post
: 現在処理中の投稿オブジェクト(投稿タイプなどの情報を含む)
3. この例では、すべての投稿タイプのリビジョン数を「5」に制限しています。
4. add_filter
関数の最後の2つの数字は、それぞれ優先度(10)と、関数が受け取る引数の数(2)を表しています。
このシンプルなコードを追加するだけで、すべての新しいリビジョンは最大5つに制限されます。これにより、データベースのサイズを抑えつつ、直近の変更履歴へのアクセスは維持できるという絶妙なバランスが実現できます。
投稿タイプごとにリビジョン数を設定する
基本的な実装をさらに発展させて、投稿タイプごとに異なるリビジョン数を設定することもできます。例えば、ブログ投稿は頻繁に更新されるため少ないリビジョン数で済ませ、重要な固定ページには多めのリビジョンを保存するといった使い分けが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 投稿タイプごとにリビジョン数を制限 function wp3min_limit_revisions_by_post_type($num, $post) { // 投稿タイプに基づいてリビジョン数を設定 switch ($post->post_type) { case 'post': return 3; // 通常の投稿は3つまで case 'page': return 10; // 固定ページは10個まで case 'product': return 5; // WooCommerceの商品は5つまで default: return 2; // その他の投稿タイプは2つまで } } add_filter('wp_revisions_to_keep', 'wp3min_limit_revisions_by_post_type', 10, 2); |
コードの解説
1. switch
文を使って、$post->post_type
の値に基づいて異なるリビジョン数を設定しています。
2. 通常の投稿(post)には3つ、固定ページ(page)には10個、WooCommerceの商品(product)には5つのリビジョンを許可しています。
3. どの条件にも一致しない投稿タイプは、デフォルトで2つのリビジョンに制限されます。
特定の投稿IDのリビジョン数を変更する
さらに細かく制御したい場合は、特定の投稿IDに基づいてリビジョン数を設定することもできます。例えば、特に重要な投稿や頻繁に更新される特定のページには、より多くのリビジョンを許可することが考えられます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 特定の投稿IDに基づいてリビジョン数を制限 function wp3min_limit_revisions_by_post_id($num, $post) { // 特別に管理したい投稿IDのリスト $special_posts = array( 1 => 20, // 投稿ID 1には20リビジョン 42 => 15, // 投稿ID 42には15リビジョン 123 => 0 // 投稿ID 123はリビジョンを保存しない ); // 投稿IDがリストにある場合は、指定したリビジョン数を返す if (array_key_exists($post->ID, $special_posts)) { return $special_posts[$post->ID]; } // それ以外は投稿タイプに基づいて設定 switch ($post->post_type) { case 'post': return 3; case 'page': return 5; default: return 2; } } add_filter('wp_revisions_to_keep', 'wp3min_limit_revisions_by_post_id', 10, 2); |
制限方法 | メリット | デメリット |
---|---|---|
一律制限 | 設定が簡単 コードがシンプル |
柔軟性に欠ける 全ての投稿に同じ設定が適用される |
投稿タイプ別 | 各コンテンツタイプに適した設定 一定の柔軟性 |
同じ投稿タイプ内で差別化できない |
投稿ID別 | 最大限の柔軟性 特定投稿の詳細な制御 |
管理が複雑 新規投稿のIDを把握する必要がある |
無制限(デフォルト) | 全ての変更履歴が残る どの時点にも復元可能 |
データベースの肥大化 バックアップ時間の増加 パフォーマンスへの影響 |
リビジョン数を制限する際は、コンテンツの重要性と更新頻度のバランスを考慮することが大切です。重要なページで変更履歴が失われてしまうと、問題が発生した際に適切な状態に戻せなくなる可能性があります。
リビジョン制限のメリットとデメリット
リビジョン数を制限することには、メリットとデメリットの両方があります。それぞれをよく理解した上で、自分のサイトに最適な設定を行いましょう。
メリット
- データベースサイズの最適化 – リビジョン数を制限することで、データベースのサイズを抑えられます。大規模なサイトでは、これにより数百MBから数GBのスペースを節約できることもあります。
- バックアップの高速化 – データベースが小さくなれば、バックアップの作成・復元にかかる時間も短縮されます。
- クエリパフォーマンスの向上 – 不要なリビジョンデータが減ることで、データベースクエリの処理速度が向上する可能性があります。
- 管理画面の表示速度向上 – 特に投稿編集画面のリビジョン一覧の読み込みが高速化されます。
- ディスク容量の節約 – 特に共有サーバーなど、ディスク容量に制限があるホスティング環境では重要です。
デメリット
- 古い変更履歴の喪失 – リビジョン数を制限すると、古い変更履歴にアクセスできなくなります。長期間にわたる変更を追跡したい場合は注意が必要です。
- 問題発生時の復旧制限 – 多数の変更を経た後に問題が発見された場合、制限により十分に古いバージョンまで戻れない可能性があります。
- 複数執筆者の変更追跡の難しさ – 多くの執筆者が関わる場合、各執筆者の変更履歴を十分に追跡できなくなることがあります。
- 設定の最適化が難しい – 「適切な」リビジョン数はコンテンツによって異なるため、一律の設定では最適化が難しい場合があります。
リビジョン数の設定は、サイトの規模、更新頻度、コンテンツの重要性によって異なります。小規模なブログサイトなら3〜5程度、重要なビジネスサイトでは5〜10程度が一般的な設定です。
代替方法:wp-config.phpでの設定
フィルターフックの他に、wp-config.php
ファイルで直接リビジョン数を制限することも可能です。これはフックを使う方法よりもシンプルですが、投稿タイプごとの細かい制御はできません。
1 2 3 |
// wp-config.phpに追加 define('WP_POST_REVISIONS', 5); // すべての投稿タイプで5つのリビジョンに制限 |
リビジョンを完全に無効にする場合は、以下のように設定します:
1 2 3 |
// wp-config.phpに追加 define('WP_POST_REVISIONS', false); // リビジョン機能を完全に無効化 |
注意: wp-config.php
での設定は、フィルターフックよりも優先されます。両方を設定した場合、wp-config.php
の設定が適用されます。
既存のリビジョンをクリーンアップする方法
リビジョン数を制限する設定は新しく作成されるリビジョンにのみ適用されます。既存のリビジョンをクリーンアップするには、以下の方法があります:
1. データベースの最適化プラグインを使用
「WP-Optimize」や「Advanced Database Cleaner」などのプラグインを使用すると、既存のリビジョンを簡単に削除できます。
2. SQLクエリでリビジョンを削除
直接データベースにアクセスできる場合は、以下のようなSQLクエリで古いリビジョンを削除できます(バックアップを取った上で実行してください):
1 2 3 |
-- 投稿のリビジョンを削除するSQLクエリ DELETE FROM wp_posts WHERE post_type = 'revision'; |
3. PHPスクリプトで特定条件のリビジョンを削除
次のようなPHPスクリプトを一時的に作成して実行することで、より細かく制御しながらリビジョンを削除できます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// 一時的な管理用スクリプトとして使用(実行後は必ず削除すること) function wp3min_cleanup_old_revisions() { global $wpdb; // 各投稿の最新の5つのリビジョンを残して他を削除 $posts = $wpdb->get_results("SELECT ID FROM {$wpdb->posts} WHERE post_type IN ('post', 'page')"); foreach ($posts as $post) { // この投稿の全リビジョンを取得(新しい順) $revisions = $wpdb->get_results($wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_type = 'revision' ORDER BY post_date DESC", $post->ID )); // 5つ以上のリビジョンがある場合、6番目以降を削除 if (count($revisions) > 5) { for ($i = 5; $i < count($revisions); $i++) { wp_delete_post_revision($revisions[$i]->ID); } } } echo '古いリビジョンのクリーンアップが完了しました。'; } // 管理者としてログイン中のみ実行可能 if (current_user_can('administrator')) { wp3min_cleanup_old_revisions(); } |
FAQ
Q1. リビジョンを完全に無効にするとどうなりますか?
A1. リビジョンを完全に無効にすると、投稿や固定ページの変更履歴が一切保存されなくなります。これによりデータベースのサイズを最小限に抑えることができますが、編集ミスがあった場合や以前のバージョンに戻したい場合に、復元する手段がなくなります。重要なコンテンツには、最低でも数個のリビジョンを許可することをお勧めします。
Q2. リビジョン制限を設定した後、既存のリビジョンはどうなりますか?
A2. リビジョン制限を設定しても、既存のリビジョンは自動的に削除されません。設定は新しく作成されるリビジョンにのみ適用されます。既存のリビジョンをクリーンアップするには、データベース最適化プラグインを使用するか、SQLクエリで削除する必要があります。
Q3. リビジョン数の最適な設定はどれくらいですか?
A3. 最適なリビジョン数は、サイトの用途や更新頻度によって異なります。一般的なブログやウェブサイトでは3〜5個が適切なバランスとされています。重要なビジネスサイトや法的文書など、変更履歴の追跡が重要な場合は、5〜10個程度が推奨されます。サーバー資源に余裕がある場合は、重要なページには多めのリビジョンを許可すると良いでしょう。
Q4. フィルターフックとwp-config.php設定の両方を使うとどうなりますか?
A4. 両方の方法でリビジョン数を設定した場合、wp-config.php
での設定が優先されます。つまり、wp-config.php
でWP_POST_REVISIONS
を定義している場合、wp_revisions_to_keep
フィルターフックは無視されます。ただし、wp-config.php
で設定していない場合や、その設定が削除された場合は、フィルターフックの設定が有効になります。
まとめ
今回は wp_revisions_to_keep
フィルターフックを使って、投稿や固定ページのリビジョン保存数を制限する方法を解説しました。わずか数行のコードで、データベースの肥大化を防ぎ、サイトパフォーマンスを最適化することができます。
リビジョン数の適切な制限は、データベースの効率化とコンテンツ管理の安全性のバランスを取るための重要な施策です。サイトの規模や更新頻度に応じて、もっとも適切な設定を選びましょう。シンプルな設定で十分な場合はwp-config.php
での定義を、きめ細かい制御が必要な場合はフィルターフックの活用をおすすめします。
WordPressのフックシステムは非常に柔軟で強力です。プラグインに頼らずとも、簡単なコードで多くのカスタマイズが可能です。ぜひ今回のテクニックを活用して、あなたのサイトのデータベースを最適化してみてください!
埼玉県川越市でWordPressサイトの保守やパフォーマンス最適化を行っています。サイトの高速化やデータベース最適化でお困りの方は、WordPress保守サポートサービスのご利用をご検討ください:https://edel-hearts.com/wordpress-maintenance-service/
また、より高度なWordPressのカスタマイズについて知りたい方は、WordPress顧問エンジニアサービスもご利用いただけます:https://edel-hearts.com/wordpress-technical-advisor/