// Prévisualisation des données add_action('wp_ajax_preview_ticket_export', function () { if (!current_user_can('manage_options')) wp_send_json_error('Accès refusé'); if (!wp_verify_nonce($_GET['_wpnonce'] ?? '', 'export_billets')) { wp_die('Erreur de sécurité : Nonce invalide'); } $event_id = intval($_GET['event_id'] ?? 0); $ticket_id = intval($_GET['ticket_id'] ?? 0); if (!$event_id || !$ticket_id) { echo '

Aucun événement ou billet sélectionné.

'; wp_die(); } if (!class_exists('Tribe__Tickets_Plus__Main')) { echo '

Le plugin Event Tickets Plus est requis.

'; wp_die(); } $fields = Tribe__Tickets_Plus__Main::instance()->meta()->get_meta_fields_for_event($event_id); $attendees = Tribe__Tickets__Tickets::get_event_attendees($event_id); $headers = ['Nom du billet', 'Nom participant', 'Email', 'Date de commande']; foreach ($fields as $field) { $headers[] = $field['label']; } echo ''; foreach ($headers as $head) { echo ''; } echo ''; $count = 0; foreach ($attendees as $attendee) { if ((int)$attendee['ticket_id'] !== $ticket_id) continue; if ($count++ >= 10) break; echo ''; echo ''; echo ''; echo ''; $date = isset($attendee['purchase_time']) ? date('Y-m-d H:i:s', strtotime($attendee['purchase_time'])) : ''; echo ''; foreach ($fields as $field) { $key = $field['slug']; $value = $attendee['meta'][$key] ?? ''; if (is_array($value)) $value = implode(', ', $value); echo ''; } echo ''; } if ($count === 0) { echo ''; } echo '
' . esc_html($head) . '
' . esc_html($attendee['ticket'] ?? '') . '' . esc_html($attendee['full_name'] ?? '') . '' . esc_html($attendee['email'] ?? '') . '' . esc_html($date) . '' . esc_html($value) . '
Aucun participant pour ce billet.
'; wp_die(); }); add_action('wp_ajax_export_preview_excel', function () { if (!current_user_can('manage_options')) wp_die('Non autorisé'); if (!wp_verify_nonce($_GET['_wpnonce'] ?? '', 'export_billets')) { wp_die('Erreur de sécurité : Nonce invalide'); } $event_id = intval($_GET['event_id'] ?? 0); $ticket_id = intval($_GET['ticket_id'] ?? 0); $start_date = sanitize_text_field($_GET['start_date'] ?? ''); $end_date = sanitize_text_field($_GET['end_date'] ?? ''); $order_status = sanitize_text_field($_GET['order_status'] ?? ''); if (!class_exists('Tribe__Tickets_Plus__Main')) { wp_die('Event Tickets Plus requis.'); } $fields = Tribe__Tickets_Plus__Main::instance()->meta()->get_meta_fields_for_event($event_id); $attendees = Tribe__Tickets__Tickets::get_event_attendees($event_id); require_once ABSPATH . 'wp-admin/includes/class-pclzip.php'; require_once ABSPATH . 'wp-admin/includes/file.php'; $headers = ['Nom du billet', 'Nom participant', 'Email', 'Date de commande']; foreach ($fields as $field) { $headers[] = $field['label']; } // Créer le fichier Excel $wb = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); $sheet = $wb->getActiveSheet(); $sheet->fromArray($headers, NULL, 'A1'); $row_num = 2; foreach ($attendees as $attendee) { if ((int)$attendee['ticket_id'] !== $ticket_id) continue; $purchase_time = isset($attendee['purchase_time']) ? strtotime($attendee['purchase_time']) : 0; if ($start_date && $purchase_time < strtotime($start_date . ' 00:00:00')) continue; if ($end_date && $purchase_time > strtotime($end_date . ' 23:59:59')) continue; if ($order_status && isset($attendee['order_id'])) { $order = wc_get_order($attendee['order_id']); if (!$order || $order->get_status() !== $order_status) continue; } $row = [ $attendee['ticket'] ?? '', $attendee['full_name'] ?? '', $attendee['email'] ?? '', date('Y-m-d H:i:s', $purchase_time), ]; foreach ($fields as $field) { $key = $field['slug']; $value = $attendee['meta'][$key] ?? ''; if (is_array($value)) $value = implode(', ', $value); $row[] = $value; } $sheet->fromArray($row, NULL, 'A' . $row_num++); } $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($wb); $tmp_file = tempnam(sys_get_temp_dir(), 'export_preview_') . '.xlsx'; $writer->save($tmp_file); header("Content-Disposition: attachment; filename=export_preview.xlsx"); header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); readfile($tmp_file); unlink($tmp_file); exit; }); // Mode debug - afficher les erreurs dans la page admin si activé add_action('admin_footer', function () { if (!current_user_can('manage_options')) return; if (!isset($_GET['page']) || $_GET['page'] !== 'export_billets_page') return; echo '

🛠 Debug Log

';

    $log_file = WP_CONTENT_DIR . '/debug.log';
    if (file_exists($log_file)) {
        $lines = file($log_file);
        $filtered = array_slice($lines, -50); // Dernières 50 lignes
        foreach ($filtered as $line) {
            echo esc_html($line);
        }
    } else {
        echo 'Aucun fichier debug.log trouvé.';
    }

    echo '
'; }); // Mode développeur : inspection avancée add_action('admin_footer', function () { if (!current_user_can('manage_options')) return; if (!isset($_GET['page']) || $_GET['page'] !== 'export_billets_page') return; echo '

🔬 Developer Dump

'; $event_id = isset($_POST['event_id']) ? intval($_POST['event_id']) : 0; $ticket_id = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0; if ($event_id && $ticket_id) { echo '
Infos événement (#' . $event_id . ')
';
        print_r(get_post($event_id));
        echo '
'; echo '
Infos billet (#' . $ticket_id . ')
';
        print_r(get_post($ticket_id));
        echo '
'; if (class_exists('Tribe__Tickets__Tickets')) { $attendees = Tribe__Tickets__Tickets::get_event_attendees($event_id); echo '
🧾 Données brutes des participants
';
            print_r(array_slice($attendees, 0, 5)); // On affiche 5 entrées max
            echo '
'; } } else { echo '

Remplissez le formulaire pour activer l’inspection technique.

'; } echo '
'; }); // Gérer l’enregistrement des options avancées add_action('admin_init', function () { if (isset($_POST['export_billets_advanced_nonce']) && current_user_can('manage_options')) { update_option('export_billets_debug', isset($_POST['enable_debug']) ? '1' : '0'); update_option('export_billets_devtools', isset($_POST['enable_devtools']) ? '1' : '0'); } }); // Rendu dynamique du panneau d’options avancées add_action('admin_footer', function () { if (!current_user_can('manage_options')) return; if (!isset($_GET['page']) || $_GET['page'] !== 'export_billets_page') return; $debug_enabled = get_option('export_billets_debug', '0') === '1' ? 'checked' : ''; $devtools_enabled = get_option('export_billets_devtools', '0') === '1' ? 'checked' : ''; $html = '\n
\n

⚙️ Options avancées

\n
\n \n
\n

\n \n
\n'; $html = str_replace('__NONCE__', wp_create_nonce('export_billets_options'), $html); printf($html, $debug_enabled, $devtools_enabled); }); add_action('admin_footer', function () { if (!current_user_can('manage_options')) return; if (!isset($_GET['page']) || $_GET['page'] !== 'export_billets_page') return; if (get_option('export_billets_debug', '0') === '1') { echo '

🛠 Debug Log

';
        $log_file = WP_CONTENT_DIR . '/debug.log';
        if (file_exists($log_file)) {
            $lines = file($log_file);
            $filtered = array_slice($lines, -50);
            foreach ($filtered as $line) {
                echo esc_html($line);
            }
        } else {
            echo 'Aucun fichier debug.log trouvé.';
        }
        echo '
'; } if (get_option('export_billets_devtools', '0') === '1') { echo '

🔬 Developer Dump

'; $event_id = isset($_POST['event_id']) ? intval($_POST['event_id']) : 0; $ticket_id = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0; if ($event_id && $ticket_id) { echo '
Infos événement (#' . $event_id . ')
';
            print_r(get_post($event_id));
            echo '
'; echo '
Infos billet (#' . $ticket_id . ')
';
            print_r(get_post($ticket_id));
            echo '
'; if (class_exists('Tribe__Tickets__Tickets')) { $attendees = Tribe__Tickets__Tickets::get_event_attendees($event_id); echo '
🧾 Données brutes des participants
';
                print_r(array_slice($attendees, 0, 5));
                echo '
'; } } else { echo '

Remplissez le formulaire pour activer l’inspection technique.

'; } echo '
'; } }); // Ajouter une sous-page admin pour les vérifications de dépendances add_action('admin_menu', function () { add_submenu_page( 'export_billets_page', 'Vérification des dépendances', 'Dépendances', 'manage_options', 'export_billets_dependencies', 'render_export_billets_dependencies_page' ); }); // Affichage de la page de dépendances function render_export_billets_dependencies_page() { echo '

🔗 Vérification des dépendances

'; $requirements = [ 'PHP >= 7.4' => version_compare(PHP_VERSION, '7.4', '>='), 'WordPress >= 5.8' => version_compare(get_bloginfo('version'), '5.8', '>='), 'WooCommerce actif' => class_exists('WooCommerce'), 'Event Tickets actif' => class_exists('Tribe__Tickets__Tickets'), 'Event Tickets Plus actif' => class_exists('Tribe__Tickets_Plus__Main'), 'PhpSpreadsheet disponible' => class_exists('\PhpOffice\PhpSpreadsheet\Spreadsheet'), ]; echo ''; foreach ($requirements as $label => $ok) { echo ''; echo ''; echo ''; echo ''; } echo '
DépendanceStatut
' . esc_html($label) . '' . ($ok ? '✅ OK' : '❌ Manquant') . '
'; echo '
'; } GnOlogiK is under construction
Mad Designer at work

Désolé, nous travaillons actuellement sur le site

Merci pour votre patience. Nous travaillons actuellement sur le site et nous reviendrons rapidement.