
AWS x WordPress Vol.1 〜phpのメモリ上限エラーの時の対処法〜
🔍どんな問題が起こるのか?
極論ですけど、WordPress使うならAWSを避けるorAWS使いたいならWord Press避けた方がいいんじゃない?Webディレクターです!
今回はAWSxWordPressで発生した問題について、記録として残しておきます。
WordPress の管理画面で、「公開済みのニュース記事の中からトップページに表示する記事を選択する」ために プルダウンメニューを作成 した。しかし、記事数が増えると、エラーが発生してプルダウンにデータが表示されなくなるという問題が発生。

なぜエラーが起こるのか?
1️⃣ PHP のメモリ上限(memory_limit)を超えてしまう
WordPress は PHP というプログラム で動いている。
PHP には 「1回の処理で使えるメモリの上限」 が決まっている
(例:128MB)記事の数が増えてくると、すべてのデータを一気に処理しようとして メモリの上限を超えてエラー になる。
2️⃣ 処理時間(max_execution_time)を超えてしまう
WordPress の管理画面が記事データを読み込むのに時間がかかりすぎると、途中で処理が強制終了 する。
これが「タイムアウトエラー」の原因。
3️⃣ プルダウンメニューが一度にすべての記事を読み込もうとする
ニュース記事が 1000件 あると、プルダウンに 1000個の選択肢を一気に追加 しようとする。
すると、ページの読み込みが遅くなり、最悪の場合 画面がフリーズ する。
✅ 解決策
この問題を解決するには、以下の方法を組み合わせて対策するのがベスト。
方法 1️⃣: PHP のメモリ上限を増やす
一時的な解決策 として、PHP のメモリ上限を増やすことでエラーを防ぐ。

設定方法
(1)WordPress の wp-config.php を変更
define('WP_MEMORY_LIMIT', '256M'); // メモリ上限を256MBに増やす
(2)サーバーの php.ini を変更
memory_limit = 256M
max_execution_time = 300 ; 実行時間を300秒に延長
📌 ただし、これは一時的な対応であり、根本的な解決にはならない。
方法 2️⃣: プルダウンの仕様を変更する(最初から全部を読み込まない)
❌ NG: 全記事を一気に読み込む
<select>
<option>ニュース記事 1</option>
<option>ニュース記事 2</option>
<option>ニュース記事 3</option>
...(1000件続く)
</select>
記事数が増えるほど、ページが重くなる
サーバーがメモリを消費しすぎてエラーになる
ユーザーにとっても、選択肢が多すぎて使いにくい
✅ OK: 最新50件のみ表示 & 「もっと見る」ボタンを設置
<select id="news-select">
<option value="">選択してください</option>
</select>
<button id="load-more">もっと表示する</button>
最初は 最新50件 だけを表示。
「もっと表示する」ボタンを押したときに追加でデータを取得 する。
こうすることで、一度に大量のデータを読み込まず、サーバーの負荷を抑える。
方法 3️⃣: AJAX を使って、必要なときだけデータを取得する

フロントエンド(JavaScript)
jQuery(document).ready(function($) {
$('#news-select').on('focus', function() { // プルダウンを開いたらデータを取得
if ($(this).children('option').length === 1) { // すでにデータがある場合は取得しない
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'get_news_list'
},
beforeSend: function() {
$('#news-select').append('<option>読み込み中...</option>');
},
success: function(response) {
$('#news-select').empty();
$('#news-select').append(response);
},
error: function() {
alert('データの取得に失敗しました');
}
});
}
});
});
📌 ポイント
プルダウンを開いたときだけデータを取得
一度取得したら、再度開いたときにリクエストを送らない(無駄な通信を防ぐ)
WordPress 側(functions.php)
function get_news_list() {
if (!is_user_logged_in()) {
wp_die('権限がありません');
}
$args = array(
'post_type' => 'news',
'posts_per_page' => 50,
'orderby' => 'date',
'order' => 'DESC'
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<option value="' . get_the_ID() . '">' . get_the_title() . '</option>';
}
} else {
echo '<option>記事がありません</option>';
}
wp_reset_postdata();
wp_die();
}
add_action('wp_ajax_get_news_list', 'get_news_list');
add_action('wp_ajax_nopriv_get_news_list', 'get_news_list');
🔍 まとめ
✅ PHP のメモリ上限を増やす(ただし一時的な対応)
✅ プルダウンに最初からすべてのデータを入れない(50件ずつ表示 & もっと見るボタン)
✅ AJAX を使って「プルダウンを開いたときにデータを取得」することでサーバー負荷を軽減
💡 この方法を組み合わせれば、サーバーの負荷を減らしつつ、快適な WordPress 管理画面が実現できます! 🚀