2026年8月27日

2026年8月27日

Events Managerのエラーを解決する方法

はじめに

Events Managerで作成したイベントが一覧ページに表示されない・イベント予約後に確認メールがユーザーに届かない・カスタムフィールド(追加質問)の入力値が保存されない・繰り返しイベントの一部だけが正しく表示されないといった問題は、プラグインの設定・メール送信設定・フックの実行順序が原因です。

症状・原因

  • 「イベント」投稿を公開してもフロントエンドのイベント一覧に表示されない
  • イベント予約が完了してもユーザーの受信箱に確認メールが届かない
  • 予約フォームのカスタムフィールドに入力した値がデータベースに保存されない
  • 毎週繰り返すイベントの特定日だけ時刻がずれて表示される

解決手順

ステップ1:Events Managerの状態を確認する

# Events Managerの設定確認
wp eval "
if (defined('EM_VERSION')) {
    echo 'Events Manager version: ' . EM_VERSION . PHP_EOL;
}

// イベント数を確認
\$events = EM_Events::get(['scope' => 'all', 'status' => false, 'limit' => 0]);
echo 'Total events (all statuses): ' . count(\$events) . PHP_EOL;

// 公開済みイベント
\$published = EM_Events::get(['scope' => 'all', 'status' => 1, 'limit' => 10]);
echo 'Published events: ' . count(\$published) . PHP_EOL;

foreach (array_slice(\$published, 0, 5) as \$event) {
    printf('  Event #%d: %s | Start: %s | Bookings: %s' . PHP_EOL,
        \$event->event_id,
        \$event->event_name,
        \$event->event_start_date . ' ' . \$event->event_start_time,
        \$event->event_rsvp ? 'enabled' : 'disabled'
    );
}

// 予約設定確認
echo 'Bookings enabled: ' . (get_option('dbem_rsvp_enabled') ? 'yes' : 'no') . PHP_EOL;
echo 'Email confirmation: ' . (get_option('dbem_bookings_email') ? 'yes' : 'no') . PHP_EOL;
echo 'Mail sender: ' . get_option('dbem_mail_sender_name') . ' <' . get_option('dbem_mail_sender_address') . '>' . PHP_EOL;
"

ステップ2:イベント表示とクエリをカスタマイズする

// functions.php: Events Manager表示設定

// ① イベント一覧のデフォルトスコープを設定
add_filter('em_events_get_default_search', function(array $args): array {
    // 未来・現在のイベントのみ表示
    $args['scope']  = 'future';
    $args['status'] = 1; // 公開済みのみ
    $args['limit']  = 10;
    $args['orderby'] = 'event_start_date';
    $args['order']   = 'ASC';
    return $args;
});

// ② カテゴリー別イベント表示
add_shortcode('my_events_by_category', function(array $atts): string {
    $atts = shortcode_atts([
        'category' => '',
        'limit'    => 5,
    ], $atts);

    $events = EM_Events::get([
        'scope'      => 'future',
        'status'     => 1,
        'category'   => $atts['category'],
        'limit'      => (int) $atts['limit'],
        'orderby'    => 'event_start_date',
        'order'      => 'ASC',
    ]);

    if (empty($events)) {
        return '<p>予定されているイベントはありません。</p>';
    }

    $output = '<ul class="event-list">';
    foreach ($events as $event) {
        $output .= sprintf(
            '<li><a href="%s">%s</a> — %s</li>',
            esc_url($event->get_permalink()),
            esc_html($event->event_name),
            esc_html($event->event_start_date)
        );
    }
    return $output . '</ul>';
});

// ③ 終了済みイベントをアーカイブに移動
add_action('em_event_save', function(EM_Event $event, bool $is_new): void {
    if (!$is_new && strtotime($event->event_end_date) < time()) {
        $event->set_status(1); // 公開を維持(アーカイブとして)
    }
}, 10, 2);

ステップ3:予約メールを修正する

// functions.php: Events Manager予約メール設定

// ① 予約確認メールの送信者を設定
add_filter('em_booking_email_admin_headers', function(array $headers): array {
    $headers['From'] = get_option('dbem_mail_sender_name')
        . ' <' . get_option('dbem_mail_sender_address') . '>';
    return $headers;
});

// ② 予約確認メールの内容をカスタマイズ
add_filter('em_booking_output_placeholder', function(string $output, EM_Booking $booking, string $placeholder): string {
    if ($placeholder === '#_BOOKINGQR') {
        // QRコード代わりに予約IDを強調表示
        return '<strong>予約ID: ' . $booking->booking_id . '</strong>';
    }
    return $output;
}, 10, 3);

// ③ 予約完了時にカスタム処理を実行
add_action('em_booking_add', function(EM_Booking $booking): void {
    // 予約者情報をカスタムメタに保存
    $person = $booking->get_person();
    update_user_meta(
        $person->ID,
        '_last_event_booking',
        [
            'event_id'   => $booking->event_id,
            'booked_at'  => current_time('mysql'),
            'booking_id' => $booking->booking_id,
        ]
    );

    // 管理者にSlack通知(オプション)
    error_log(sprintf('[EM] New booking #%d for event #%d by %s',
        $booking->booking_id,
        $booking->event_id,
        $person->display_name
    ));
});

// ④ 予約キャンセル時の処理
add_action('em_booking_cancelled', function(EM_Booking $booking): void {
    $event = $booking->get_event();
    error_log(sprintf('[EM] Booking #%d cancelled for event: %s',
        $booking->booking_id,
        $event->event_name
    ));
});

ステップ4:カスタムフィールドを管理する

// functions.php: カスタムフィールド保存

// ① 予約フォームにカスタムフィールドを追加
add_filter('em_booking_form_custom', function(string $html, EM_Event $event): string {
    // 参加目的の選択肢を追加
    $html .= '
    <p>
        <label for="em_purpose">参加目的 <span class="required">*</span></label>
        <select name="em_custom[purpose]" id="em_purpose" required>
            <option value="">-- 選択してください --</option>
            <option value="business">ビジネス目的</option>
            <option value="personal">個人的な興味</option>
            <option value="study">学習・研究</option>
        </select>
    </p>';
    return $html;
}, 10, 2);

// ② カスタムフィールドのバリデーション
add_filter('em_booking_validate', function(bool $result, EM_Booking $booking): bool {
    if (empty($_POST['em_custom']['purpose'])) {
        $booking->add_error('参加目的を選択してください。');
        return false;
    }
    return $result;
}, 10, 2);

// ③ カスタムフィールドの値を保存
add_action('em_booking_add_meta', function(EM_Booking $booking): void {
    if (!empty($_POST['em_custom']['purpose'])) {
        $booking->booking_meta['purpose'] = sanitize_text_field($_POST['em_custom']['purpose']);
        $booking->save_meta();
    }
});

ステップ5:繰り返しイベントの問題を解決する

# 繰り返しイベントの再生成
wp eval "
// 特定の繰り返しイベントを確認
\$event_id = 50; // 繰り返しイベントの親ID
\$event = em_get_event(\$event_id);

if (!\$event) {
    echo 'Event not found' . PHP_EOL;
    exit;
}

echo 'Event: ' . \$event->event_name . PHP_EOL;
echo 'Recurrence: ' . (\$event->is_recurrence() ? 'yes' : 'no') . PHP_EOL;

if (\$event->is_recurrence()) {
    // 繰り返しイベントの全インスタンスを取得
    \$children = EM_Events::get([
        'recurrence_id' => \$event->recurrence_id,
        'scope'         => 'all',
        'status'        => false,
        'limit'         => 0,
    ]);

    echo 'Total instances: ' . count(\$children) . PHP_EOL;

    foreach (array_slice(\$children, 0, 5) as \$child) {
        printf('  #%d: %s %s ~ %s' . PHP_EOL,
            \$child->event_id,
            \$child->event_start_date,
            \$child->event_start_time,
            \$child->event_end_time
        );
    }

    // タイムゾーン問題の確認
    echo 'WP timezone: ' . wp_timezone_string() . PHP_EOL;
    echo 'EM timezone: ' . get_option('dbem_timezone_name', 'not set') . PHP_EOL;
}
"

注意事項

  • Events Managerの「スコープ」設定はデフォルトで「将来のイベント」になっています。過去のイベントを表示したい場合はショートコードでscope="all"を指定するか、プラグイン設定の「デフォルトスコープ」を変更してください
  • 予約メールが届かない場合はまずWordPressのメール送信設定を確認してください。「WP Mail SMTP」などのSMTPプラグインと組み合わせることで信頼性が向上します
  • 繰り返しイベントのタイムゾーンがずれる場合は、WordPressの設定とEvents Managerの設定のタイムゾーンが一致しているか確認してください。サーバーのタイムゾーンとWordPressの設定が異なる場合に問題が起きやすいです

まとめ

Events Manager修復は①EM_Events::get()でイベント一覧・予約設定・メール設定を確認、②em_events_get_default_searchフィルターでデフォルト表示条件を設定・em_event_saveフックでイベント保存時の処理をカスタマイズ、③em_booking_email_admin_headersフィルターで送信者設定・em_booking_addフックで予約完了時の処理追加、④em_booking_form_customフィルターでカスタムフィールド追加・em_booking_validateでバリデーション・em_booking_add_metaで保存、⑤繰り返しイベントのrecurrence_idでインスタンス確認・タイムゾーン設定の一致を確認する手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ