wp-config.php で DISALLOW_FILE_MODS を true にすると、管理画面からのプラグイン追加や更新だけでなく、WordPress本体のセキュリティ更新(マイナーリリースの自動更新)も止まります。この定数を使う場合は、更新を別の手段で実行する必要があります。
「自動更新を有効にしているから大丈夫」と考えていると、緊急のセキュリティリリースが出ても更新されないまま気付けません。
自動更新はファイル変更の可否で判定される
自動更新を実行するかどうかは、WP_Automatic_Updater::is_disabled() で判定されます。最初に確認しているのがファイル変更の可否です。
// wp-admin/includes/class-wp-automatic-updater.php
if ( ! wp_is_file_mod_allowed( 'automatic_updater' ) ) {
return true;
}
wp_is_file_mod_allowed() の中身は次のとおりで、DISALLOW_FILE_MODS が true なら false を返します。
// wp-includes/load.php
return apply_filters( 'file_mod_allowed', ! defined( 'DISALLOW_FILE_MODS' ) || ! DISALLOW_FILE_MODS, $context );
つまりこの定数は「管理画面から触らせない」だけでなく「WordPress自身にもファイルを書き換えさせない」設定です。WP_AUTO_UPDATE_CORE などで自動更新を有効にしていても、この判定で先に止まります。
編集画面だけ止めたいならDISALLOW_FILE_EDIT
目的が「管理画面のテーマ・プラグインエディタを使わせない」ことなら、DISALLOW_FILE_EDIT で足ります。こちらは edit_themes・edit_plugins・edit_files の権限を外すだけで、自動更新には影響しません。
define( 'DISALLOW_FILE_EDIT', true );
プラグインの追加や更新も含めて管理画面から一切変更させたくない場合に限り、DISALLOW_FILE_MODS を選びます。その場合は次の手順で更新を運用します。
DISALLOW_FILE_MODSを残すならWP-CLIで更新する
WP-CLIの wp core update は、DISALLOW_FILE_MODS が true の環境でも更新できます。この定数を入れたままの環境で、コアのマイナー更新が成功することを確認しています。
cd /path/to/wordpress
wp core check-update
wp core update
wp core verify-checksums
verify-checksums は、更新後のコアファイルが公式配布物と一致するかを確認するコマンドです。更新の直後に実行しておくと、ファイルの取りこぼしや改変に気付けます。
WP-CLIで「Strange wp-config.php file」と出る時
SSHでログインしたユーザーのまま実行すると、次のエラーで止まることがあります。
PHP Warning: file_get_contents(/path/to/wordpress/wp-config.php): Failed to open stream: Permission denied
Error: Strange wp-config.php file: wp-settings.php is not loaded directly.
2行目のメッセージは wp-config.php の中身がおかしいように読めますが、原因は1行目です。ログインユーザーに wp-config.php の読み取り権限が無く、WP-CLIがファイルを読めていません。ファイルの所有者(Webサーバーの実行ユーザー)として実行すると解決します。
sudo -u apache wp core update
所有者は ls -l wp-config.php で確認できます。apache の部分は環境に合わせて www-data や nginx に読み替えてください。root で実行する方法は取りません。WP-CLIは root での実行を標準で拒否します。
更新されたかを外から確かめる
サイトのフィードには、標準でWordPressのバージョンが出力されています。サーバーに入らなくても確認できるので、複数サイトをまとめて確認する時に便利です。
curl -s https://example.com/feed/ | grep -o '<generator>[^<]*'
<generator>https://wordpress.org/?v=7.1.2
セキュリティリリースが出たら、この値が最新版になっているかを確認してください。テーマやプラグインで generator の出力を消している場合は表示されないので、管理画面のダッシュボードか wp core version で確認します。