Initial release of Eventbrite for The Events Calendar (v1.0.0)

Bidirectional sync between Eventbrite and The Events Calendar, with
WooCommerce ticket purchasing that bypasses Eventbrite's processing
fees by registering buyers as free attendees via API. Includes venue/
organizer sync, QR code ticket generation, attendee management with
CSV export, scheduled sync via WP-Cron, and real-time Eventbrite
webhooks.
This commit is contained in:
Laurence Horrocks-Barlow 2026-05-17 08:48:04 +01:00
commit f3bc795d9a
15 changed files with 3132 additions and 0 deletions

View file

@ -0,0 +1,77 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
final class EB4TEC_QR_Code {
public function generate( string $data, int $size = 0 ): string|WP_Error {
if ( $size <= 0 ) {
$size = (int) get_option( 'eb4tec_qr_size', 200 );
}
$hash = md5( $data );
$uploads = wp_upload_dir();
$dir = trailingslashit( $uploads['basedir'] ) . 'eb4tec-qr/';
$file = $dir . $hash . '.png';
$url = trailingslashit( $uploads['baseurl'] ) . 'eb4tec-qr/' . $hash . '.png';
if ( file_exists( $file ) ) {
return $url;
}
// Create directory if needed.
if ( ! wp_mkdir_p( $dir ) ) {
return new WP_Error( 'eb4tec_qr_dir', __( 'Could not create QR code directory.', 'eb4tec' ) );
}
// Fetch from Google Chart API (no API key required for QR endpoint).
$api_url = add_query_arg( [
'cht' => 'qr',
'chs' => "{$size}x{$size}",
'chl' => rawurlencode( $data ),
'choe' => 'UTF-8',
], 'https://chart.googleapis.com/chart' );
$response = wp_remote_get( $api_url, [ 'timeout' => 15 ] );
if ( is_wp_error( $response ) ) {
return $response;
}
$code = wp_remote_retrieve_response_code( $response );
if ( $code !== 200 ) {
return new WP_Error( 'eb4tec_qr_fetch', __( 'QR code generation failed.', 'eb4tec' ), [ 'status' => $code ] );
}
$body = wp_remote_retrieve_body( $response );
// phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents
if ( false === file_put_contents( $file, $body ) ) {
return new WP_Error( 'eb4tec_qr_write', __( 'Could not save QR code image.', 'eb4tec' ) );
}
return $url;
}
public function get_attendee_qr_data( string $attendee_id, string $order_id, string $event_id ): string {
return "EB4TEC:{$attendee_id}:{$order_id}:{$event_id}";
}
public function render_qr_html( string $url, string $attendee_id = '', int $size = 0 ): string {
if ( $size <= 0 ) {
$size = (int) get_option( 'eb4tec_qr_size', 200 );
}
$alt = $attendee_id
? sprintf( __( 'Ticket QR code for attendee %s', 'eb4tec' ), esc_attr( $attendee_id ) )
: __( 'Ticket QR code', 'eb4tec' );
return sprintf(
'<img src="%s" alt="%s" width="%d" height="%d" class="eb4tec-qr-code" style="display:block;margin:8px 0;">',
esc_url( $url ),
esc_attr( $alt ),
$size,
$size
);
}
}