WordPpressのプラグインで入力フォームを作成しているときに、あるところまでフォームの入力ボックス(inputタグの部分)を追加していったところ途中までは順調に追加できていたのですが、あるところから、新しい入力ボックスを追加して「保存」をクリックすると、新たに追加した中身が保存されず消えてしまうという症状に遭遇しました。しかもエラーメッセージも何もでません。
そんなときの原因と対処法についてまとめています。
症状
WP Booking Systemというツールを使用してフォームを作成しているときに、入力ボックスを30個ほど登録したところで、以下のようにさらに入力ボックスを追加しました。(下図のDuplicate of ~の部分)
この状態で「Save Form」をクリックします。すると、追加したはずの項目が全て消えてしまいました。
エラーメッセージも何も出ません。ただ変更が追加されないという状態です。リロードしたり、再度読み込みをしても何度やってもダメでした。
原因
原因はすごく単純で、WordPressの初期設定で下記のいずれかのパラメータの指定がサーバーの上限に到達したからです。
現在設定しているフォームだけでなく、すべてのアドオンで設定している項目が対象となります。今回、フォームをたくさん追加したことで初期設定の上限に達し、サーバー上に保存されなくなったということです。
memory_limitとは何か?
memory_limitとは、PHPサーバーのメモリの上限のことで、スクリプトが確保できる最大メモリのバイト数です。
実行するスクリプトの容量が大きく、memory_limitで指定した容量を超えるとエラーが発生しますPHPを使ったフレームワークであるLaravelや重い処理を実行したときに発生する可能性があります。
max_input_vars
max_input_varsは、PHPサーバーが受け取れる入力変数の数の上限です。
パラメーター数が上限を超えたとしても、超えた分が除外されるのみで、スクリプトが止まるわけではありません。
エラーが表示されずにデータが保存されないというときは保存しようとしている変数がmax_input_varsで指定した上限数を超えた可能性があります。デフォルトは1000に設定されているため、変数の数が1000を超えると、超えた分は保存されなくなります。
post_max_size
post_max_sizeは、1回のアップロードファイルすべての合計サイズの上限です。
現在の値の確認方法
ツールから確認する方法
現在の設定値の確認はWordPress管理画面の「ツール」→「サイトヘルス」→「サーバー」で確認することができます。
「サーバー」という項目の中段あたりに、PHPの設定情報が記載してあります。
それぞれのパラメータの役割やデフォルト値は以下のようになっています。
対象 | 表示名 | 変数名 | デフォルト値 | 詳細 | 変更値の例 |
---|---|---|---|---|---|
✓ | PHP 最大入力変数 (max input variables) | max input variables | 1000 | 受け取れる入力変数の数の上限。パラメーター数が上限を超えたとしても、超えた分が除外されるのみで、スクリプトが止まるわけではない。 | 2000 |
PHP タイムリミット | set time limit | 30 | スクリプトが実行可能な秒数を設定します。 この制限にかかるとスクリプトは致命的エラーを返します。 | 60 | |
✓ | PHP メモリ上限 | memory limit | 128MB | スクリプトが確保できる最大メモリのバイト数。 | 256MB |
PHPメモリ制限 (管理画面のみ) | WP_MEMORY_LIMIT | 40MB | WordPressが消費するメモリの上限。オーバーするとエラーが表示される。 | 64MB | |
最大入力時間 (max input time) | max input time | 30 | スクリプトで入力を受け付けることができる最大秒数を設定します。 | 60 | |
アップロードの上限ファイルサイズ | upload max filesize | 2MB | 1ファイルあたりの最大アップロードサイズ | 32MB | |
✓ | PHP POST サイズ上限 | post max size | 8MB | 1回のアップロードファイルすべての合計サイズ | 60MB |
Elementorの場合
Elementorを使用している場合は、上記のツール以外にもElementorのメニューから確認することもできます。
「Elementor」→「システム情報」へと進みます。
上段が「Server Environment(サーバー環境)」、中段が「WordPress Environment(WordPressの環境)」となっています。
対象 | 表示名 | 変数名 | デフォルト値 | 詳細 | 変更値の例 |
---|---|---|---|---|---|
✓ | PHP Memory Limit | memory limit | 128MB | スクリプトが確保できる最大メモリのバイト数。 | 256MB |
✓ | PHP Max Input Vars: | max input variables | 1000 | 受け取れる入力変数の数の上限。パラメーター数が上限を超えたとしても、超えた分が除外されるのみで、スクリプトが止まるわけではない。 | 2000 |
✓ | PHP Max Post Size: | post max size | 8MB | 1回のアップロードファイルすべての合計サイズ | 60MB |
Max Upload Size: | upload max filesize | 2MB | 1ファイルあたりの最大アップロードサイズ | 32MB | |
Memory limit: | WP_MEMORY_LIMIT | 40MB | WordPressが消費するメモリの上限。オーバーするとエラーが表示される。 | 64MB | |
Max Memory limit: | WP_MAX_MEMORY_LIMIT | 256MB | WordPressが使用するメモリー上限値。管理画面での処理やページ作成時のプレビューなどで使用するメモリが対象となる。 | 512MB |
※注意点:各パラメータの関係
各パラメータの関係は以下を満たす必要があります。
memory_limit >= post_max_size >= upload_max_filesize
つまり、memory_limit(メモリ上限)が最も大きく、post_max_size(1回のアップロードの合計容量)はそれ以下、upload_max_filesize(1ファイルあたりの最大アップロードサイズ)はそれ以下を満たすように設定する必要があります。
解決策:PHPのパラメーターの設定方法
フォームに追加した入力ボックス(inputタグ)が保存されず消えてしまうときの解決策は以下の3つのパラメータの数値を引き上げることです。
記述方法としては、PHPサーバー全体の設定を変更する「php.ini」の編集と、対象となるWordPressサイトのみの設定を変更する「.htaccess」の編集があります。
「.htaccess」を変更する方が他サイトへの影響を避けられ、かつ容易なためここではこちらの方法を紹介します。
追記するコード
.htaccessに追記するコードは以下になります。
php_value post_max_size 64M
php_value memory_limit 128M
php_value max_input_vars 2000
php_value upload_max_filesize 32M //参考までに
容量の数値は必要に応じて変更してください。
.htaccessの記述場所
.htaccessに記述するときもルールがあります。
.htaccessは運用元のサーバー会社やプラグインなどによって既にいろいろと記述がある場合があります。
例えば、記述前のデフォルトで以下のようになっています。
# BEGIN SAKURA Internet Inc.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
<FilesMatch "\.(css|js)$">
ExpiresDefault "access plus 1 week"
</FilesMatch>
<FilesMatch "\.(gif|jpe?g|png)$">
ExpiresDefault "access plus 1 month"
</FilesMatch>
</IfModule>
# END SAKURA Internet Inc.
#SITEGUARD_PLUGIN_SETTINGS_START
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_START
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /sys/
RewriteRule ^wp-signup\.php 404-siteguard [L]
RewriteRule ^wp-activate\.php 404-siteguard [L]
</IfModule>
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_END
#SITEGUARD_PLUGIN_SETTINGS_END
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /sys/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /sys/index.php [L]
</IfModule>
# END WordPress
記述するときは一番上や、一番下の「#END WordPress」の下などに記述します。
くれぐれもコメントアウトで囲まれている箇所(<IfModule></IfModule>
)の間に記述しないようにしましょう。
以下のように記述して保存すれば完了です。
・
・
・
</IfModule>
# END WordPress
php_value upload_max_filesize 32M
php_value post_max_size 64M
php_value memory_limit 128M
php_value max_input_vars 2000
それでも保存できない:max_input_nesting_level
もし、上記のコードを追記してもまだエラーが出る場合は、「max_input_nesting_level」というパラメーターが影響している可能性もあります。
必要に応じて変更してみてください。
「max_input_nesting_level」はPHPが受け取れるスクリプトの最大階層です。デフォルトでは64になっています。この数値を大きくして、より深度の深い配列も受け取れるようにすれば動く可能性があります。
WordPressの上限数値を変更する方法
ここからはご参考ですが、PHPサーバーの設定ではなく、WordPressで指定されている上限数値も存在しています。
下記の「WP_MEMORY_LIMIT」と「WP_MAX_MEMORY_LIMIT」です。
対象 | 表示名 | 変数名 | デフォルト値 | 詳細 | 変更値の例 |
---|---|---|---|---|---|
Memory limit: | WP_MEMORY_LIMIT | 40MB | WordPressが消費するメモリの上限。オーバーするとエラーが表示される。 | 64MB | |
Max Memory limit: | WP_MAX_MEMORY_LIMIT | 256MB | WordPressが使用するメモリー上限値。管理画面での処理やページ作成時のプレビューなどで使用するメモリが対象となる。 | 512MB |
wp-config.phpの編集
この2つの数値の変更は「php.ini」や「.htaccess」では設定しません。基本的には「/wp-config.php」ファイルを編集します。
冒頭の <?php
の後(コメントアウトの後ぐらい)に、以下のコードを記述します。
define('WP_MEMORY_LIMIT', '64M');
define('WP_MAX_MEMORY_LIMIT', '512M'):
wp-includes/default-constants.phpは編集しない
なお、「WP_MEMORY_LIMIT」と「WP_MAX_MEMORY_LIMIT」が実際に定義されているのはwp-includes配下の「default-constants.php」というファイルの中です。
以下のように記述されています。
// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
define( 'WP_MEMORY_LIMIT', $current_limit );
} elseif ( is_multisite() ) {
define( 'WP_MEMORY_LIMIT', '64M' );
} else {
define( 'WP_MEMORY_LIMIT', '40M' );
}
}
if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
} elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
} else {
define( 'WP_MAX_MEMORY_LIMIT', '256M' );
}
}
ただし、この「default-constants.php」はWordPressのバージョンアップなどで頻繁に変更されるため、ここに直接記述しない方がいいです。