おみくじをショートコードで表示する方法

この記事では、おみくじ機能(日本時間対応版)を、ショートコードで簡単に実装する方法を解説します。
Ajaxや外部スクリプトを使わず、シンプルなPHPと少量のCSSだけで動作します。
お知らせ・カテゴリー・アーカイブページなどには一切影響しません。

1 実装のポイント

  • ショートコード名:[simple_omikuji]
  • 結果はページ読み込みごとにランダム表示
  • 日本時間(JST)で「1日1回制限」を管理
  • Ajax非対応でも軽量で高速

2 functions.php にコードを追加

注意: 必ず子テーマの functions.php に追加してください。親テーマに直接追加するとアップデートで消える可能性があります。


//------------------------------------------------------------
// おみくじを表示(日本時間対応版)
//------------------------------------------------------------
function simple_omikuji_shortcode() {
    ob_start(); /* バッファリング開始 */
    ?>
    <!-- HTML構造 -->
    <div id="omikuji-box">
        <h3>今日の運勢</h3>
        <button id="drawOmikujiBtn">おみくじを引く</button>
        <p id="omikuji-result"></p>
    </div>

    <!-- JS制御(日本時間で1日1回制限) -->
    <script>
    document.addEventListener('DOMContentLoaded', function() {
        const btn = document.getElementById('drawOmikujiBtn'); /* ボタン要素を取得 */
        const result = document.getElementById('omikuji-result'); /* 結果表示用要素を取得 */
        if (!btn) return; /* ボタンが存在しない場合は終了 */

        /* --- 日本時間(JST)の日付を取得する関数 --- */
        function getTodayJST() {
            const now = new Date();
            const jstOffset = 9 * 60 * 60 * 1000; /* UTC+9時間 */
            const jstDate = new Date(now.getTime() + jstOffset);
            return jstDate.toISOString().slice(0, 10); /* YYYY-MM-DD形式で返す */
        }

        const saved = localStorage.getItem('todayOmikuji'); /* 保存済み結果を取得 */
        const savedDate = localStorage.getItem('todayOmikujiDate'); /* 保存日を取得 */
        const today = getTodayJST(); /* 日本時間で今日の日付を取得 */

        if (saved && savedDate === today) { /* すでに今日の結果がある場合 */
            result.textContent = '結果:' + saved; /* 結果を表示 */
            btn.textContent = '本日の運勢'; /* ボタン表示を変更 */
            btn.disabled = true; /* ボタン無効化 */
            return; /* 処理終了 */
        }

        btn.addEventListener('click', function() {
            if (btn.disabled) return; /* 二度押し防止 */
            const results = [ /* おみくじ結果一覧 */
                '今日は何しても上手くいきそう!',
                '小さな嬉しい出来事が訪れます',
                '甘いものにツキあり',
                '焦らず一息つくといい方向に',
                '笑顔で過ごせば幸せ倍増',
                '心を温める時間を大切に',
                '急がなくても大丈夫。流れに任せよう',
                '今日は穏やかに、周りに感謝を',
                '人の優しさに包まれる日',
                'ガチャ運MAX。今日のあなたは無敵'
            ];
            const random = results[Math.floor(Math.random() * results.length)]; /* ランダム選択 */
            result.textContent = '結果:' + random; /* 結果表示 */
            btn.textContent = '本日の運勢を確認済み'; /* ボタンテキスト変更 */
            btn.disabled = true; /* ボタンを無効化 */

            localStorage.setItem('todayOmikuji', random); /* 結果を保存 */
            localStorage.setItem('todayOmikujiDate', today); /* 日本時間で日付を保存 */
        });
    });
    </script>
    <?php
    return ob_get_clean(); /* 出力を返す */
}
add_shortcode('simple_omikuji', 'simple_omikuji_shortcode'); /* ショートコード登録 */
  

ウィジェット、記事内で表示する場合:


[simple_omikuji]

3 汎用CSS


/* -------------------------------------
 * おみくじボックス共通デザイン
 * ------------------------------------- */

#omikuji-box {
    background: #fff0f6; /** 背景を淡いピンクに **/
    border: 2px solid #e573a0; /** ボーダーをピンク系に **/
    border-radius: 10px; /** 角丸 **/
    padding: 20px; /** 内側余白 **/
    text-align: center; /** 中央寄せ **/
    max-width: 350px; /** 幅制限 **/
    margin: 20px auto; /** 中央寄せ余白 **/
    box-shadow: 0 2px 8px rgba(229, 115, 160, 0.25); /** ピンク系の影 **/
}

#omikuji-box h3 {
    margin-top: 0; /** タイトルの上余白を消す **/
    color: #d81b60; /** 濃いピンク文字 **/
    font-weight: bold; /** 太字 **/
}

#drawOmikujiBtn {
    padding: 10px 20px; /** ボタン余白 **/
    font-size: 16px; /** ボタン文字サイズ **/
    border: none; /** 枠線なし **/
    border-radius: 6px; /** 角丸ボタン **/
    background: #ec407a; /** ピンク背景 **/
    color: #fff; /** 白文字 **/
    cursor: pointer; /** ポインター表示 **/
    transition: 0.3s; /** ホバーアニメーション **/
}

#drawOmikujiBtn:hover {
    background: #d81b60; /** ホバー時は濃いピンク **/
}

#drawOmikujiBtn:disabled {
    background: #f8bbd0; /** 無効時の淡いピンク **/
    color: #fff; /** 白文字のまま **/
    cursor: default; /** 通常カーソルに戻す **/
    opacity: 0.8; /** 半透明化 **/
}

#omikuji-result {
    display: block; /** 独立したブロックとして扱う **/
    text-align: left; /** テキストを左寄せ **/
    margin-top: 15px; /** 上余白 **/
    font-weight: bold; /** 太字 **/
    color: #ad1457; /** ピンク系文字 **/
    margin-left: 10px; /** 左から10px離す **/
}
  
補足:
- この「おみくじ」のプレイ記録(結果と日付)は、ブラウザの localStorage に保存されています。
- 日付は日本時間(JST)で管理され、海外からのアクセスでも「日本時間の0時」でリセットされます。

次の操作を行うと、保存された記録が消えてリセットされます:
- ブラウザの設定で「サイトデータ」や「Cookie・キャッシュ」を削除した場合
- シークレットモード(プライベートブラウズ)でアクセスした場合
- 別のブラウザや別の端末でアクセスした場合
- localStorage を手動で削除した場合(開発者ツールで削除など)

※ 同じ端末・同じブラウザで通常閲覧している限り、記録は保持されます。
※ 記録が消えると「1日1回制限」もリセットされ、再びプレイ可能になります。

4 代用プラグイン

もしコードを直接追加するのが不安な場合は、Insert PHP Code Snippetプラグインを使用してショートコードを登録する方法もあります。
その場合は、上記のPHPコードを新規スニペットとして登録し、[simple_omikuji]を投稿本文に貼るだけで動作します。

5 まとめ

  • 日本時間(JST)で1日1回制限を正確に判定
  • シンプルなPHP+CSSで高速に動作
  • テーマを問わず導入可能(Lightning・Cocoon対応済み)