大量資料無法儲存(變體、稅率等)的問題
若發現商品變體、稅率及其他大量資料集無法儲存,可能是 Suhosin(PHP 安全模組)阻止了 POST 資料儲存。PHP 5.3.9+ 版本或執行 mod_security 的伺服器也可能發生此問題。
設定 Suhosin
若啟用 Suhosin,可能需要設定以提高資料提交限制。變更 Suhosin 設定的方式因主機商而異,建議向主機商諮詢而非自行處理。不過部分主機商允許透過 php.ini、suhosin.ini 或 .htaccess 變更設定。通常需要調整以下變數:
suhosin.post.max_array_index_length = 256
suhosin.post.max_totalname_length = 65535
suhosin.post.max_vars = 1024
suhosin.post.max_name_length = 256
suhosin.request.max_varname_length = 256
suhosin.request.max_array_index_length = 256
suhosin.request.max_totalname_length = 65535
suhosin.request.max_vars = 1024
儲存後需要重新啟動伺服器使變更生效。更多 Suhosin 設定資訊請參考 http://www.hardened-php.net/suhosin/configuration.html
在共享主機環境中可能無法編輯 php.ini,此時可嘗試透過 .htaccess 設定 Suhosin:
php_value suhosin.max_array_index_length 256
php_value suhosin.post.max_array_index_length 256
php_value suhosin.post.max_totalname_length 65535
php_value suhosin.post.max_vars 1024
php_value suhosin.post.max_name_length 256
php_value suhosin.request.max_varname_length 256
php_value suhosin.request.max_array_index_length 256
php_value suhosin.request.max_totalname_length 65535
php_value suhosin.request.max_vars 1024
仍建議查看主機商的文件或聯絡主機商尋求協助。
若使用非拉丁字元,建議將以下數值從預設的 64 提高。這有助於處理非拉丁字元的問題。
suhosin.request.max_varname_length = 256
PHP 5.3.9+ 與 max_input_vars
較新的 PHP 版本實作了 php.ini 指令 max_input_vars,通常設為 1000。這代表提交超過 1000 個表單欄位會被截斷,導致資料無法儲存。
可在 php.ini 中變更:
max_input_vars = 3000
若需透過 htaccess 處理(例如在共享主機上),可使用:
php_value max_input_vars 3000
Mod_security
Mod_security 也可能阻止資料儲存。若發生此情況,你可能會遇到 503 錯誤。與上述問題相同,建議聯絡主機商協助解決。解決方法包含:
- 設定 mod_security 允許資料通過(進階)
- 依 IP 停用 mod security
- (僅限 Dreamhost)在控制面板關閉「Extra web security」設定
參考資料:
http://www.nivas.hr/blog/2012/04/04/beware-of-max_input_vars-php-ini-configuration-option/
https://shopplugin.net/kb/unable-to-save-products-with-large-amount-of-variations/
WP Max Submit Protect
若要驗證是否確實遇到本文件描述的問題,可暫時安裝並啟用此免費外掛:WP Max Submit Protect