2026年8月17日
2026年8月17日
WordPressの自動更新を正しく設定してサイトを常に最新状態に保つ方法
はじめに
WordPressのコア・プラグイン・テーマの自動更新は、セキュリティパッチを迅速に適用するために重要な機能です。しかし、すべての更新を無条件に自動化すると互換性の問題が発生するリスクもあります。本記事では WP_AUTO_UPDATE_CORE 定数・各種フィルター・WP-CLI スケジュールを組み合わせて、安全で柔軟な自動更新を実現する方法を解説します。
症状・原因
- プラグインのバージョンが古くセキュリティ脆弱性が放置されている
- 手動更新の手間が大きく、更新作業を後回しにしがちである
- 自動更新でサイトが壊れた経験からすべての自動更新を無効化している
- メジャーバージョンアップが自動で行われ、互換性問題が発生した
- 自動更新の結果通知メールが届かず、何が更新されたか把握できていない
解決手順
ステップ1:WP_AUTO_UPDATE_CORE でコアの自動更新を制御する
<?php
// wp-config.php に追記する
// コアの自動更新設定(推奨:マイナーアップデートのみ自動)
// 'minor' → セキュリティ・バグ修正の小バージョンのみ自動更新(推奨)
// true → メジャーも含む全バージョンを自動更新
// false → 自動更新を完全に無効化(非推奨)
define( 'WP_AUTO_UPDATE_CORE', 'minor' );
// 例:6.4.0 → 6.4.1 は自動更新(minor)
// 例:6.4 → 6.5 は自動更新しない(major)
// 自動更新に関するその他の定数
// ファイルの書き換えを禁止する(自動更新も無効化される)
// define( 'DISALLOW_FILE_MODS', true );
// 自動更新のバックグラウンド処理を無効化
// define( 'WP_AUTO_UPDATE_CORE', false );
// add_filter( 'automatic_updater_disabled', '__return_true' );
// 現在の自動更新設定を確認する(WP-CLI)
// wp eval 'var_dump( defined("WP_AUTO_UPDATE_CORE") ? WP_AUTO_UPDATE_CORE : "not set" );'
ステップ2:auto_update_plugin / auto_update_theme フィルターで選択的に更新する
<?php
// functions.php または mu-plugins/ のプラグインに追記する
// プラグインの自動更新をセキュリティ関連のみ有効にする
add_filter( 'auto_update_plugin', 'selective_plugin_auto_update', 10, 2 );
function selective_plugin_auto_update( $update, $item ) {
// 常に自動更新するプラグインのスラッグ
$always_update = [
'wordfence', // セキュリティプラグイン
'woocommerce', // eコマース(セキュリティ重要)
'akismet', // スパム対策
'really-simple-ssl', // SSL
];
// 自動更新しないプラグイン(互換性が重要なもの)
$never_update = [
'advanced-custom-fields', // ACF:テーマとの密な依存
'elementor', // ページビルダー:更新で崩れる可能性
];
if ( in_array( $item->slug, $always_update, true ) ) {
return true; // 自動更新する
}
if ( in_array( $item->slug, $never_update, true ) ) {
return false; // 自動更新しない
}
// それ以外はデフォルト動作(マイナーのみ)
return $update;
}
// テーマの自動更新(子テーマは更新しない)
add_filter( 'auto_update_theme', 'selective_theme_auto_update', 10, 2 );
function selective_theme_auto_update( $update, $item ) {
// 親テーマ・公式テーマのみ自動更新
$auto_update_themes = [ 'twentytwentyfour', 'twentytwentyfive' ];
if ( in_array( $item->theme, $auto_update_themes, true ) ) {
return true;
}
// カスタムテーマ・子テーマは自動更新しない
return false;
}
ステップ3:automatic_updater_disabled と DISALLOW_FILE_MODS で環境別に制御する
<?php
// 開発環境・ステージング環境では自動更新を無効化する
// wp-config.php に環境変数で制御する例
// 環境を判定する関数
function is_production_environment() {
$production_hosts = [
'example.com',
'www.example.com',
];
return in_array( $_SERVER['HTTP_HOST'] ?? '', $production_hosts, true );
}
// 本番環境以外では自動更新を無効化する
if ( ! is_production_environment() ) {
// ステージング・開発環境では更新を無効化
define( 'WP_AUTO_UPDATE_CORE', false );
add_filter( 'automatic_updater_disabled', '__return_true' );
} else {
// 本番環境ではマイナーのみ自動更新
define( 'WP_AUTO_UPDATE_CORE', 'minor' );
}
// DISALLOW_FILE_MODS = true の場合の自動更新への影響
// → 自動更新(コア・プラグイン・テーマ全て)が無効化される
// → 管理画面からのプラグイン・テーマのインストールも無効化される
// → FTP 認証情報の入力も不要になる
// 本番環境でセキュリティを強化したい場合に有効
// define( 'DISALLOW_FILE_MODS', true ); // 更新は WP-CLI で手動実行
// 翻訳ファイルの自動更新
add_filter( 'auto_update_translation', '__return_true' ); // 常に自動更新
ステップ4:auto_core_update_email フィルターで通知メールをカスタマイズする
<?php
// functions.php に追記する
// 自動更新の通知メール先を変更する
add_filter( 'auto_core_update_email', 'customize_auto_update_email', 10, 4 );
function customize_auto_update_email( $email, $type, $core_update, $result ) {
// 通知先を管理者メール以外に変更
$email['to'] = 'sysadmin@example.com';
// 成功時のみ通知を送る(失敗時は別途対応)
if ( 'success' === $type ) {
$email['subject'] = '[' . get_bloginfo( 'name' ) . '] WordPress ' .
$core_update->current . ' への自動更新が完了しました';
$email['body'] = sprintf(
"WordPress が自動的にバージョン %s へ更新されました。\n\n" .
"サイト: %s\n" .
"更新日時: %s\n\n" .
"管理画面を確認してください: %s",
$core_update->current,
get_bloginfo( 'url' ),
date( 'Y-m-d H:i:s' ),
admin_url()
);
}
// 失敗時は通知しない(別のアラート手段を使用)
if ( 'fail' === $type ) {
$email['to'] = ''; // 空にして送信をスキップ
}
return $email;
}
// プラグイン・テーマの自動更新通知
add_filter( 'auto_plugin_theme_update_email', 'customize_plugin_update_email', 10, 4 );
function customize_plugin_update_email( $email, $type, $successful_updates, $failed_updates ) {
$email['to'] = 'sysadmin@example.com';
if ( ! empty( $failed_updates ) ) {
$email['subject'] = '⚠ 自動更新失敗: ' . count( $failed_updates ) . ' 件のプラグイン';
}
return $email;
}
ステップ5:WP-CLI と cron で自動更新スケジュールを設定する
#!/bin/bash
# /opt/scripts/wp-auto-update.sh
# WordPress の安全な自動更新スクリプト
WP_PATH="/var/www/html"
LOG_FILE="/var/log/wordpress-updates.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
log() {
echo "[$DATE] $1" >> "$LOG_FILE"
}
log "=== WordPress 自動更新スクリプト開始 ==="
# バックアップを取得する(更新前)
log "バックアップを開始します..."
/opt/scripts/wp-backup.sh >> "$LOG_FILE" 2>&1
if [ $? -ne 0 ]; then
log "バックアップに失敗しました。更新をスキップします。"
exit 1
fi
# WordPress コアの更新
log "WordPress コアの更新を確認しています..."
wp --path="$WP_PATH" core check-update --quiet 2>/dev/null
if [ $? -eq 0 ]; then
log "コアの更新があります。更新を実行します..."
wp --path="$WP_PATH" core update >> "$LOG_FILE" 2>&1
wp --path="$WP_PATH" core update-db >> "$LOG_FILE" 2>&1
fi
# プラグインの更新(メジャーバージョンアップは除く)
log "プラグインの更新を実行します..."
wp --path="$WP_PATH" plugin update --all \
--minor-only \
>> "$LOG_FILE" 2>&1
# テーマの更新
log "テーマの更新を実行します..."
wp --path="$WP_PATH" theme update --all >> "$LOG_FILE" 2>&1
# キャッシュクリア
log "キャッシュをクリアします..."
wp --path="$WP_PATH" cache flush >> "$LOG_FILE" 2>&1
log "=== 自動更新スクリプト完了 ==="
# スクリプトに実行権限を付与する
chmod +x /opt/scripts/wp-auto-update.sh
# crontab に登録する(毎日午前2時に実行)
crontab -e
# 以下を追記する:
# 0 2 * * * /opt/scripts/wp-auto-update.sh
# crontab の確認
crontab -l
# 手動でテスト実行する
/opt/scripts/wp-auto-update.sh
tail -f /var/log/wordpress-updates.log
注意事項
- バックアップ必須: 自動更新の前に必ずバックアップを取得するスクリプトを組み込んでください。更新で問題が起きた場合に即座に復元できます。
- ステージングでテスト: 本番環境に自動更新を適用する前に、ステージング環境で同じ更新をテストする運用を推奨します。
- WP-CLI の --minor-only: WP-CLI 2.9.0 以降で利用可能なオプションです。バージョンを確認してください(
wp cli version)。
まとめ
WordPress の自動更新は WP_AUTO_UPDATE_CORE 定数でコアを制御し、フィルターフックでプラグイン・テーマを選択的に管理し、WP-CLI cron でバックアップ付きの安全な自動更新を実現できます。セキュリティと安定性のバランスを取った設定で運用してください。関連記事:WordPressのバックアップを自動化する方法