
「ログインしている会員に、1日1回だけ特別な情報や案内を出したい」
ECサイトや会員制サービスでは、こういった“インセンティブモーダル”の仕組みがよく使われます。
今回は、WordPress + PHP で「1日1回だけモーダルを表示する」という、非常にシンプルで奥深い処理を実装しようとして、ハマった話を共有します。
✅ やりたかったこと
- ログインしているユーザーにだけモーダルを表示
- 1日1回だけ出す(何度リロードしても2回目は出さない)
- その日の初回表示後は、表示した記録を保存する
- myCREDでポイントを付与する機能と連携
✅ 最初の設計
phpコピーする編集する$bonus_shown_date = get_user_meta($user_id, 'incentive_shown_date', true);
if ($bonus_shown_date !== $today) {
$show_modal = true;
}
- 条件を満たしたときだけ
$show_modal = true
- モーダル表示後に
update_user_meta()
で記録
でも…出ない。
- どうしてもモーダルが表示されない
delete_user_meta()
を使うと出る(=条件は合ってる)- でも、実際には表示前に “表示済み” として記録されてしまっている
試したこと
- 記録処理のタイミングをずらす(モーダル出力の直後に移動)
functions.php
やinit
アクションを調査- セッションやクッキーで制御してみる
- テーマ全体を grep 検索
🧠最終的な突破口
user_meta
のキー名を変えました。
phpコピーする編集するget_user_meta($user_id, 'incentive_shown_date_v2', true);
- たったこれだけで、モーダルが表示された
- 原因は
functions.php
のどこかで 旧キーを上書きしていたことだった - 名前を変えることで、完全に他処理の干渉を断ち切れた
✅ 最終構成(シンプル・確実)
- 表示判定(条件を満たしたら
true
) - モーダルHTML出力
- 出力の直後にだけ記録
phpコピーする編集する<?php if ($show_modal): ?>
<div class="incentive-modal">...</div>
<?php update_user_meta($user_id, 'incentive_shown_date_v2', $today); ?>
<?php endif; ?>
💡 教訓まとめ
user_meta
のキー名は 他ファイルと衝突しないように工夫する- 記録処理は 出力の“あと”に行う
- 最悪、名前を変えるだけで全部解決することもある